2016-10-24 48 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