У меня есть эта функция, которую я изменил из материала в главе 1 онлайн-книги NLTK. Это было очень полезно для меня, но, несмотря на чтение главы о Юникоде, я чувствую себя таким же потерянным, как и раньше.
def openbookreturnvocab(book):
fileopen = open(book)
rawness = fileopen.read()
tokens = nltk.wordpunct_tokenize(rawness)
nltktext = nltk.Text(tokens)
nltkwords = [w.lower() for w in nltktext]
nltkvocab = sorted(set(nltkwords))
return nltkvocab
Когда я попробовал это на днях в «Также Спрах Заратустра», слова были помяты с умлатой над «о» и «у». Я уверен, что некоторые из вас будут знать, почему это произошло. Я также уверен, что это довольно легко исправить. Я знаю, что это просто связано с вызовом функции, которая перекодирует токены в строки Unicode. Если это так, то, как мне кажется, это вообще может не произойти внутри определения этой функции, но здесь, где я готовлюсь записать в файл:
def jotindex(jotted, filename, readmethod):
filemydata = open(filename, readmethod)
jottedf = '\n'.join(jotted)
filemydata.write(jottedf)
filemydata.close()
return 0
Я слышал, что мне нужно было закодировать строку в юникод после чтения из файла. Я попытался изменить функцию следующим образом:
def openbookreturnvocab(book):
fileopen = open(book)
rawness = fileopen.read()
unirawness = rawness.decode('utf-8')
tokens = nltk.wordpunct_tokenize(unirawness)
nltktext = nltk.Text(tokens)
nltkwords = [w.lower() for w in nltktext]
nltkvocab = sorted(set(nltkwords))
return nltkvocab
Но это принесло эту ошибку, когда я использовал его на венгерском языке. Когда я использовал его на немецком языке, у меня не было ошибок.
>>> import bookroutines
>>> elles1 = bookroutines.openbookreturnvocab("lk1-les1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "bookroutines.py", line 9, in openbookreturnvocab
nltktext = nltk.Text(tokens)
File "/usr/lib/pymodules/python2.6/nltk/text.py", line 285, in __init__
self.name = " ".join(map(str, tokens[:8])) + "..."
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 4: ordinal not in range(128)
Я исправил функцию, которая хранит данные следующим образом:
def jotindex(jotted, filename, readmethod):
filemydata = open(filename, readmethod)
jottedf = u'\n'.join(jotted)
filemydata.write(jottedf)
filemydata.close()
return 0
Однако, это принесло эту ошибку, когда я попытался подать немецкий:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "bookroutines.py", line 23, in jotindex
filemydata.write(jottedf)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 414: ordinal not in range(128)
>>>
... это то, что вы получаете, когда пытаетесь записать u '\ n'.join'ed данные.
>>> jottedf = u'/n'.join(elles1)
>>> filemydata.write(jottedf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 504: ordinal not in range(128)