この関数は、オンライン 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
先日、Zarathustra の会話で試してみたところ、o と u の上にウムラットが付いた単語が上書きされました。どうしてこうなったかわかる方もいらっしゃると思います。また、修正が非常に簡単であると確信しています。トークンをユニコード文字列に再エンコードする関数を呼び出すだけでよいことはわかっています。もしそうなら、その関数定義内ではまったく起こらないように思えますが、ここでは、ファイルに書き込む準備をしています:
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 されたデータを書き込もうとしたときに得られるものです。
>>> 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)