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

这是我认为我必须做的。 这是正确的吗?如何用PHP编写代码?如何确定要选择的单词?

我不想使用任何外部库。 I've already an implementation for the Singular Value Decomposition (SVD)

  • 从给定的文本中提取所有单词。
  • 加权单词/词组,例如与tf–idf。如果加权太复杂,只需考虑出现的次数。
  • 建立矩阵:列是数据库中的一些文档(越多越好?),行都是唯一的单词,值是出现的次数或权重。
  • 执行奇异值分解(SVD)。
  • 使用矩阵S(SVD)中的值进行降维(如何做)。

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

    最佳答案

    LSA链接:

  • Landauer (co-creator) article on LSA
  • the R-project lsa user guide

  • 这是完整的算法。如果您拥有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',其大小分别为w x ii,ii x ii和ii x d。

    这就是LSA算法的本质。

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

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

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

    使用LSA标记(一种方法!)
  • 使用SVD和归约启发式
  • 构造U'Sigma'V'降维矩阵
  • 用手查看U'矩阵,并提出描述每个“主题”的术语。例如,如果矢量的最大部分是“布朗克斯,洋基,曼哈顿”,那么“纽约市”可能是一个很好的称呼。将它们保留在关联数组或列表中。由于向量的数量将是有限的,因此此步骤应该是合理的。
  • 假设您有一个文档的单词向量(v1),则v1 * t(U')将为该文档提供最强的“主题”。选择最高的3个,然后按照上一步中的步骤给出其“主题”。
  • 关于php - LSA-潜在语义分析-如何在PHP中编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1014927/

    10-10 16:35