自然言語ツールキット-タガーの組み合わせ
タガーを組み合わせる
タガーを組み合わせたり、タガーをチェーンしたりすることは、NLTKの重要な機能の1つです。タガーの組み合わせの背後にある主な概念は、1人のタガーが単語にタグを付ける方法を知らない場合、それが連鎖タガーに渡されるということです。この目的を達成するために、SequentialBackoffTagger 私たちに Backoff tagging 特徴。
バックオフタグ付け
前に述べたように、バックオフタグ付けはの重要な機能の1つです SequentialBackoffTagger、これにより、あるタガーが単語にタグを付ける方法がわからない場合に、チェックするバックオフタガーがなくなるまで、単語が次のタガーに渡されるようにタガーを組み合わせることができます。
それはどのように機能しますか?
実際には、のすべてのサブクラス SequentialBackoffTagger'backoff'キーワード引数を取ることができます。このキーワード引数の値は、の別のインスタンスです。SequentialBackoffTagger。今これがいつでもSequentialBackoffTaggerクラスが初期化されると、バックオフタガーの内部リスト(それ自体を最初の要素として)が作成されます。さらに、バックオフタガーが指定されている場合、このバックオフタガーの内部リストが追加されます。
以下の例では、 DefaulTagger 上記のPythonレシピのバックオフタガーとして、 UnigramTagger。
例
この例では、 DefaulTaggerバックオフタガーとして。いつでもUnigramTagger 単語にタグを付けることができません、バックオフタガー、すなわち DefaulTagger、この場合、「NN」でタグ付けします。
from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Uni_tagger = UnigramTagger(train_sentences, backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
出力
0.9061975746536931
上記の出力から、バックオフタガーを追加することにより、精度が約2%向上することがわかります。
ピクルスでタガーを節約
タガーのトレーニングは非常に面倒で時間がかかります。時間を節約するために、後で使用するために訓練されたタガーを漬けることができます。以下の例では、すでにトレーニング済みのタガーにこれを実行します。‘Uni_tagger’。
例
import pickle
f = open('Uni_tagger.pickle','wb')
pickle.dump(Uni_tagger, f)
f.close()
f = open('Uni_tagger.pickle','rb')
Uni_tagger = pickle.load(f)
NgramTaggerクラス
前の単元で説明した階層図から、 UnigramTagger から継承されます NgarmTagger クラスですが、さらに2つのサブクラスがあります NgarmTagger クラス-
BigramTaggerサブクラス
実際には、ngramはn個のアイテムのサブシーケンスであるため、名前が示すように、 BigramTaggerサブクラスは2つの項目を調べます。最初の項目は前にタグ付けされた単語であり、2番目の項目は現在のタグ付けされた単語です。
TrigramTaggerサブクラス
の同じメモに BigramTagger, TrigramTagger サブクラスは、3つの項目、つまり2つの前のタグ付き単語と1つの現在のタグ付き単語を調べます。
実際に適用すれば BigramTagger そして TrigramTaggerUnigramTaggerサブクラスで行ったように、サブクラスは個別に実行されますが、どちらもパフォーマンスが非常に低くなります。以下の例を見てみましょう。
BigramTaggerサブクラスの使用
from nltk.tag import BigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Bi_tagger = BigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Bi_tagger.evaluate(test_sentences)
出力
0.44669191071913594
TrigramTaggerサブクラスの使用
from nltk.tag import TrigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Tri_tagger = TrigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Tri_tagger.evaluate(test_sentences)
出力
0.41949863394526193
以前に使用したUnigramTagger(約89%の精度)とBigramTagger(約44%の精度)およびTrigramTagger(約41%の精度)のパフォーマンスを比較できます。その理由は、BigramおよびTrigramタガーは、文の最初の単語からコンテキストを学習できないためです。一方、UnigramTaggerクラスは前のコンテキストを気にせず、各単語の最も一般的なタグを推測するため、ベースラインの精度を高くすることができます。
ngramタガーの組み合わせ
上記の例からわかるように、BigramおよびTrigramタガーは、バックオフタギングと組み合わせると貢献できることは明らかです。以下の例では、Unigram、Bigram、Trigramのタガーをバックオフのタグ付けと組み合わせています。コンセプトは前のレシピと同じですが、UnigramTaggerとバックオフタガーを組み合わせています。唯一の違いは、バックオフ操作に、以下に示すtagger_util.pyのbackoff_tagger()という名前の関数を使用していることです。
def backoff_tagger(train_sentences, tagger_classes, backoff=None):
for cls in tagger_classes:
backoff = cls(train_sentences, backoff=backoff)
return backoff
例
from tagger_util import backoff_tagger
from nltk.tag import UnigramTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Combine_tagger = backoff_tagger(train_sentences,
[UnigramTagger, BigramTagger, TrigramTagger], backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Combine_tagger.evaluate(test_sentences)
出力
0.9234530029238365
上記の出力から、精度が約3%向上していることがわかります。