用词汇外词计算句子的概率

2024-09-24 04:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个英语语料库上训练了Ngram语言模型(unigram和bigram),并试图从不相交的语料库计算句子的概率。在

例如,培训语料库由三个句子组成:

1:我,是,山姆

2:山姆,我是

3:我,不,像,绿色,鸡蛋,火腿

N=14(语料库长度)

对于unigram,我的结论是概率:

Pr(“i”)=#(“i”)/N=3/14,Pr(“am”)=2/14,Pr(“like”)=1/14,依此类推。。。在

对于bigram,我以概率结束:

Pr(“am”|“i”)=2/3,Pr(“do”|“i”)=1/3,依此类推。。。在

现在,我试图计算以下句子中并非所有ngram(uni或bi)都出现在训练语料库中的概率:

我,吃了,a,玉米煎饼

对于unigram,我需要以下概率估计:

Pr(“i”)、Pr(“ate”)、Pr(“a”)和Pr(“玉米煎饼”)

对于bigram,我需要以下概率估计:

Pr(“ate”|“i”),Pr(“a”|“ate”),Pr(“卷饼”|“a”)

显然并不是所有的单格词(“ate”,“burrito”)和bigram(比如“i”,“ate”)都出现在训练语料库中。在

我知道您可以进行平滑处理(如添加一个平滑处理)来处理这些情况:

例如,训练语料库的词汇是

我,是,山姆,不要,像,绿色,鸡蛋,火腿

你可以通过包含新句子中的新词来扩展词汇量:

吃,a,玉米煎饼

所以扩展的词汇量应该是V=13

所以对于单峰图,原来的概率估计Pr(w#i)=(w#i)/N将变成(#(w_i)+1)/(N+V)

所以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(“eggs”)=2/27,Pr(“and”)=2/27,Pr(“ham”)=2/27

对于这三个新单词: Pr(“ate”)=1/27,Pr(“a”)=1/27,Pr(“卷饼”)=1/27

这些概率的总和仍然是1.0

虽然这可以处理一些ngram不在原始训练集中的情况,但是在使用(#(w_i)+1)/(N+V)(V=原始训练集(10)和测试语料库(3))估计概率时,您必须知道“新”单词集的集合。我认为这相当于假设测试语料库中的所有新的unigram或bigram只出现一次,不管它们实际发生了多少次。在

我的问题是,在计算一个句子的概率时,通常会处理词汇表外标记?在

NLTK模块nltk.module.ngramodel似乎是因为错误而被删除了nltk ngram model,所以我必须自己实现。另一个问题:除了NLTK之外,是否还有python模块实现Ngram训练和计算句子的概率?在

提前谢谢!在


Tags: pr概率am鸡蛋like句子语料库绿色
1条回答
网友
1楼 · 发布于 2024-09-24 04:26:43

我的答案是基于“语音和语言处理”Jurafsky&Martin中的一个解决方案,在这个场景中,您正在根据您的培训数据构建词汇表(您有一个空字典)。在

在本例中,您将词汇表外新词(OOV)的任何第一个实例视为未知标记<UNK>。在

这样,所有的稀有词都将成为一种象征,类似于看不见的词。要理解原因,请考虑这样一个事实:一个实例不足以让您的模型基于该实例做出决定。这样,未知标记也有助于你对所见标记的准确性。在

我找到了这个pdf版本: https://lagunita.stanford.edu/c4x/Engineering/CS-224N/asset/slp4.pdf

关于你的第二个问题,我认为通过对文本进行调整和预处理,你可以在scikit learn中使用CountVectorizer: http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html

相关问题 更多 >