gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:17:41 25 4
gpt4 key购买 nike

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

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

我不想使用任何外部库。 I've already an implementation for the Singular Value Decomposition (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',大小为 w x ii、ii x ii 和 ii x d。

这就是 LSA 算法的本质。

这个结果矩阵 U' * Sigma' * V' 可用于“改进的”余弦相似性搜索,或者您可以为其中的每个文档选择前 3 个词,例如。这是否比简单的 tf-idf 产生的更多是一些争论的问题。

对我来说,LSA 在现实世界的数据集中表现不佳,因为多义词和主题太多的数据集。它的数学/概率基础是不可靠的(它假设正态(高斯)分布,这对字数统计没有意义)。

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

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

  1. 使用 SVD 和缩减启发式构建 U'Sigma'V' 维数缩减矩阵

  2. 手动查看 U' 矩阵,并提出描述每个“主题”的术语。例如,如果该向量的最大部分是“Bronx、Yankees、Manhattan”,那么“New York City”可能是一个很好的术语。将它们保存在关联数组或列表中。这一步应该是合理的,因为向量的数量是有限的。

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

关于php - LSA - 潜在语义分析 - 如何用 PHP 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1014927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com