【发布时间】:2016-10-25 06:43:26
【问题描述】:
我在英语语料库上训练了 Ngram 语言模型(unigram 和 bigram),我正在尝试从不相交的语料库中计算句子的概率。
例如,训练语料由 3 个句子组成:
1:我,我,山姆
2:山姆,我,是
3:我,做,不,喜欢,绿色,鸡蛋,还有,火腿
N = 14(语料库的长度)
对于 unigram,我最终得到概率:
Pr("i") = #("i") / N = 3/14, Pr("am") = 2/14, Pr("like") = 1/14,以此类推。 .
对于二元组,我最终得到概率:
Pr("am"|"i") = 2/3,Pr("do"|"i") = 1/3,以此类推……
现在,我正在尝试计算以下句子中并非所有 ngram(uni 或 bi)都出现在训练语料库中的概率:
我吃了一个墨西哥卷饼
对于 unigram,我需要以下概率估计:
Pr("i")、Pr("ate")、Pr("a") 和 Pr("burrito")
对于二元组,我需要以下概率估计:
Pr("ate"|"i"), Pr("a"|"ate"), Pr("burrito"|"a")
显然不是所有的一元词(“ate”、“burrito”)和二元词(如(“i”、“ate”))都出现在训练语料库中。
我知道您可以进行平滑处理(如加一平滑处理)来处理这些情况:
例如训练语料库的词汇是
我、我、山姆、做、不、喜欢、绿色、鸡蛋和火腿
您可以通过包含新句子中的新单词来扩展词汇表:
吃了一个墨西哥卷饼
所以扩展词汇的大小将是 V = 13
所以对于 unigram,原始概率估计 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( "不") = 2/27, Pr("喜欢") = 2/27, Pr("绿色") = 2/27, Pr("鸡蛋") = 2/27, Pr("和") = 2 /27, Pr("火腿") = 2/27
对于 3 个新词: Pr("ate") = 1/27, Pr("a") = 1/27, Pr("burrito") = 1/27
这些概率的总和仍为 1.0
虽然这可以处理一些 ngram 不在原始训练集中的情况,但是当您使用 (#(w_i) + 1) / (N + V) (V = 原始训练集 (10) 和测试语料库 (3) 的词汇总和)。我认为这相当于假设测试语料库中所有新的一元或二元只出现一次,无论它们实际出现多少次。
我的问题是,在计算句子的概率时,通常处理词汇外标记的方式是什么?
NLTK 模块 nltk.module.NGramModel 似乎由于错误nltk ngram model 已被删除,所以我必须自己实现。另一个问题:除了 NLTK 之外,还有其他 Python 模块可以实现 Ngram 训练和计算句子的概率吗?
提前致谢!
【问题讨论】:
-
是的,这是处理新词汇的常用方法:计数一次,因为您知道它们已经出现过一次。至于其他 Python 包,我当然可以推荐 Google 的 TensorFlow。
标签: python nlp probability n-gram