检测和比较短语的算法

时间:2011-06-30 11:30:29

标签: algorithm language-agnostic nlp semantics

我有几个非英文文本。我想对它们进行风格比较。

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

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

3 个答案:

答案 0 :(得分:8)

  • 获取所有文字,并建立单词列表。简单的方法:拿走所有的话。困难的方法:只采取相关的一个(即:“英语”,“它”从来不是一个相关的词,因为它经常使用)。假设你的词汇中有V字。
  • 对于每个文本,构建一个邻接矩阵A,其大小为V * V.行A(i)表示词汇表中的单词与第i个单词V(i)的接近程度。例如,如果V(i)=“滑雪”,则A(i,j)是单词V(j)与单词“滑雪”的接近程度。你更喜欢小词汇!

技术细节: 对于词汇表,您有几种可能获得良好的词汇量。不幸的是,我记不起名字了。其中之一是删除经常出现的文字。相反,你应该保留少数文本中出现的罕见词。但是,保留在一个文本中完全存在的单词是没有用的。

对于邻接矩阵,通过计算您正在考虑的单词的距离(couting分隔它们的单词的数量)来测量邻接度。例如,让我们使用你的文本=)

  

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

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

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

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

答案 1 :(得分:2)

您应该使用一些字符串相似性度量,例如JaccardDicecosine similarity。您可以在单词,(单词或字符级别) n -grams或lemmas上尝试这些。 (对于一种高度变化的语言,如Koinè希腊语,如果你有一个很好的变形器,我会建议使用lemmas。)

除非你有像WordNet那样将同义词映射在一起的东西,否则很难捕捉到同义词。

答案 2 :(得分:1)

我会遵循两条准则:

  • 注意匹配算法中的过早优化。从广泛的方法开始,然后根据需要进行重新设置(即检查简单的“邻近”测试是否为您知道的数据集提供了足够好的结果答案,如果没有,调整它直到它确实)。在许多情况下,您会发现高度优化的解决方案不会产生与您第一次粗略尝试相比的显着差异。
  • 使用某种自学习算法。这样,您可以为AI提供一些可以使其变得更智能的文本。从你的例子中汲取灵感:在尝试比较两个目标文本之前,我会提供有关户外生活的文本。通过这种方式,AI最有可能自学,anglingfishing非常接近。

作为自学AI,我会(至少一开始)使用神经网络。有一个简单而完整的示例(在python中)可以找到here并且精确定位“数据挖掘”。当然,您可能希望用其他语言实现。

关于您的两个具体问题:

  

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

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

  

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

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

HTH!