NLTKを使用して自然言語処理を学習しています。 PunktSentenceTokenizer
を使用してコードに出くわしましたが、実際の使用法は特定のコードでは理解できません。コードは次のとおりです。
import nltk
from nltk.corpus import state_union
from nltk.tokenize import PunktSentenceTokenizer
train_text = state_union.raw("2005-GWBush.txt")
sample_text = state_union.raw("2006-GWBush.txt")
custom_sent_tokenizer = PunktSentenceTokenizer(train_text) #A
tokenized = custom_sent_tokenizer.tokenize(sample_text) #B
def process_content():
try:
for i in tokenized[:5]:
words = nltk.Word_tokenize(i)
tagged = nltk.pos_tag(words)
print(tagged)
except Exception as e:
print(str(e))
process_content()
それでは、なぜPunktSentenceTokenizerを使用するのでしょうか。そして、AとBのマークが付いた行で何が行われていますか。つまり、トレーニングテキストと他のサンプルテキストがありますが、品詞タグ付けを取得するには2つのデータセットが必要です。
A
およびB
としてマークされた行は、私には理解できません。
PS:NLTKの本を調べようとしましたが、PunktSentenceTokenizerの実際の使用法を理解できませんでした
PunktSentenceTokenizer
は、NLTKで提供されるデフォルトのセンテンストークナイザー、つまりsent_tokenize()
の抽象クラスです。これは、 Unsupervised Multilingual Sentence Boundary Detection(Kiss and Strunk(2005) 。 https://github.com/nltk/nltk/を参照してください。 blob/develop/nltk/tokenize /init。py#L79
複数の文がある段落がある場合、例:
_>>> from nltk.corpus import state_union
>>> train_text = state_union.raw("2005-GWBush.txt").split('\n')
>>> train_text[11]
u'Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all. This evening I will set forth policies to advance that ideal at home and around the world. '
_
sent_tokenize()
を使用できます:
_>>> sent_tokenize(train_text[11])
[u'Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all.', u'This evening I will set forth policies to advance that ideal at home and around the world. ']
>>> for sent in sent_tokenize(train_text[11]):
... print sent
... print '--------'
...
Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all.
--------
This evening I will set forth policies to advance that ideal at home and around the world.
--------
_
sent_tokenize()
は、_nltk_data/tokenizers/punkt/english.pickle
_の事前学習済みモデルを使用します。他の言語を指定することもできます。NLTKで事前にトレーニングされたモデルで使用可能な言語のリストは次のとおりです。
_alvas@ubi:~/nltk_data/tokenizers/punkt$ ls
czech.pickle finnish.pickle norwegian.pickle slovene.pickle
danish.pickle french.pickle polish.pickle spanish.pickle
dutch.pickle german.pickle portuguese.pickle swedish.pickle
english.pickle greek.pickle PY3 turkish.pickle
estonian.pickle italian.pickle README
_
別の言語のテキストを指定して、これを実行します。
_>>> german_text = u"Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter. Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. "
>>> for sent in sent_tokenize(german_text, language='german'):
... print sent
... print '---------'
...
Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter.
---------
Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten.
---------
_
独自のパンクモデルをトレーニングするには、 https://github.com/nltk/nltk/blob/develop/nltk/tokenize/punkt.py および nltk punktのトレーニングデータ形式
PunktSentenceTokenizer
は、使用するためにトレーニングする必要がある文境界検出アルゴリズムです[1]。 NLTKには、事前トレーニング済みバージョンのPunktSentenceTokenizerがすでに含まれています。
したがって、引数なしでトークナイザーを初期化する場合、事前トレーニング済みバージョンがデフォルトになります。
_In [1]: import nltk
In [2]: tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
In [3]: txt = """ This is one sentence. This is another sentence."""
In [4]: tokenizer.tokenize(txt)
Out[4]: [' This is one sentence.', 'This is another sentence.']
_
独自のトレーニングデータを提供して、トークナイザーを使用する前にトークナイザーをトレーニングすることもできます。 Punktトークナイザーは教師なしアルゴリズムを使用します。つまり、通常のテキストでトレーニングするだけです。
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)
ほとんどの場合、事前にトレーニングされたバージョンを使用することはまったく問題ありません。そのため、引数を指定せずにトークナイザーを単純に初期化できます。
それでは、「これがPOSタグ付けとどう関係するのでしょうか?」 NLTK POSタガーはトークン化された文で動作するため、POSタグを付ける前にテキストを文とWordトークンに分割する必要があります。
[1] Kiss and Strunk、 " 教師なし多言語文章境界検出 "
以下のリンクを参照して、PunktSentenceTokenizerの使用法に関する詳細な洞察を得ることができます。ケースに関して、sent-tokenize()の代わりにPunktSentenceTokenizerが使用される理由を明確に説明しています。
def process_content(corpus):
tokenized = PunktSentenceTokenizer().tokenize(corpus)
try:
for sent in tokenized:
words = nltk.Word_tokenize(sent)
tagged = nltk.pos_tag(words)
print(tagged)
except Exception as e:
print(str(e))
process_content(train_text)
他のテキストデータでトレーニングしなくても、事前トレーニングと同じように機能します。