0

この関数は、オンライン 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)
4

1 に答える 1

4

rawness.decode('utf-8')ファイルから読み取った文字列ごとに、テキストが UTF-8 の場合、 を呼び出して Unicode に変換できます。Unicode オブジェクトになってしまいます。また、「メモ」が何であるかはわかりませんが、それが 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 とエンコーディング (少なくともデモ) に関してあまり慎重ではないようです。注意して、トークンが正しく処理されていることを確認してください。また、これにより、ドイツ語のテキストではなくハンガリー語のテキストでエラーが発生する可能性があります。エンコーディングを確認してください

于 2010-09-22T10:49:04.480 に答える