基于一组文档的相似性对句子进行排名的最佳方法

时间:2012-01-03 17:30:39

标签: string algorithm similarity

我想知道根据一组文件的相似性对句子进行排名的最佳方法 例如,让我们说,
1.共有5份文件 每个文件都包含很多句子 3.将文件1作为主要文件,即输出将包含本文件中的句子 4.输出应该是以这样的方式排列的句子列表:FIRST排名的句子是所有5个文件中最相似的句子,然后是第2和第3 ......

提前致谢。

3 个答案:

答案 0 :(得分:5)

我将介绍文本文档匹配的基础知识......

大多数文档相似性度量基于单词而不是句子结构。第一步通常是stemming。单词被简化为它们的根形式,因此不同形式的相似单词,例如“游泳”和“游泳”比赛。

此外,您可能希望过滤匹配的字词以避免噪音。特别是,您可能希望忽略“the”和“a”的出现。事实上,你可能希望省略很多连词和代词,所以通常你会有一长串这样的词 - 这叫做“stop list”。

此外,您可能希望避免匹配的错误词语,例如咒骂词或种族诽谤词。所以你可能有另一个排除列表,里面有这样的单词,一个“坏名单”。

所以现在你可以在文件中计算类似的单词。问题变成了如何衡量文档的总体相似度。您需要创建一个分数函数,将相似的单词作为输入,并给出“相似性”的值。如果在两个文档中多次出现相同的单词,这样的函数应该给出高值。另外,这样的匹配由总词频加权,这样当不常见的词匹配时,它们会被赋予更多的统计权重。

Apache Lucene是一个用Java编写的开源搜索引擎,它提供了有关这些步骤的实用细节。例如,以下是有关如何加权查询相似性的信息:

http://lucene.apache.org/java/2_9_0/api/all/org/apache/lucene/search/Similarity.html

  

Lucene将信息检索的布尔模型(BM)与   信息检索的向量空间模型(VSM) - 文档   BM的“批准”由VSM评分。

所有这些只是在文档中匹配单词。你确实指定了匹配的句子。对于大多数人来说,匹配单词更有用,因为你可以拥有各种各样的句子结构,这些结构实际上意味着相同的东西。相似性最有用的信息就在单词中。我已经谈过文档匹配,但就你的目的而言,句子只是一个非常小的文档。

现在,顺便说一句,如果你不关心句子中的实际名词和动词而只关心语法构成,你需要一种不同的方法......

首先,您需要link grammar parser来解释语言并构建表示句子的数据结构(通常是树)。然后你必须执行不精确的图匹配。这是一个难题,但有多种算法可以在多项式时间内对树进行此操作。

答案 1 :(得分:0)

作为起点,您可以为每个单词计算soundex,然后根据索引频率比较文档。

答案 2 :(得分:0)

蒂姆的概述非常好。我只想补充一点,对于您的具体用例,您可能希望将Doc 1中的句子视为文档本身,并将它们与剩余的四个文档中的每一个进行比较。这可能会为您提供每个句子的快速聚合相似性度量,而不会强迫您沿着语法分析等路线前进。