统计语言模型:比较不同长度的单词序列



我有一个从文本中提取公司名称的算法。它通常做得很好,但是,它有时也会提取看起来像公司名称的字符串,但显然不是。 例如,"联系我们","科罗拉多斯普林斯CO","美容牙医"显然不是公司名称。这样的误报太多了,无法列入黑名单,因此我想介绍一种对提取的字符串进行排序的算法方法,以便可以丢弃排名最低的字符串。

目前,我正在考虑使用统计语言模型来做到这一点。 该模型可以根据字符串中每个单词的概率乘积对每个字符串进行评分(考虑最简单的 unigram 模型)。我的问题是:这样的模型可以用来比较不同长度的单词序列吗?由于根据定义,概率小于 1,因此较长序列的概率通常小于较短序列的概率。这将使模型偏向于较长的序列,这不是一件好事。

有没有办法使用这种统计语言模型来比较不同长度的单词序列?或者,有没有更好的方法来对序列进行评分?

例如,对于双元模型和一些现有数据,这就是我得到的:

python slm.py About NEC
        <s> about 6
        about nec 1
        nec </s> 1
4.26701019773e-17
python slm.py NEC
        <s> nec 6
        nec </s> 1
2.21887517189e-11
python slm.py NEC Corporation
        <s> nec 6
        nec corporation 3
        corporation </s> 3593
4.59941029214e-13
python slm.py NEC Corporation of
        <s> nec 6
        nec corporation 3
        corporation of 41
        of </s> 1
1.00929844083e-20
python slm.py NEC Corporation of America
        <s> nec 6
        nec corporation 3
        corporation of 41
        of america 224
        america </s> 275
1.19561436587e-21

缩进线显示双字母及其在模型中的频率。 <s></s>分别是句子的开头和结尾。问题是,句子越长,它的可能性就越小,无论它的组成双字母在数据库中出现的频率如何。

您能否根据句子长度对分数进行归一化,或者在单元组、双元组和三元组模型上使用 EM 算法?

9月24日编辑:

您可能可以尝试一些替代方案。一种方法是对幦幔模型、双元组和三元组模型进行最大似然估计,并采用线性插值(参见:http://www.cs.columbia.edu/~mcollins/lm-spring2013.pdf)。对于位置 i 的每个单词,您可以确定 (i+1) 是否是句子的结尾,或者哪个单词最有可能出现。此方法要求您设置训练和测试数据集以评估性能(困惑度)。

我会避免对每个单词的概率进行简单的乘法。当单词不是独立的时,例如,P (NEC, Corporation) != P (NEC) * P (Corporation)。

最新更新