我在英語語料庫上訓練了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訓練和計算一個句子的概率?
在此先感謝!
是的,這是一個處理新詞彙的常用方法:數一次,現在你知道他們已經發生過一次。至於其他Python軟件包,我當然可以推薦Google的TensorFlow。 – Prune