检测和比较短语的算法

Posted

技术标签:

【中文标题】检测和比较短语的算法【英文标题】:Algorithm to Detect and Compare Phrases 【发布时间】:2011-09-25 21:59:21 【问题描述】:

我有一些非英语文本。我想对它们进行风格比较。

比较风格的一种方法是寻找相似的短语。如果我在一本书“钓鱼、滑雪和远足”中找到了几次,而在另一本书“钓鱼、远足和滑雪”中发现,风格上的相似之处指向一位作者。不过,我还需要能够找到“钓鱼,甚至滑雪或远足”。理想情况下,我也会找到“钓鱼、远足和滑雪”,但因为它们是非英语文本(Koine Greek),所以同义词更难允许,这方面并不重要。

最好的方法是 (1) 检测这些类型的短语,然后 (2) 以一种在其他文本中不太死板的方式搜索它们(以便找到“钓鱼甚至滑雪或徒步旅行” ")?

【问题讨论】:

【参考方案1】: 获取所有文本,并建立一个单词列表。简单的方法:把所有的话。困难的方式:只取相关的(即:在英语中,“the”从来都不是一个相关的词,因为它经常使用)。假设您的词汇表中有 V 个单词。 为每个文本构建一个邻接矩阵 A,大小为 V*V。 A(i) 行说明了词汇表中的单词与第 i 个单词 V(i) 的接近程度。例如,如果 V(i)="skiing",则 A(i,j) 是单词 V(j) 与单词“skiing”的接近程度。你更喜欢小词汇量!

技术细节: 对于词汇,你有几种可能来获得一个好的词汇。不幸的是,我不记得名字了。其中之一包括删除经常和无处不在的单词。相反,您应该保留在少数文本中出现的稀有词。但是,保留恰好出现在一个文本中的单词是没有用的。

对于邻接矩阵,邻接的测量是通过计算您正在考虑的单词的距离来完成的(计算将它们分开的单词的数量)。例如,让我们使用您的文字 =)

比较风格的一个方法是寻找相似的短语。如果我在一本书“钓鱼、滑雪和远足”中找到几次,而在另一本书“钓鱼、远足和滑雪”中发现相似性指向一位作者。不过,我还需要能够找到“钓鱼,甚至滑雪或远足”。理想情况下,我也会找到“钓鱼、远足和滑雪”,但因为它们是非英语文本(Koine 希腊语),所以同义词更难出现,这方面并不重要。

这些完全是由值组成的: A(方法,比较)+= 1.0 A(方法,相似度)+= 0.5 A(方法,希腊语)+= 0.0

您主要需要一个“典型距离”。例如,你可以说,在 20 个分隔词之后,这些词就不能被认为是相邻的了。

经过一点归一化后,只需在两个文本的邻接矩阵之间做一个 L2 距离,看看它们有多接近。之后你可以做一些更漂亮的事情,但这应该会产生可接受的结果。现在,如果你有同义词,你可以用一种很好的方式更新邻接。例如,如果您输入“美丽的少女”,那么 A(美丽,少女)+= 1.0 A(华丽,少女)+= 0.9 A(公平,少女)+= 0.8 A(崇高,少女)+= 0.8 ...

【讨论】:

【参考方案2】:

您可能应该使用一些字符串相似性度量,例如Jaccard、Dice 或cosine similarity。您可以在单词、(单词或字符级别)n-grams 或引理上尝试这些。 (对于像 Koinè Greek 这样的高度屈折变化的语言,如果你有一个好的词形还原器,我建议使用引理。)

捕捉同义词很难,除非你有 WordNet 之类的东西,它将同义词映射在一起。

【讨论】:

【参考方案3】:

我会遵循两条准则:

注意匹配算法中的过早优化。 从广泛的方法开始,然后根据需要对其进行改进(即检查一个简单的“接近度”测试是否为您知道答案的数据集提供足够好的结果,如果没有,请调整它直到它出现)。在许多情况下,您会发现高度优化的解决方案不会产生与您第一次粗略尝试相比有很大不同的结果。 使用某种自学习算法。这样,您可以向 AI 提供大量文本,使其更智能。从您的示例中获得灵感:在尝试比较两个目标文本之前,我会提供有关户外生活的文本。这样一来,人工智能很可能会自己知道anglingfishing 非常接近。

作为自学 AI,我会(至少在开始时)使用神经网络。可以在here 中找到一个简单且功能齐全的示例(在 python 中),它的目标正是“数据挖掘”。当然,您可能希望用其他语言实现。

关于您的两个具体问题:

检测这类短语的最佳方法是什么

您的问题的其他答案已经详细说明了这一点(他们的作者似乎比我更了解这个主题!),但同样:我会从简单开始,简单地使用一个神经网络来告诉你有多接近两个术语是。然后我会继续进行优化的“波浪”(例如 - 如果它是英文文本 - 仅使用单词的词根,或者根据文本的其他一些元数据(如年份)调整分数可能有一些用处, 或作者, 或地理来源, 或完全更改匹配算法...) 直到您对结果感到满意。

在其他文本中以不太严格的方式搜索它们的最佳方法是什么(以便找到“钓鱼甚至滑雪或徒步旅行”

我会说这相当于要求 AI 返回所有“接近分数”超过给定阈值的短语。

HTH!

【讨论】:

以上是关于检测和比较短语的算法的主要内容,如果未能解决你的问题,请参考以下文章

Python单词短语相似度比较

经典目标检测算法介绍

有没有一种算法可以用英文短语中的倾斜变体('和')替换撇号(')?

用于比较人名以检测相同性的算法

过滤一组包含在其他短语中的所有短语的算法

目标检测算法是啥?