我有一个从文本中提取公司名称的算法。它通常做得很好,但是,它有时也会提取看起来像公司名称的字符串,但显然不是。例如,“联系我们”,“Colorado Springs CO”,“Cosmetic Dentist”显然不是公司名称。黑名单中存在太多这样的误报,因此我想引入一种对提取的字符串进行排名的算法方法,以便排除排名最低的字符串。
目前,我正在考虑使用statistical language model来执行此操作。该模型可以根据字符串中每个单词的概率乘积对每个字符串进行评分(考虑最简单的unigram模型)。我的问题是:这样的模型可以用来比较不同长度的单词序列吗?由于概率小于1,因此较长序列的概率通常小于较短序列的概率。这会使模型偏向较长的序列,这不是一件好事。
有没有办法比较使用这种统计语言模型的不同长度的单词序列?或者,是否有更好的方法来获得序列分数?
例如,使用bigram模型和一些现有数据,这就是我得到的:
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>
分别是句子的开头和结尾。问题是,句子越长,可能性就越小,无论其组成的双子星在数据库中出现的频率如何。
答案 0 :(得分:3)
您可以根据句子长度对分数进行标准化,还是使用EM algorithm而不是unigram,bigram和trigram模型?
编辑9月24日:
您可以尝试一些替代方案。一种方法是对unigram,bigram和trigram模型进行最大似然估计并采用线性插值(参见:http://www.cs.columbia.edu/~mcollins/lm-spring2013.pdf)。对于位置i的每个单词,您可以确定(i + 1)是句子的结尾还是最有可能出现的单词。此方法要求您设置培训和测试数据集以评估性能(困惑)。
我会避免对每个单词的概率进行简单的乘法运算。当单词不是独立的时,例如,P(NEC,Corporation)!= P(NEC)* P(公司)。