Nltk: 文トークナイザーが正しく分割されない

作成日 2015年11月23日  ·  5コメント  ·  ソース: nltk/nltk

標準のセンテンストークナイザーsent_tokenizeバグがあると思います。 問題は、特定の場合にテキストを文に分割していないことです。 これは、トークナイザーがテキストを2つの文に分割できない場合です。

[sent for sent in nltk.sent_tokenize('Model wears size S. Fits size.')]

これにより、 ['Model wears size S.', 'Fits size.']ではなく['Model wears size S. Fits size.']が返されます。 .前の最後の文字列に1文字しか含まれていない場合、問題が発生するようです。 文字数が>= 2場合、テキストは正しく分割されます。

inactive tokenizer

最も参考になるコメント

SmashwordsでMikeSuttonsが発行した「 BookCorpusの実例を追加したいだけです。

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

出力

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

nltkがk.を文区切り文字として認識していないことを確認しました。

全てのコメント5件

S. Fitsが人の名前と姓である可能性があることを考慮すると、これをセンテンストークナイザーで修正するのは非常に難しいように見えます。

行く方法は、デフォルトのNLTKセンテンストークナイザーをサブクラス化またはコピーアンドペーストして、アプリケーションに合うように変更することだと思います。 たとえば、テキストでそのような人の名前を期待しない場合は、人の名前を処理するルールを削除します。 もう1つのオプションは、トークン化の前にsize <X>size_<X>に置き換え、テキストが文に分割された後に再び置き換えるなどの回避策を使用することです。

うーん。 もう一度やり直してください。 したがって、私が提示した最初のケ​​ースは、正しく分割されていません。 しかし、私が異なる文字を使用すると、それは時々分割されます! それが私がこの簡単なテストを書いた理由です:

import nltk
import pprint

pp = pprint.PrettyPrinter(indent=4)
s = 'Test {}. Test {}.'
[nltk.sent_tokenize(s.format(char, char)) for char in 'abcdefghijklmnopqrstuvwxyz']
[pp.pprint(nltk.sent_tokenize(s.format(char, char))) for char in 'abcdefghijklmnopqrstuvwxyz']

出力:

['Test a.', 'Test a.']
['Test b.', 'Test b.']
['Test c. Test c.']
['Test d. Test d.']
['Test e. Test e.']
['Test f. Test f.']
['Test g. Test g.']
['Test h. Test h.']
['Test i.', 'Test i.']
['Test j.', 'Test j.']
['Test k. Test k.']
['Test l. Test l.']
['Test m. Test m.']
['Test n. Test n.']
['Test o.', 'Test o.']
['Test p. Test p.']
['Test q.', 'Test q.']
['Test r. Test r.']
['Test s. Test s.']
['Test t. Test t.']
['Test u.', 'Test u.']
['Test v. Test v.']
['Test w. Test w.']
['Test x.', 'Test x.']
['Test y.', 'Test y.']
['Test z.', 'Test z.']

@kmike

@JernejJerinこれはルールベースの

sent_tokenizerトレーニングに使用されるアルゴリズムは、 Kiss and Strunk(2006)punktアルゴリズムです。 これは、文の境界を学習しようとする統計システムであるため、完全ではありませんが、モデルから生成された確率と一致しています(ただし、人間のようなルールは必要ありません)。

SmashwordsでMikeSuttonsが発行した「 BookCorpusの実例を追加したいだけです。

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

出力

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

nltkがk.を文区切り文字として認識していないことを確認しました。

このページは役に立ちましたか?
0 / 5 - 0 評価