Estou usando o NLTK para executar o agrupamento de kmeans no meu arquivo de texto no qual cada linha é considerada como um documento. Por exemplo, meu arquivo de texto é mais ou menos assim:
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
Agora, o código de demonstração que estou tentando executar é o seguinte:
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 também pode ser encontrada aqui )
O erro que recebo é este:
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)
O que esta acontecendo aqui?
python
python-2.7
user2602812
fonte
fonte
decode
método continua sendo a maneira preferida de decodificar uma sequência de bytes em uma sequência Unicode. (Embora, os tipos na minha resposta não são adequadas para Python 3 - para Python 3, estamos tentando converter debytes
questr
ao invés destr
paraunicode
.)Este trabalho é bom para mim.
Você pode adicionar uma terceira codificação de parâmetro para garantir que o tipo de codificação seja 'utf-8'
Nota: este método funciona bem no Python3, não tentei no Python2.7.
fonte
TypeError: 'encoding' is an invalid keyword argument for this function
TypeError: 'encoding' is an invalid keyword argument for this function
Funciona bem:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
Para mim, houve um problema com a codificação do terminal. A adição de UTF-8 ao .bashrc resolveu o problema:
Não se esqueça de recarregar .bashrc depois:
fonte
export LC_ALL=C.UTF-8
no Ubuntu 18.04.3 e Python 3.6.8. Caso contrário, isso resolveu meu problema, obrigado.Você pode tentar isso também:
fonte
Quando no Ubuntu 18.04 usando Python3.6 , resolvi o problema fazendo os dois:
e se você estiver executando a ferramenta como linha de comando:
Observe que, se você estiver no Python2.7, precisará lidar com isso de maneira diferente. Primeiro você precisa definir a codificação padrão:
e, em seguida, para carregar o arquivo, você deve usar
io.open
para definir a codificação:Você ainda precisa exportar o ambiente
fonte
Eu recebi esse erro ao tentar instalar um pacote python em um contêiner do Docker. Para mim, o problema era que a imagem do docker não tinha um
locale
configurado. Adicionar o seguinte código ao Dockerfile resolveu o problema para mim.fonte
Para encontrar QUALQUER e TODOS os erros unicode relacionados ... Usando o seguinte comando:
Mina encontrada em
Usando
shed
, eu encontrei a sequência ofensiva. Acabou sendo um erro de editor.fonte
Você pode tentar isso antes de usar a
job_titles
string:fonte
Para python 3, a codificação padrão seria "utf-8". As etapas a seguir são sugeridas na documentação base: https://docs.python.org/2/library/csv.html#csv-examples em caso de qualquer problema
Crie uma função
Em seguida, use a função dentro do leitor, por exemplo
fonte
python3x ou superior
carregar arquivo no fluxo de bytes:
body = '' para linhas em open ('website / index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () body de retorno
use a configuração global:
importação io importação sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, codificação = 'utf-8')
fonte
Use em
open(fn, 'rb').read().decode('utf-8')
vez de apenasopen(fn).read()
fonte