1

从很多文本中获取x个最相似的文本到一个文本。

也许将页面更改为文本会更好。

您不应该将文本与每个文本进行比较,因为它太慢了。

4

5 回答 5

4

识别相似文档/页面的能力,无论是网页还是更一般的文本形式,甚至是代码,都有许多实际应用。该主题在学术论文和不太专业的论坛中得到了很好的体现。尽管有这些相对丰富的文档,但很难找到与特定案例相关的信息和技术。

通过描述手头的具体问题和相关要求,或许可以为您提供更多指导。同时,以下提供了一些一般性的想法。

许多不同的函数可用于以某种方式测量页面的相似性。选择这些函数中的一个(或可能几个)取决于各种因素,包括可以分配问题的时间和/或空间量,以及噪声所需的容忍度。

一些更简单的指标是:

  • 最长公共单词序列的长度
  • 常用词数
  • 多于 n 个单词的常见单词序列的数量
  • 每个文档中前 n 个最常用词的常用词数。
  • 文件长度

上面的一些指标在标准化后效果更好(例如,避免偏爱长页面,因为它们的绝对大小有更多机会与其他页面有相似的词)

更复杂和/或计算成本更高的测量是:

  • 编辑距离(实际上是一个通用术语,因为有很多方法可以测量编辑距离。一般来说,这个想法是测量将一个文本转换为另一个文本需要多少[编辑]操作。)
  • 从 Ratcliff/Obershelp 算法派生的算法(但计算单词而不是字母)
  • 基于线性代数的测量
  • 统计方法,例如贝叶斯拟合器

一般来说,我们可以区分测量/算法,其中大部分计算可以为每个文档完成一次,然后是一个额外的通道,旨在比较或组合这些测量(相对较少的额外计算),而不是需要的算法成对处理要比较的文件。

在选择一个(或者实际上是几个这样的度量,以及一些加权系数)之前,重要的是要考虑除了相似性度量本身之外的其他因素。例如,它可能有益于...

  • 以某种方式规范化文本(特别是在网页的情况下,相似的页面内容或相似的段落看起来不太相似,因为与页面相关的所有“装饰”:页眉,页脚,广告面板,不同的标记等)
  • 利用标记(例如:对在标题或表格中发现的相似性给予更多的权重,而不是在纯文本中发现的相似性。
  • 识别和消除与领域相关的(甚至是众所周知的)表达式。例如,两个完全不同的文档可能看起来相似,因为它们具有共同的两个“样板”段落,这些段落与某些法律免责声明或某些通用描述有关,与每个文档内容的本质没有真正的关联。
于 2009-10-19T05:14:25.520 回答
1

标记文本,删除停用词并排列在术语向量中。计算 tf-idf。将所有向量排列在一个矩阵中并计算它们之间的距离以找到相似的文档,例如使用 Jaccard 索引。

于 2009-10-19T06:51:09.473 回答
1

一切都取决于您所说的“相似”。如果您的意思是“关于同一主题”,那么寻找匹配的 N-gram通常效果很好。例如,只需制作一个从三元组到包含它们的文本的映射,然后将所有文本中的所有三元组放入该映射。然后,当你让你的文本被匹配时,在你的地图中查找它的所有三元组,并选择最常返回的文本(也许按长度进行一些标准化)。

于 2009-10-20T05:58:13.890 回答
0

您必须定义一个函数来测量两个页面之间的“差异”。我可以想象各种这样的功能,您必须为您的域选择其中一个:

  • 关键字集的差异- 您可以修剪字典中最常用单词的文档,然后最终得到每个文档的唯一关键字列表。然后,差异函数将计算差异作为每个文档的关键字集的差异。

  • 文本差异- 根据使用文本差异算法将一个文档转换为另一个文档所需的编辑次数计算每个距离(请参阅文本差异算法

一旦有了差异函数,只需计算当前文档与其他所有文档的差异,然后返回最接近的其他文档。

如果你需要做很多事情并且你有很多文档,那么问题就会变得有点困难。

于 2009-10-19T05:01:41.490 回答
0

我不知道你所说的相似是什么意思,但也许你应该将你的文本加载到像Lucene这样的搜索系统中,并将你的“一个文本”作为查询提交给它。Lucene 确实对文本进行了预索引,因此它可以在查询时快速找到最相似的文本(通过它的灯),正如你所问的。

于 2009-10-20T05:03:28.943 回答