确定两个或多个摘要是否相似

时间:2009-03-22 18:23:52

标签: pattern-matching neural-network similarity fuzzy

问题如下:

我有一个摘要,通常在20到50个单词之间,我想与其他相对类似的摘要进行比较。一般类别和摘要所指的地理位置已为人所知。

例如,如果来自同一地区的人们正在撰写有关建房的文章,我希望能够将这些摘要列出一定程度的确定性,即他们实际上是指建造房屋,而不是建造车库或后院游泳池。

目前,该数据集约有5万份文件,每天增加约200份文件。

首选语言是Python,PHP,C / C ++,Haskell或Erlang,无论哪个都可以完成工作。另外,如果您不介意,我想了解选择特定语言的原因。

4 个答案:

答案 0 :(得分:4)

您可以尝试使用某些字符串相似性度量,例如Jaccard和Dice,但不是计算字符重叠,而是计算字重叠。例如,使用Python,您可以使用以下内容:

def word_overlap(a, b):
    return [x for x in a if x in b]


def jaccard(a, b, overlap_fn=word_overlap):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = overlap_fn(a, b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard("Selling a beautiful house in California".split(), "Buying a beautiful crip in California".split())

答案 1 :(得分:4)

由于python中的集合本身有很好的支持,我们可以将JGs code修改为,

def jaccard(a, b):
    """
    Jaccard coefficient (/\ represents intersection), given by :
        Jaccard(A, B) = (A /\ B) / (|a|) + (|b|) - (A /\ B)
    """
    c = a.intersection(b)
    return float(len(c)) / (len(a) + len(b) - len(c))

jaccard(set("Selling a beautiful house in California"), set("Buying a beautiful crip in California"))

答案 2 :(得分:2)

您可以查看WEBSOM project

即使他们的网站今年没有完全更新,但解决的问题非常相似。正如他们在10年前处理的数据类似于您的数据(以及更多),今天您几乎可以在手机上运行算法。

答案 3 :(得分:1)

没有特别的语言可供选择。你试图找到语义相似性。这是一个非常大的区域。您可能对本文感兴趣:

Corpus-based and Knowledge-based Measures of Text Semantic Similarity