2011-06-30 48 views
6

我有几个非英文文本。我想对他们进行文体比较。检测和比较短语的算法

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

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

回答

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

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

对于邻接矩阵来说,通过计算你正在考虑的单词有多远来计算邻接关系(指出分隔它们的单词的数量)。例如,让我们用你的文字很=)

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

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

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

经过一些归一化之后,只需在两个文本的邻接矩阵之间建立一个L2距离即可看到它们有多接近。事后你可以做更有趣的事情,但这应该会产生可接受的结果。现在,如果你有同义词,你可以更好地更新邻接关系。例如,如果你有在输入 “美丽的少女”,然后
A(美观,少女)+ = 1.0
A(宏伟,少女)+ = 0.9
A(公平,少女)+ = 0.8
甲(高妙,处女)+ = 0.8
...

2

您应该使用一些字符串相似性度量,例如Jaccard,Dicecosine similarity。你可以用单词,单词或字符级别n -grams或引理句来尝试这些。 (对于像Koinè希腊语这样高度弯曲的语言,如果你有一个很好的lemmatizer,我会建议使用引理句。)

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

1

我会遵循两个原则:

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

作为一个自我学习的AI,我会使用(至少在开始)一神经网络。有一个简单和完整的工作示例(在Python中),可以找到here,并准确地针对“数据挖掘”。当然,你可能希望用其他语言来实现。

关于你的两个具体的问题:

什么是去检测这些类型的短语

其他答案你的问题已经消失在这个细节(和它们的作者的最佳途径似乎知道的方式比我在这方面做的还要多!),但是再一次:我会开始简单,只需使用一个神经网络,告诉你两个术语有多接近。然后,我会继续进行优化的“波浪”(例如 - 如果它是英文文本) - 仅使用单词的词根,或者可能根据文本的某些其他元数据(如年份)调整分数,或作者,或地理来源,或者完全改变匹配算法......),直到你对结果感到满意为止。

什么是去的方式,是不是在其他文本过于僵化为他们寻找最佳的方式(这样才能找到“钓鱼,甚至滑雪或远足”

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

HTH!