【问题标题】:Compute probability of sentence with out of vocabulary words计算词汇量不足的句子的概率
【发布时间】: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


【解决方案1】:

我的回答是基于“语音和语言处理”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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2011-02-16
    • 2019-02-20
    • 2020-10-23
    • 2021-10-08
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多