计算文档之间距离的一些标准方法是什么?


Answers:


48

有多种不同的处理方式,具体取决于要保留多少语义信息以及文档标记化的难易程度(html文档可能很难标记化,但是可以想象,您可以使用标签和上下文来做一些事情)

ffriend提到了其中的一些,user1133029的段落向量确实很可靠,但是我只是想对不同方法的优缺点进行更深入的探讨。

  • 余弦距离 -尝试过的真实余弦距离可能是跨多个域通用的最常见距离度量。话虽如此,余弦距离中几乎没有任何信息可以实际映射回任何语义,对于这种情况,这似乎是不理想的。
  • Levenshtein距离 -也称为edit distance,通常仅用于单个令牌级别(单词,双字母组等)。通常,我不建议使用这种度量标准,因为它不仅会丢弃任何语义信息,而且往往会非常相似地对待非常不同的单词更改,但是对于这种情况,它是一种极为常见的度量标准
  • LSA-在评估称为的文档相似性时,是大量技术的一部分topic modeling。LSA最近已经过时了,以我的经验,它不是最强大的主题建模方法,但是它实现起来相对简单,并且有一些开源实现
  • LDA-也是一种用于的技术topic modeling,但是与LDA的不同之处LSA在于,它实际上学习的是倾向于更平滑和直观的内部表示形式。通常,从中获得的结果LDA对于建模文档相似性要比更好LSA,但对于学习如何在主题之间进行强烈区分的效果却不那么好。
  • 弹球盘游戏分配 -在LDA之上是一个非常巧妙的扩展。一般而言,这只是的显着改进版本LDA,唯一的缺点是培训时间更长,而且开源实现也更难实现
  • word2vec -Google一直在研究一系列技术,以智能地将单词和文档还原为比诸如Count Vectorizers和等技术产生的稀疏矢量更合理的矢量TF-IDF。Word2vec很棒,因为它有许多开源实现。一旦有了向量,就可以在其上使用任何其他相似性度量标准(例如余弦距离),从而显着提高功效。
  • doc2vec-也称为paragraph vectors,这是Google一系列论文中最新,最出色的,旨在研究文档的密集矢量表示形式。gensimpython中的库具有一个word2vec非常简单的实现,可以相当合理地利用它来进行构建doc2vec,但是如果您想走这条路线,请务必牢记许可证

希望能对您有所帮助,请让我知道。


6

有许多语义距离度量,各有其优缺点。这里只是其中一些:

  • 余弦距离,文档特征向量之间的内积;
  • LSA,另一个基于矢量的模型,但利用SVD对原始术语文档矩阵进行消噪;
  • 基于 WordNet,经过人为验证,尽管很难扩展。

从最简单的方法开始,然后根据您的特定情况下的问题进一步发展。


1
请注意,在执行LSA时,通常会在原始数据集的LSA投影上使用余弦距离。只是为了澄清。
西蒙

6

从经验上我发现,在每次尝试的每个数据集上,LSA都大大优于LDA。我已经和其他说过同样话的人谈过。它也被用来赢得许多SemEval竞赛,以衡量文档之间的语义相似性,通常与基于词网的度量结合使用,因此我不会说它过时了,或者绝对不如LDA,后者更好与某些响应者所说的相反,我的经验不是主题相似性,而是主题建模。

如果您使用gensim(一个python库),它具有LSA,LDA和word2vec,因此您可以轻松比较3。doc2vec是一个不错的主意,但是扩展性不是很好,您可能必须自己实现没有意识到任何开源实现。它不能很好地扩展,因为对于每个文档,都必须使用SGD(一种缓慢的机器学习算法)构建新的单独模型。但这可能会给您最准确的结果。LSA和LDA也不能很好地扩展(但是word2vec可以扩展),总体而言LDA的扩展性更差。但是,Gensim的实现非常快,因为它使用了迭代SVD。

另一个要注意的是,如果您使用word2vec,则仍然必须确定一种从文档组合向量的方法,因为它为每个词提供了不同的向量。最简单的方法是对每个向量进行归一化,并对文档中所有单词向量取均值,或者通过对每个单词进行idf加权获得加权均值。因此,它不如“ use word2vec”那么简单,您将需要做一些进一步的工作来计算文档相似度。

我个人会选择LSA,因为我从经验上看它运作良好,并且gensim的库可扩展性很好。但是,这里没有免费的午餐,因此最好尝试每种方法,看看哪种方法更适合您的数据。


您究竟如何使用LSA?值得注意的是,LDA实际上是LSA(它是先有dirichlet的pLSA)周围的一个非常薄的包装,根据经验已经证明它可以大大提高泛化性。您几乎肯定会发现LSA具有更好的精度,但这通常是过度拟合的结果,这是LSA的一个非常明显的问题。另外,在这里扩展表示什么意思?doc2vec实际上不需要为每个文档都使用新模型,并且对于计算而言,LSA和LDA之间没有显着差异,两者都具有很高的可伸缩性。
Slater Victoroff 2014年

我还没有观察到是否适合LSA,就像我说的那样,我遇到了许多其他人,他们看到了比LDA更好的性能。另外,我曾看到LSA在semeval比赛的许多获胜作品中使用过,而我从未见过LDA在获胜作品中使用过。那是比较文档之间语义相似性的学术会议,所以我假设他们知道他们在做什么。如果您是指Mikolov的段落矢量实现,则Doc2vec会对每个文档分别进行SGD。所以这很慢。
西蒙

@SlaterVictoroff我认为这太过分了,说它太合身了。众所周知,LDA在搜索/信息检索和推荐案例方面效果不佳,从经验上讲,LSA表现得更好,并且与我的经验相符,因为我想根据自己的数据验证这些发现。Doc2Vec的版本每个文档都会进行梯度下降,这取决于Doc2Vec中使用的算法,因为它通常指的是许多不同的算法。
西蒙(Simon)

3

最新的技术似乎是在最近的论文中引入的“段落向量”:http//cs.stanford.edu/~quocle/paragraph_vector.pdf。段落向量之间的余弦/欧几里得距离可能比其他方法更有效。由于缺乏开源实现,这可能尚不可行。

其次,最好的是LSA向量之间的余弦距离或原始BOW向量之间的余弦距离。有时选择不同的加权方案(例如TF-IDF)会更好。


请注意以下有关段落矢量可伸缩性的评论。这项技术看起来非常有前途,但难以实施,而且根本无法很好地扩展,因为您需要为每个文档分别进行SGD,如果我正确地记住该文件,这将是非常昂贵的
Simon

1

在您的工具包中包含一组本地敏感哈希算法非常有用。这个族根本没有语义。实际上是将文本视为位序列。当同一文本多次出现但略有不同时,我发现它在脏数据集中很有用。

您可以使用ssdeep(基于Nilsimsa hash)来识别此类文档。Ssdeep最初计划用于垃圾邮件领域。垃圾邮件发送者通常会在邮件中做一些小的更改(添加空格),以防止被确切的签名(例如md5)检测到。

由于同一数据集中几乎相同文档的许多版本都会对将应用于其上的统计方法造成破坏,因此进行此类清理非常有益。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.