繁体   English   中英

LSA-潜在语义分析-如何在PHP中编码?

[英]LSA - Latent Semantic Analysis - How to code it in PHP?

我想在PHP中实现潜在语义分析(LSA),以查找文本的主题/标签。

这是我想做的。 这个对吗? 如何用PHP编写代码? 如何确定要选择的单词?

我不想使用任何外部库。 我已经有一个奇异值分解(SVD)的实现

  1. 从给定的文本中提取所有单词。
  2. 加权单词/短语,例如使用tf–idf 如果加权太复杂,只需考虑出现的次数。
  3. 建立一个矩阵:列是数据库中的一些文档(越多越好?),行都是唯一的单词,值是出现的次数或权重。
  4. 进行奇异值分解(SVD)。
  5. 使用矩阵S(SVD)中的值进行尺寸缩减(如何做)。

我希望你能帮助我。 提前非常感谢您!

LSA链接:

这是完整的算法。 如果您拥有SVD,那么您将一路顺风。 上面的论文比我更好地解释了它。

假设:

  • 您的SVD函数将按降序给出奇异值和奇异矢量。 如果没有,您必须做更多的杂技表演。

M :语料矩阵,w(单词)乘d(文档)(w行,d列)。 这些可以是原始计数,也可以是tfidf或其他任何值。 停用词可能会消除,也可能不会消除,并且词干可能会发生(Landauer表示保留停用词并且不会词干,但对tfidf是肯定的)。

U,Sigma,V = singular_value_decomposition(M)

U:  w x w
Sigma:  min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V:  d x d matrix

Thus U * Sigma * V = M  
#  you might have to do some transposes depending on how your SVD code 
#  returns U and V.  verify this so that you don't go crazy :)

然后,归约性....实际的LSA论文提出了一个很好的近似值,即保持足够的向量,以使它们的奇异值大于奇异值总数的50%。

更简洁地...(伪代码)

Let s1 = sum(Sigma).  
total = 0
for ii in range(len(Sigma)):
    val = Sigma[ii]
    total += val
    if total > .5 * s1:
        return ii

这将返回新基准的等级,该等级之前是min(d,w),现在我们用{ii}进行近似。

(在这里,'->质数,而不是转置)

我们创建新的矩阵:U',Sigma',V',其大小分别为wx ii,ii x ii和ii x d。

这就是LSA算法的本质。

此结果矩阵U'* Sigma'* V'可用于'改进的'余弦相似度搜索,或者,例如,您可以为其中的每个文档选择前3个字。 这是否超出了简单的tf-idf的范围,还需要进行一些辩论。

对我来说,由于多义性,并且主题太多的数据集,LSA在现实世界的数据集中表现不佳。 它的数学/概率基础不健全(它假设呈正态分布(高斯分布),这对单词计数没有意义)。

您的里程肯定会有所不同。

使用LSA标记(一种方法!)

  1. 使用SVD和归约启发式构造U'Sigma'V'降维矩阵

  2. 用手查看U'矩阵,并提出描述每个“主题”的术语。 例如,如果矢量的最大部分是“布朗克斯,洋基,曼哈顿”,那么“纽约市”可能是一个很好的称呼。 将它们保留在关联数组或列表中。 由于向量的数量将是有限的,因此此步骤应合理。

  3. 假设您有一个文档的单词向量(v1),则v1 * t(U')将为该文档提供最强的“主题”。 选择最高的3个,然后按照上一步中的步骤给出其“主题”。

这个答案不是直接针对发布者的问题,而是针对如何自动标记新闻项的元问题。 OP提到了命名实体识别,但我认为它们在自动标记方面的意义更大。 如果他们真的是NER,那么这个回应就是hogwash :)

鉴于这些限制(来源每天600个项目,每个项目100-200个字符),来源不同,以下是一些标记选项:

  1. 用手。 分析师可能很容易在几个小时内每天完成600个这样的操作。 像Amazon的Mechanical Turk之类的东西,或者让用户这样做的东西,也是可行的。 即使只有50或100,也要有一些“手工标记”,这将是比较下面任何自动生成的方法能为您提供帮助的良好基础。

  2. 使用LSA,主题模型(Latent Dirichlet Allocation)等减少了二维性。...我对LSA在现实世界数据集上的运气真的很差,我对它的统计基础不满意。 LDA我发现更好,并且有一个令人难以置信的邮件列表 ,它对如何将主题分配给文本具有最佳的思考。

  3. 简单的启发式方法...如果您有实际的新闻项目,请利用新闻项目的结构 专注于第一个句子,扔掉所有常用词(停用词),并从前两个句子中选择最好的3个名词。 或者,把第一句话中的所有名词都拿出来,看看能把你带到哪里。 如果文字全部为英语,则对整个shebang进行语音分析,然后看能得到什么。 对于结构化项目,例如新闻报道,LSA和其他与订单无关的方法(tf-idf),它会抛出大量信息。

祝好运!

(如果您喜欢此答案,请重新标记问题以使其适合)

一切看起来正确,直到最后一步。 SVD的通常表示法是返回三个矩阵A = USV *。 S是对角矩阵(意味着对角线全为零),在这种情况下,基本上可以度量每个维度捕获原始数据的程度。 数字(“奇异值”)将下降,您可以寻找可使用多少个尺寸的下限。 否则,您只需要选择一个任意的数字N即可获取多少尺寸。

在这里我有点模糊。 缩小维空间中的术语(单词)的坐标是U或V,我认为取决于它们是在输入矩阵的行还是列中。 暂且,我认为单词的坐标将是U的行。即,U的第一行对应于输入矩阵的第一行,即第一单词。 然后,您只需要将该行的前N列作为缩小空间中单词的坐标即可。

高温超导

更新:

到目前为止,该过程并没有告诉您确切如何选择标签。 我从未听说有人使用LSI选择标签(机器学习算法可能更适合该任务,例如决策树)。 LSI告诉您两个词是否相似。 这距离分配标签还有很长的路要走。

有两个任务-a)使用哪些标签集? b)如何选择最好的三个标签? 我对LSI如何帮助您回答(a)不太了解。 您可以手动选择标签集。 但是,如果您使用的是LSI,则标记可能应该是文档中出现的单词。 然后对于(b),您想选择与文档中找到的单词最接近的标签。 您可以尝试几种实现方式。 选择三个最接近文档中任何单词的标签,其紧密度是通过标签坐标(U中的行)和单词坐标(U中的行)之间的余弦相似度(请参阅Wikipedia)来衡量的。

链接文本处,还有另外一个SO线程将要在PHP中完成所有操作,这是危险的。

具体来说,该文章的潜在语义映射上有一个链接,该链接描述了如何获取文本的结果“主题”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM