J'utilise NLTK pour effectuer un clustering kmeans sur mon fichier texte dans lequel chaque ligne est considérée comme un document. Par exemple, mon fichier texte ressemble à ceci:
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
Maintenant, le code de démonstration que j'essaie d'exécuter est le suivant:
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
(que vous pouvez également trouver ici )
L'erreur que je reçois est la suivante:
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)
Que se passe-t-il ici?
python
python-2.7
user2602812
la source
la source
decode
méthode reste le moyen préféré pour décoder une chaîne d'octets en une chaîne Unicode. (Bien que les types de ma réponse ne soient pas appropriés pour Python 3 - pour Python 3, nous essayons de convertir debytes
versstr
plutôt que destr
versunicode
.)Cela fonctionne bien pour moi.
Vous pouvez ajouter un troisième encodage de paramètre pour vous assurer que le type d'encodage est 'utf-8'
Remarque: cette méthode fonctionne très bien en Python3, je ne l'ai pas essayée en Python2.7.
la source
TypeError: 'encoding' is an invalid keyword argument for this function
TypeError: 'encoding' is an invalid keyword argument for this function
Cela fonctionne bien:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
Pour moi, il y avait un problème avec le codage du terminal. L'ajout de UTF-8 à .bashrc a résolu le problème:
N'oubliez pas de recharger .bashrc par la suite:
la source
export LC_ALL=C.UTF-8
sur Ubuntu 18.04.3 et Python 3.6.8. Sinon, cela a résolu mon problème, merci.Vous pouvez également essayer ceci:
la source
Sur Ubuntu 18.04 en utilisant Python3.6, j'ai résolu le problème en faisant les deux:
et si vous exécutez l'outil en ligne de commande:
Notez que si vous êtes en Python2.7, vous devez gérer cela différemment. Vous devez d'abord définir l'encodage par défaut:
puis pour charger le fichier, vous devez utiliser
io.open
pour définir l'encodage:Vous devez toujours exporter l'environnement
la source
J'ai eu cette erreur en essayant d'installer un package python dans un conteneur Docker. Pour moi, le problème était que l'image du docker n'avait pas de
locale
fichier. L'ajout du code suivant au Dockerfile a résolu le problème pour moi.la source
Pour rechercher TOUTES les erreurs Unicode liées ... À l'aide de la commande suivante:
J'ai trouvé le mien dans
En utilisant
shed
, j'ai trouvé la séquence offensante. Cela s'est avéré être une erreur de l'éditeur.la source
Vous pouvez essayer ceci avant d'utiliser la
job_titles
chaîne:la source
Pour python 3, l'encodage par défaut serait "utf-8". Les étapes suivantes sont suggérées dans la documentation de base: https://docs.python.org/2/library/csv.html#csv-examples en cas de problème
Créer une fonction
Ensuite, utilisez la fonction à l'intérieur du lecteur, par exemple
la source
python3x ou supérieur
charger le fichier dans le flux d'octets:
body = '' pour les lignes en open ('website / index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body
utiliser le paramètre global:
import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')
la source
Utilisez
open(fn, 'rb').read().decode('utf-8')
au lieu de simplementopen(fn).read()
la source