2016-08-18 1 views
0

ich in ein interessantes Problem lief Wenn auf französisch Text Der Versuch wird in Token aufgeteilt mit NLTK (Version 3.1, Python 2.7). Hier ist der Code-Schnipsel ich verwende.UTF8-Codierung verloren nach-tokenising NLTK und mit Python 2.7

#python 2.7 

from __future__ import division 
import nltk, re, pprint 

f= open('test.txt') 

raw = f.read() 
print "got it!" 
print type(raw) 

ucoderaw=raw.decode('utf-8') 
print ucoderaw 

tokens = nltk.word_tokenize(ucoderaw) 
print type(tokens) 
words = [w.lower() for w in tokens] 
print type(words) 
vocab = sorted(set(words)) 
print "Tokens" 

Das Papier enthält einen französisch Text:

ich Grund zu der Annahme, dass Herr Voltaire wird es nicht bereuen, dass sein Manuskript zu sehen, die er den Titel Zusammenfassung von Universalgeschichte von Karl dem Großen an Karl V., und er sagte, zwischen Händen von dreißig Individuen, zwischen Mine fallen. Er weiß er mich von den 1742 Jahren geschmeichelt hatte, anlässlich sein Jahrhundert von Louis XIV, die ich im Jahr 1750 aufgegeben, weil er mir so in Potsdam gesagt, wo j ‚war, wie er es gedruckt sich auf eigene Kosten . So ist es hier nur zu sagen, wie das ist Zusammenfassung in meine Hände fiel, hier.

Bei meiner Rückkehr nach Paris, im Juni dieses 1753 Jahre, habe ich aufgehört zu Brüssel, wo ich die Ehre hatte, einen Verdienst Person zu sehen, wer der Eigentümer ist ich ihm zeigte, und ich habe auch alle erdenklichen Lob, sowie die Geschichte des Manuskripts, und alles, was zu während eines Warnung geschehen war, die in der eingeführt wird zweiten Ausgabe für Juni 1752 von Mercure de France, und im selben Jahr Épilogueur 31. Juli wiederholt, mit Antwort , die dort gemacht wurden, und das ist in dem gleichen Épilogueur 7 August nach Alle nutzlosen Dingen hier zu beachten, haben aber bestimmten mich dann die Hände dieses galanten Mannes zu kaufen Handwritten nach dem Autor angeboten, er überzeugte auch war in der Tat Herr Voltaire; sein Genie, sein Stil und vor allem Rechtschreibung darin überall. Habe ich es , weil bekannt ist, dass das Publikum die Mühe alles in der Welt hat , um sich daran zu gewöhnen; und das ist, was der Autor gefragt wird Vorwand zu wollen. [1]

Ich habe immer noch, dass die letzte Periode dieses Buch weisen darauf hin, es scheint, dass es das Ende dieser Zusammenfassung ist, die Karl VII, König von Frankreich, anstatt den Autor in endet verspricht der Titel bis Kaiser Karl V.. So wird vermutet, dass was folgen sollte diese anderen Teil der Geschichte ist, dass die Kunst betrifft, wäre es zu hoffen, dass Herr Voltaire retrouvât oder, besser gesagt, er das würde später Freude in öffentlichen und Buchhändler war bereit, es wieder zu tun, und schieben, bis Alter von Louis XIV, um seinen Plan zu erfüllen, und uns eine Geschichte zu geben.

Beim Versuch, diesen Text tokenise tokens = nltk.word_tokenize(ucoderaw)

verwenden und dann anschließend aus den Token gedruckt wird unter Verwendung von sorted(set(words))

I Ausganges mit gebrochener UTF-8-Codierung:

u‘ autant ', u'author', u'atres ', u'aux', u'available ', u'avait', u'avant ', u'avec', u'avertissement ', u'avoir', u 'avons', du'away ', u'ayant', u'barbare 'u'beaucoup', u'biblioth \ xe8que 'u'bien', u'bnf/gallica 'u'bornais', u'bruxelles', u'but', u'by‘, u "c'est" u'capet 'u'carri \ xe8re', u'ce 'u'cela', u'ces', u'cet 'u'cette', u'ceux‘ , u'chang \ xe9' , u'chaos', u'character 'u'charger', u'charlemagne 'u'charlequint', u'charles-quint_‘, u'chartes', u'chez 'u'chine', u'choses', u'chronologie 'u'chronologiques', u'chr \ xe9tienne', u'cl \ xf4ture‘

wo die korrekte Ausgabe enthalten sollte Akzente dh bibliothèque und nicht Biblioth \ xe8que

Ich habe versucht, herauszufinden, wie dieses Problem zu beheben, kurz die Ausgabe in eine Datei zu speichern und ein anderes Programm zu schreiben \ xe8 mit è und so weiter und so fort zu ersetzen.

Gibt es eine einfachere Methode?

EDIT: Nicht die sauberste Lösung, aber ich fand, dass durch tokenising und dann mit der richtigen Codierung, die Ausgabe in eine Datei zu speichern ich (vor allem den Ausgang benötigt werden):

#python 2.7 

#-*- coding: utf-8 -*- 

from __future__ import division 
import nltk, re, pprint 

f= open('test.txt') 

raw = f.read() 


print "got it!" 

#print raw 

print type(raw) 

#encode as utf8 before moving on. 
ucoderaw=raw.decode('utf-8') 

tokens = nltk.word_tokenize(ucoderaw) 

print type(tokens) 

words = [w.lower() for w in tokens] 

print type(words) 

vocab = sorted(set(words)) 

print "encoded raw input is" 
print ucoderaw 


#     GET TOKENS 

print vocab 
#write to file with correct encoding to "fix" the problem 
output_file = open('output.txt', 'w') 

print len(vocab) 
for words in vocab: 
    output_file.write(words.encode('utf-8') + "\n") 
+0

Kurze Antwort: Verwenden 'python3' =) Längere Antwort: nicht verwenden 'open', benutze' io.open ('filename.txt', 'r', encoding = 'utf8') 'Bessere Antwort: siehe http://nedbatchelder.com/text/unipain.html und dann benutze' python3 '. – alvas

Antwort

0

Erstens siehe http://nedbatchelder.com/text/unipain.html

Dann versuchen Python3 zu verwenden, anstatt Python2 für die Textverarbeitung, es macht Ihnen das Leben viel einfacher =)

F ndlich, unabhängig von PY3 oder Py2, mit io.open statt open eine gute Praxis ist, so dass Ihr Code sowohl über PY3 und Py2 funktioniert:

import io 
from collections import Counter 
import nltk 

# Try to open files within a context, see 
# https://www.python.org/dev/peps/pep-0343/ and 
# http://effbot.org/zone/python-with-statement.htm 
with io.open('test.txt', 'r', encoding='utf8') as fin: 
    word_counts = Counter(word_tokenize(fin.read())) 
    # List of top most common words. 
    print word_counts.most_common() 
    # Sorted by counts 
    print word_counts.most_common(len(word_counts)) 
    # Sorted alphabetically 
    print sorted(word_counts.keys())