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

这就是我认为我必须做的。 它是否正确?我怎样才能用 PHP 编码呢?我如何确定选择哪些词?

我不想使用任何外部库。 我已经实现了奇异值分解(SVD).

  1. 从给定文本中提取所有单词。
  2. 衡量单词/短语的权重,例如和 特遣部队–以色列国防军. 。如果加权太复杂,则只取出现次数。
  3. 建立一个矩阵:列是数据库中的一些文档(越多越好?),行都是唯一的单词,值是出现次数或权重。
  4. 进行奇异值分解 (SVD)。
  5. 使用矩阵 S (SVD) 中的值进行降维(如何降维?)。

我希望你可以帮助我。预先非常感谢您!

有帮助吗?

解决方案

LSA链接:

这是完整的算法。如果您有 SVD,那么您已经成功了。上面的论文比我解释得更好。

假设:

  • 您的 SVD 函数将以降序给出奇异值和奇异向量。 如果没有,你就得多做一些杂技。

中号:语料库矩阵,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' 矩阵,并提出描述每个“主题”的术语。例如,如果该向量的最大部分是“布朗克斯、洋基队、曼哈顿”,那么“纽约市”可能是一个很好的术语。将它们保存在关联数组或列表中。此步骤应该是合理的,因为向量的数量是有限的。

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

其他提示

这个答案不是直接针对海报的问题,而是针对如何自动标记新闻项目的元问题。 OP提到命名实体识别,但我相信它们意味着更多的自动标记。如果他们真的意味着NER,那么这种反应就是h ::“

鉴于这些限制条件(600项/天,100-200个字符/项)具有不同的来源,以下是一些标记选项:

  1. 手工制作。分析师每天可以轻松完成600个这样的工作,可能需要几个小时。像亚马逊的Mechanical Turk,或者让用户这样做,也可能是可行的。有一些“手工标记”,即使它只有50或100,也将是比较下面的自动生成方法的好基础。

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

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

  4. 祝你好运!

    (如果你喜欢这个答案,可能会重新考虑这个问题)

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

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

HTH

更新

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

有两个任务 - a)要使用的标签集是什么? b)如何选择最好的三个标签?我不太了解LSI如何帮助你回答(a)。您可以手动选择标签集。但是,如果您使用LSI,标签可能应该是文档中出现的单词。然后对于(b),您想要选择最接近文档中找到的单词的标签。您可以尝试一些实现方法。选择最接近文档中任何单词的三个标记,其中靠近度是通过标记坐标(U中的行)与单词坐标(行)之间的余弦相似度(参见维基百科)来衡量的。在U)。

链接中,在PHP中执行此操作的危险还有一个额外的SO线程文本

具体来说,本文就潜在语义映射,其描述了如何获得结果的“主题”。对于文本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top