Ich verwende NLTK, um kmeans-Clustering für meine Textdatei durchzuführen, in der jede Zeile als Dokument betrachtet wird. So sieht meine Textdatei beispielsweise so aus:
belong finger death punch <br>
hasty <br>
mike hasty walls jericho <br>
jägermeister rules <br>
rules bands follow performing jägermeister stage <br>
approach
Der Demo-Code, den ich ausführen möchte, lautet:
import sys
import numpy
from nltk.cluster import KMeansClusterer, GAAClusterer, euclidean_distance
import nltk.corpus
from nltk import decorators
import nltk.stem
stemmer_func = nltk.stem.EnglishStemmer().stem
stopwords = set(nltk.corpus.stopwords.words('english'))
@decorators.memoize
def normalize_word(word):
return stemmer_func(word.lower())
def get_words(titles):
words = set()
for title in job_titles:
for word in title.split():
words.add(normalize_word(word))
return list(words)
@decorators.memoize
def vectorspaced(title):
title_components = [normalize_word(word) for word in title.split()]
return numpy.array([
word in title_components and not word in stopwords
for word in words], numpy.short)
if __name__ == '__main__':
filename = 'example.txt'
if len(sys.argv) == 2:
filename = sys.argv[1]
with open(filename) as title_file:
job_titles = [line.strip() for line in title_file.readlines()]
words = get_words(job_titles)
# cluster = KMeansClusterer(5, euclidean_distance)
cluster = GAAClusterer(5)
cluster.cluster([vectorspaced(title) for title in job_titles if title])
# NOTE: This is inefficient, cluster.classify should really just be
# called when you are classifying previously unseen examples!
classified_examples = [
cluster.classify(vectorspaced(title)) for title in job_titles
]
for cluster_id, title in sorted(zip(classified_examples, job_titles)):
print cluster_id, title
(die auch hier zu finden sind )
Der Fehler, den ich erhalte, ist folgender:
Traceback (most recent call last):
File "cluster_example.py", line 40, in
words = get_words(job_titles)
File "cluster_example.py", line 20, in get_words
words.add(normalize_word(word))
File "", line 1, in
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize
result = func(*args)
File "cluster_example.py", line 14, in normalize_word
return stemmer_func(word.lower())
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/snowball.py", line 694, in stem
word = (word.replace(u"\u2019", u"\x27")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128)
Was passiert hier?
python
python-2.7
user2602812
quelle
quelle
decode
bleibt die Methode auch in Python 3 die bevorzugte Methode, um eine Byte-Zeichenfolge in eine Unicode-Zeichenfolge zu dekodieren. (Obwohl die Typen in meiner Antwort nicht richtig für Python 3 - für Python 3, wir versuchen , zu konvertieren vonbytes
zustr
anstatt ausstr
zuunicode
.)Das funktioniert gut für mich.
Sie können eine dritte Parametercodierung hinzufügen , um sicherzustellen, dass der Codierungstyp 'utf-8' ist.
Hinweis: Diese Methode funktioniert in Python3 einwandfrei. Ich habe sie in Python2.7 nicht ausprobiert.
quelle
TypeError: 'encoding' is an invalid keyword argument for this function
TypeError: 'encoding' is an invalid keyword argument for this function
Dies funktioniert gut:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
Bei mir gab es ein Problem mit der Terminalcodierung. Das Hinzufügen von UTF-8 zu .bashrc löste das Problem:
Vergessen Sie nicht, .bashrc anschließend neu zu laden:
quelle
export LC_ALL=C.UTF-8
auf Ubuntu 18.04.3 und Python 3.6.8 verwenden. Ansonsten hat dies mein Problem gelöst, danke.Sie können dies auch versuchen:
quelle
Unter Ubuntu 18.04 mit Python3.6 habe ich das Problem gelöst , indem ich beides getan habe:
und wenn Sie das Tool als Befehlszeile ausführen:
Beachten Sie, dass Sie in Python2.7 anders vorgehen müssen. Zuerst müssen Sie die Standardcodierung festlegen:
und um die Datei zu laden, müssen Sie
io.open
die Codierung festlegen:Sie müssen die Umgebung noch exportieren
quelle
Ich habe diesen Fehler beim Versuch, ein Python-Paket in einem Docker-Container zu installieren. Für mich war das Problem, dass das Docker-Image nicht
locale
konfiguriert war. Das Hinzufügen des folgenden Codes zur Docker-Datei löste das Problem für mich.quelle
So finden Sie JEDEN und ALLE Unicode-Fehler ... Verwenden Sie den folgenden Befehl:
Fand meine in
Mit
shed
fand ich die beleidigende Sequenz. Es stellte sich als Editorfehler heraus.quelle
Sie können dies versuchen, bevor Sie einen
job_titles
String verwenden:quelle
Für Python 3 wäre die Standardcodierung "utf-8". Die folgenden Schritte werden in der Basisdokumentation vorgeschlagen: https://docs.python.org/2/library/csv.html#csv-examples im Falle eines Problems
Erstellen Sie eine Funktion
Verwenden Sie dann die Funktion im Lesegerät, z
quelle
python3x oder höher
Datei im Byte-Stream laden:
body = '' für offene Zeilen ('website / index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body
Verwenden Sie die globale Einstellung:
import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')
quelle
Verwenden Sie
open(fn, 'rb').read().decode('utf-8')
statt nuropen(fn).read()
quelle