web-dev-qa-db-ja.com

NLTKでのPunktSentenceTokenizerの使用

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の実際の使用法を理解できませんでした

27
arqam

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のトレーニングデータ形式

24
alvas

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トークンに分割する必要があります。

NLTKのドキュメント

[1] Kiss and Strunk、 " 教師なし多言語文章境界検出 "

13
CentAu

以下のリンクを参照して、PunktSentenceTokenizerの使用法に関する詳細な洞察を得ることができます。ケースに関して、sent-tokenize()の代わりにPunktSentenceTokenizerが使用される理由を明確に説明しています。

http://nlpforhackers.io/splitting-text-into-sentences/

1
Ranjeet Singh
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)

他のテキストデータでトレーニングしなくても、事前トレーニングと同じように機能します。

0
ashirwad