2016-10-24 13 views
0

英語のコーパス上でNgram言語モデル(unigramとbigram)を訓練し、離散コーパスからの文の確率を計算しようとしています。語彙外の文の確率を計算する

例えば、訓練コーパスは3文で構成されています

1:私は、午前、サム

2:サム、私は、

3午前:I

N = 14(コーパスの長さ)

ユニグラムのために、私は確率で終わる:

のPr( "I")=#( "I")/ N = 3月14日、PR( "AM")= 2/14、PR(」 "|" I ")= 2/3、PR(" やる午前:のような "

PR()= 1/14、およびバイグラムの場合など...

は、私は確率で終わります" "|" i ")= 1/3など...

ここでは、すべてのngram(uniまたはbi)がトレーニングコーパスに表示されない次の文の確率を計算しようとしています。

私は、、、ブリトーユニグラムのために

を食べ、私は次の確率推定値を必要とする:

のPr( "I")、PR( "食べた")、PR( "A")、及びPr( "ブリトー")

とバイグラムのために、私は次の確率推定値を必要とする:

Prが( "食べた" | "I")、PR( "" | "食べた")、PR( "burrito" | "a")

unigrams( "ate"、 "burrito")とbigrams ( "i"、 "ate"のように)訓練コーパスに現れます。私はあなたがこれらのケースに対処するために(のような追加-1の平滑化)を平滑化を行うことを理解

:たとえば

、トレーニングコーパスの語彙は、私は、午前

で、SAM、ん、ではない、ハム、緑、卵、および、などの

、あなたは新しいセンテンスから新しい単語を含めることによって、語彙を増やすことができます。

は、ブリトーを食べ

だから拡張語彙のサイズがユニグラムためだから= 13

Vなり、元の確率は、Prが(w_i)=#(w_i)/ Nは(#(w_i)+に変えることになる推定します1)/(N + V)

したがって、Pr( "i")= 4/27、Pr( "am")= 3/27、Pr( "sam")= 3/27、Pr )= 2/27、Pr( "not")= 2/27、Pr( "like")= 2/27、Pr( "green")= 2/27、Pr( "eggs")= 2/27 Pr( "ate")= 1/27、Pr( "a")= 2/27、Pr( "ham")= 2/27

)= 1/27、Pr( "ブリトー")= 1/27

そして、これらの確率は、まだこれはいくつかのngramsは、元のトレーニングセットではありませんでしたケースを処理できますが、あなたは見積もり時に「新」の単語のセットを知っている必要があります1.0

に合計う(ν=元の訓練セットの語彙の和(10)、およびテストコーパス(3))を使用して確率を計算する。これは、テストコーパスのすべての新しいユニグラムまたはバイグラムが実際に何度起こったとしても、一度だけ発生すると仮定することと同じだと思います。

私の質問は、文の確率を計算するときに、語彙外のトークンが通常処理される方法です。

NLTKモジュールnltk.module.NGramModelは、バグnltk ngram modelのために削除されたようですので、私は自分で実装する必要があります。別の質問:Ngramのトレーニングと文章の確率計算を実装するNLTK以外のPythonモジュールがありますか?

ありがとうございます!

+0

はい、それはAです新しい語彙に対処する一般的な方法:一度だけカウントしてください。他のPythonパッケージに関しては、私は確かにGoogleのTensorFlowをお勧めします。 – Prune

答えて

0

私の答えは、あなたのトレーニングデータ(あなたは空の辞書があります)に基づいてあなたの語彙を構築しているシナリオで、 "スピーチと言語処理" Jurafsky & Martinのソリューションに基づいています。

この場合、ボキャブラリ(OOV)から新しい単語の最初のインスタンスを未知のトークン<UNK>として扱います。

このように、すべてのまれな単語は、目に見えない単語に似た1つのトークンになります。その理由を理解するには、そのインスタンスがモデルに基づいて決定するのに十分でないという事実を考慮してください。このようにして未知のトークンもまた、見えたトークンの正確さに役立ちます。

私は、このPDF版が見つかりました:あなたの2番目の質問について https://lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf

を、私はあなたがscikit学習にCountVectorizerを使用することができます微調整を考えると、あなたのテキストを前処理: http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html