在正确的语言 ID 旁边,langid.py返回一个特定值 - “返回的值是语言的分数。它不是概率估计,因为它没有被文档概率标准化,因为这对于分类是不必要的。” 但是值是什么意思?
3 回答
我其实是langid.py
. 不幸的是,我现在才发现这个问题,差不多是在它被问到一年之后。自从提出这个问题以来,我已经整理了规范化的处理,因此所有 README 示例都已更新以显示实际概率。
您在那里看到的值(并且您仍然可以通过关闭规范化来获得)是文档的非规范化对数概率。因为 log/exp 是单调的,我们实际上不需要计算概率来决定最可能的类别。这个 log-prob 的实际值实际上对用户没有任何用处。我可能不应该包含它,并且将来我可能会删除它的输出。
我认为这是 langid.py 代码的重要部分:
def nb_classify(fv):
# compute the log-factorial of each element of the vector
logfv = logfac(fv).astype(float)
# compute the probability of the document given each class
pdc = np.dot(fv,nb_ptc) - logfv.sum()
# compute the probability of the document in each class
pd = pdc + nb_pc
# select the most likely class
cl = np.argmax(pd)
# turn the pd into a probability distribution
pd /= pd.sum()
return cl, pd[cl]
在我看来,作者正在为每种可能的语言计算数据的多项式对数后验。 logfv
计算 PMF ( x_1!...x_k!
) 分母的对数。 np.dot(fv,nb_ptc)
计算项的对数p_1^x_1...p_k^x_k
。所以,pdc
看起来像语言条件对数似然列表(除了它缺少n!
术语)。 nb_pc
看起来像先验概率,pd
对数后验也是如此。归一化线pd /= pd.sum()
让我感到困惑,因为通常会归一化类似概率的值(不是对数概率值);此外,文档 ( ) 中的示例('en', -55.106250761034801)
看起来没有经过规范化——也许它们是在添加规范化行之前生成的?
无论如何,简短的回答是这个值,pd[cl]
是一个置信度分数。根据当前代码,我的理解是它们应该是 0 到 1/97 之间的值(因为有 97 种语言),值越小表示置信度越高。
看起来像一个值,它告诉您引擎猜测文档的正确语言的确定程度。我认为通常数字越接近 0,它就越有把握,但是您应该能够通过将语言混合在一起并传递它们来测试您得到的值。它允许您在使用 langid 时微调您的程序,具体取决于您认为“足够接近”以算作匹配。