我有这个功能,我在在线NLTK书的第1章中对材料进行了修改。这对我来说非常有用,但是,尽管阅读了关于Unicode的章节,但我感觉像以前一样迷失。
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
前几天,当我在Asra Sprach Zarathustra上尝试它的时候,它在o和你的上面用umlat咒语。我相信你们中的一些人会知道为什么会这样。我也很确定它很容易修复。我知道它只需要调用一个将令牌重新编码为unicode字符串的函数。如果是这样,在我看来它根本不会发生在那个函数定义中,但在这里,我准备写入文件:
def jotindex(jotted, filename, readmethod):
filemydata = open(filename, readmethod)
jottedf = '\n'.join(jotted)
filemydata.write(jottedf)
filemydata.close()
return 0
我听说我要做的就是在从文件中读取字符串后将字符串编码为unicode。我尝试修改这个函数:
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)
答案 0 :(得分:4)
对于从文件中读取的每个字符串,如果您的文本为UTF-8,则可以通过调用rawness.decode('utf-8')
将它们转换为unicode。你最终会得到unicode对象。另外,我不知道“jotted”是什么,但你可能想确保它是一个unicode对象并改为使用u'\n'.join(jotted)
。
似乎NLTK库不喜欢unicode对象。好的,那么你必须确保使用带有UTF-8编码文本的str实例。试试这个:
tokens = nltk.wordpunct_tokenize(unirawness)
nltktext = nltk.Text([token.encode('utf-8') for token in tokens])
和此:
jottedf = u'\n'.join(jotted)
filemydata.write(jottedf.encode('utf-8'))
但如果jotted确实是UTF-8编码的str的列表,那么你不需要这个,这应该足够了:
jottedf = '\n'.join(jotted)
filemydata.write(jottedf)
顺便说一下,看起来NLTK对于unicode和编码(至少是演示)并不是很谨慎。最好小心并检查它是否正确处理了您的令牌。此外,这可能导致您使用匈牙利文本而非德语文本时出错,检查您的编码。