Używam NLTK do klastrowania kmeans na moim pliku tekstowym, w którym każda linia jest traktowana jako dokument. Na przykład mój plik tekstowy wygląda mniej więcej tak:
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
Teraz kod demonstracyjny, który próbuję uruchomić, jest następujący:
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
(które można również znaleźć tutaj )
Otrzymuję następujący błąd:
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)
Co tu się dzieje?
python
python-2.7
user2602812
źródło
źródło
decode
metoda ta pozostaje preferowanym sposobem dekodowania ciągu bajtów do łańcucha Unicode. (Chociaż typy w mojej odpowiedzi nie są odpowiednie dla Pythona 3 - w przypadku Pythona 3 próbujemy przekonwertować zbytes
na,str
a nie zstr
naunicode
.)U mnie to działa dobrze.
Możesz dodać kodowanie trzeciego parametru, aby upewnić się, że typ kodowania to „utf-8”
Uwaga: ta metoda działa dobrze w Pythonie3, nie próbowałem jej w Pythonie2.7.
źródło
TypeError: 'encoding' is an invalid keyword argument for this function
TypeError: 'encoding' is an invalid keyword argument for this function
Działa dobrze:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
U mnie wystąpił problem z kodowaniem terminala. Dodanie UTF-8 do .bashrc rozwiązało problem:
Nie zapomnij później ponownie załadować .bashrc:
źródło
export LC_ALL=C.UTF-8
na Ubuntu 18.04.3 i Python 3.6.8. W przeciwnym razie rozwiązało to mój problem, dzięki.Możesz także spróbować:
źródło
Kiedy na Ubuntu 18.04 używam Python3.6 , rozwiązałem problem, robiąc oba:
a jeśli uruchamiasz narzędzie jako wiersz poleceń:
Zauważ, że jeśli korzystasz z Pythona2.7 , musisz zrobić to inaczej. Najpierw musisz ustawić domyślne kodowanie:
a następnie wczytać plik, którego musisz użyć
io.open
do ustawienia kodowania:Nadal musisz wyeksportować plik env
źródło
Otrzymałem ten błąd podczas próby zainstalowania pakietu Pythona w kontenerze Dockera. Dla mnie problem polegał na tym, że obraz dockera nie miał
locale
skonfigurowanego pliku . Dodanie następującego kodu do pliku Dockerfile rozwiązało problem.źródło
Aby znaleźć JAKIEKOLWIEK i WSZYSTKIE błędy związane z Unicode ... Używając następującego polecenia:
Znalazłem moje w
Używając
shed
, znalazłem obraźliwą sekwencję. Okazało się, że był to błąd redaktora.źródło
Możesz spróbować tego przed użyciem
job_titles
ciągu:źródło
W przypadku Pythona 3 domyślne kodowanie to „utf-8”. Poniższe kroki są sugerowane w podstawowej dokumentacji: https://docs.python.org/2/library/csv.html#csv-examples w przypadku jakiegokolwiek problemu
Utwórz funkcję
Następnie użyj funkcji wewnątrz czytnika, np
źródło
python3x lub nowszy
załaduj plik w strumieniu bajtów:
body = '' for lines in open ('website / index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body
użyj ustawienia globalnego:
import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')
źródło
Użyj
open(fn, 'rb').read().decode('utf-8')
zamiast po prostuopen(fn).read()
źródło