我想在PHP中实现潜在语义分析(LSA),以查找文本的主题/标签。
这是我认为我必须做的。 这是正确的吗?如何用PHP编写代码?如何确定要选择的单词?
我不想使用任何外部库。 I've already an implementation for the Singular Value Decomposition (SVD)。
我希望你能帮助我。提前非常感谢您!
最佳答案
LSA链接:
这是完整的算法。如果您拥有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标记(一种方法!)
关于php - LSA-潜在语义分析-如何在PHP中编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1014927/