2016-10-24 111 views
0

我在英語語料庫上訓練了Ngram語言模型(unigram和bigram),我試圖從不相交的語料庫中計算句子的概率。用詞彙量計算句子的計算概率

例如,訓練庫由3句:

1:我,我,薩姆

2:山姆,我,我

3:我,do,not,like,green,eggs,and,ham

N = 14(語料庫的長度)

對於單字組,我最終概率:

PR( 「I」)=#( 「I」)/ N = 3/14,PR( 「AM」)= 2/14,鐠(」像 「)= 1/14,等等...

對於兩字,我結束了概率:

PR(」 AM 「|」 我 「)= 2/3,PR(」 做「|」i「)= 1/3,等等......

現在,我試圖計算下列句子的概率,其中並非所有ngram(uni或bi)出現在訓練語料庫中:

我,吃了,一,捲餅

對於單字組,我需要以下概率估計:

PR( 「I」),鐠( 「吃」),鐠( 「A」),和Pr( 「捲餅」)

和二元,我需要以下的概率估計:

PR( 「吃」 | 「我」),鐠( 「A」 | 「吃」),PR( 「捲餅」|「a」)

顯然不是所有的unigrams(「ate」,「burrito」)和bigrams (如(「我」,「吃」))出現在訓練語料庫中。

我知道你可以做到平滑(如附加一個平滑)來處理這些案件:

例如,訓練語料的詞彙是

我,上午,山姆,做不一樣,綠色,雞蛋,火腿

,你可以通過添加新的一句新詞擴大詞彙量:

吃,一,捲餅

所以擴大詞彙的大小將是V = 13

所以對於單字組,原來的概率估計PR(w_i)=#(w_i)/ N就會變成(#(w_i)+ 1)/(N + V)

So Pr(「i」)= 4/27,Pr(「am」)= 3/27,Pr(「sam」)= 3/27,Pr(「do 「)= 2/27,Pr(」not「)= 2/27,Pr(」like「)= 2/27,Pr(」green「)= 2/27,Pr(」egg「)= 2/27 Pr(「and」)= 2/27,Pr(「ham」)= 2/27

對於3個新單詞: Pr(「ate」)= 1/27,Pr(「a」 )= 1/27,Pr(「捲餅」)= 1/27

而且這些概率仍然總和爲1.0

雖然這可以處理其中一些的n-gram都不在原來的訓練集中的情況下,你必須知道的一組「新」字,當你估計使用(#(w_i)+ 1)/(N + V)(V =原始訓練集合(10)和測試語料庫(3)的詞彙之和)的概率。我認爲這相當於假設測試語料庫中的所有新的單字或雙字只出現一次,無論它們實際發生多少次。

我的問題是這樣的方式超出詞彙的代幣通常處理時,計算一個句子的概率?

由於錯誤nltk ngram model,NLTK模塊nltk.module.NGramModel似乎已被刪除,所以我必須自行實施。另一個問題:是否有除NLTK以外的其他Python模塊實現Ngram訓練和計算一個句子的概率?

在此先感謝!

+0

是的,這是一個處理新詞彙的常用方法:數一次,現在你知道他們已經發生過一次。至於其他Python軟件包,我當然可以推薦Google的TensorFlow。 – Prune

回答

0

我的答案基於「語音和語言處理」Jurafsky & Martin的解決方案,根據您的訓練數據(您有空字典)來構建詞彙表。

在這種情況下,您將任何新詞的第一個實例作爲未知令牌<UNK>用作詞彙表(OOV)的第一個實例。

這種方式所有罕見的單詞將是一個類似於看不見的單詞的標記。爲了理解這個原因,考慮一個事例不足以讓你的模型根據這個事實來決定。通過這種方式,未知令牌也可以幫助您查看令牌的準確性。

我發現這個PDF版本: https://lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf

關於你的第二個問題,我覺得有一個調整和預處理你的文字,你可以在使用CountVectorizer scikit學習: http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html