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 进行标记(一种方法!)
使用 SVD 和缩减启发式构造 U'Sigma'V' 降维矩阵
手动查看 U' 矩阵,并提出描述每个“主题”的术语。例如,如果该向量的最大部分是“布朗克斯、洋基队、曼哈顿”,那么“纽约市”可能是一个很好的术语。将它们保存在关联数组或列表中。这一步应该是合理的,因为向量的数量是有限的。
假设您有一个文档的单词向量 (v1),那么 v1 * t(U') 将为该文档提供最强的“主题”。选择 3 个最高的,然后给出他们在上一步中计算的“主题”。