langid.py 中的“返回值”到底是什么意思?

Tyt*_*yto 3 python

除了正确的语言 ID 之外,langid.py返回一个特定值 - “返回的值是该语言的分数。它不是概率估计,因为它没有通过文档概率进行标准化,因为这对于分类来说是不必要的。” 但这个值意味着什么?

saf*_*fsd 6

我实际上是 的作者langid.py。不幸的是,我现在才发现这个问题,距它提出已经快一年了。自从提出这个问题以来,我已经整理了标准化的处理,因此所有自述文件示例都已更新以显示实际概率。

您在那里看到的值(并且您仍然可以通过关闭标准化来获得)是文档的非标准化对数概率。因为 log/exp 是单调的,所以我们实际上不需要计算概率来决定最可能的类别。该 log-prob 的实际值实际上对用户没有任何用处。我可能不应该包含它,并且将来我可能会删除它的输出。


jre*_*nie 5

我认为这是 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]
Run Code Online (Sandbox Code Playgroud)

在我看来,作者正在计算每种可能语言的数据的 多项式对数后验之类的东西。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 种语言),值越小表示置信度越高。