【问题标题】:Need help in latent semantic indexing在潜在语义索引方面需要帮助
【发布时间】:2011-01-02 07:54:01
【问题描述】:

对不起,如果我的问题听起来很愚蠢:) 你能推荐我在java中实现LSI的任何伪代码或好的算法吗? 我不是数学专家。我试图阅读维基百科和其他网站上的一些文章 LSI(潜在语义索引)它们充满了数学。 我知道 LSI 充满了数学。但如果我看到一些源代码或算法。我更了解事情 容易地。这就是我在这里问的原因,因为这里有很多 GURU! 在此先感谢

【问题讨论】:

  • 谢谢阿米特,但是如果您阅读了我的问题。所以它是不同的。即使你认为它是一样的,你也无法在那里找到一些好的答案:)
  • 我们总是要减少 lsa 的维度吗?难道我们不能只用v矩阵来找到文档之间的相似度,用u矩阵来找到术语之间的相似度吗?

标签: java algorithm math latent-semantic-indexing


【解决方案1】:

LSA 的概念基于一个假设:两个单词出现在相同文档中的次数越多,它们就越相似。事实上,我们可以预料到,“programming”和“algorithm”这两个词会比“programming”和“dog-breeding”更频繁地出现在同一个文档中。

文档也一样:两个文档的词越常见/相似,它们本身就越相似。因此,您可以通过词的频率来表达文档的相似性,反之亦然。

知道了这一点,我们可以构造一个共现矩阵,其中列名代表文档,行名-单词,每个cells[i][j]代表单词words[i]在文档documents[j]中出现的频率。频率可以通过多种方式计算,IIRC,原始 LSA 使用tf-idf 索引。

有了这样的矩阵,你可以通过比较对应的列来找到两个文档的相似性。如何比较它们?同样,有几种方法。最流行的是余弦距离。您必须从学校数学中记住,该矩阵可能被视为一堆向量,因此每一列只是某个多维空间中的一个向量。这就是为什么这个模型被称为“向量空间模型”。更多关于 VSM 和余弦距离here

但是我们对这样的矩阵有一个问题:它很大。非常非常大。使用它的计算成本太高,所以我们必须以某种方式减少它。 LSA 使用SVD 技术来保留最“重要”的向量。缩减矩阵后即可使用。

因此,LSA 的算法将如下所示:

  1. 从中收集所有文档所有唯一词
  2. 提取频率信息并构建共现矩阵
  3. 使用 SVD 减少矩阵。

如果您要自己编写 LSA 库,最好从 Lucene 搜索引擎开始,这将使第 1 步和第 2 步更容易,以及一些具有 SVD 能力的高维矩阵的实现,例如 @ 987654325@或UJMP

还要注意其他从 LSA 发展而来的技术,例如 Random Indexing。 RI 使用相同的想法并显示大致相同的结果,但不使用完整的矩阵阶段并且是完全增量的,这使得它的计算效率更高。

【讨论】:

  • 嗨,我最近一直在研究 lsa。我们总是要减少对角矩阵的维数吗?我的需要是找到两个文档之间的相似性。如果我单独使用 v 矩阵并使用它来查找相似性,可以吗?我在本文中阅读了这种方法:miislita.com/information-retrieval-tutorial/…
  • @CTsiddharth:如果您不想降低维度,则不需要 SVD,因此根本不需要 V 矩阵 - 您可以按原样使用原始术语文档矩阵。然而,降维给你带来了两大优势:1)它减少了噪音; 2)它使文档相似度计算更快(要比较的元素更少)。因此,对于相对较小的语料库(例如,
  • 就我而言,我有 35 个文档和大约 1500 个单词。如果我执行 svd,则 v 矩阵变为 35*35 。那么我可以使用这个 35*35 矩阵而不是 1500*35 来查找相似度吗?这是我想了很久的一个问题
  • 另外请帮我回答这个问题:stackoverflow.com/questions/9582291/…
  • @CTsiddharth:当你减少维度时,你会过滤噪音,但也会丢失一些信息。因此,您的问题没有单一的答案 - 这完全取决于您的数据集。制作一些测试集并检查完整数据集和缩减数据集的结果。与您的另一个问题相同 - 尝试减小尺寸的不同值并取得最佳效果。
【解决方案2】:

这可能有点晚了,但我一直很喜欢 Sujit Pal 的博客 http://sujitpal.blogspot.com/2008/09/ir-math-with-java-tf-idf-and-lsi.html,如果你有兴趣,我已经在我的网站上写了一些。

这个过程比通常写的要简单得多。实际上,您只需要一个可以对矩阵进行单值分解的库。

如果你有兴趣,我可以用一些简短的要点来解释:

1)您创建一个矩阵/数据集/等,其中包含各种文档的字数 - 不同的文档将是您的列,而行是不同的单词。

2) 创建矩阵后,您可以使用 Jama(用于 Java)或 SmartMathLibrary(用于 C#)之类的库并运行单值分解。所有这一切都是将您的原始矩阵分解为三个不同的部分/矩阵,这些部分/矩阵基本上代表您的文档、您的单词和一种乘数 (sigma),这些称为向量。

3) 一旦你有了 word、document、sigma 向量,你只需复制向量/矩阵的较小部分,然后将它们相乘,就可以相等地缩小它们 (k)。通过缩小它们可以标准化您的数据,这就是 LSI。

这里有一些相当清晰的资源:

http://puffinwarellc.com/index.php/news-and-articles/articles/30-singular-value-decomposition-tutorial.html

http://lsa.colorado.edu/papers/JASIS.lsi.90.pdf http://www.soe.ucsc.edu/classes/cmps290c/Spring07/proj/Flynn_talk.pdf

希望对你有所帮助。

埃里克

【讨论】:

  • 嗨,我同时学到了很多东西。但是您的回答仍然非常有帮助+1。我也看到了 sujit pall 的博客。这很好,但我不同意他的结果。我问他什么时候两个文档之间没有上下文相似性,为什么它说 100% 相同。他无法回答。现在我正在寻找如何使用 LSI 以外的 LDA。是否可以为此目的使用LDA????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2011-02-13
  • 2011-01-27
  • 2014-02-06
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多