0

问题如下:

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

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

该数据集目前大约有 50 000 个文档,每天大约有 200 个文档的增长速度。

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

4

4 回答 4

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())
于 2009-07-19T05:31:38.593 回答
4

由于 python 对集合有很好的原生支持,我们可以将JGs 代码修改为,

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"))
于 2009-09-11T14:29:53.250 回答
2

你可以看看WEBSOM 项目

尽管他们的网站今年还没有完全更新,但正在解决的问题非常相似。由于他们正在处理与 10 年前类似(甚至更多)的数据量,因此今天您几乎可以在手机上运行这些算法。

于 2009-03-22T19:37:51.423 回答
1

没有真正可以选择的特定语言。您正在尝试查找语义相似性。这是一个非常大的区域。您可能对这篇论文感兴趣:

基于语料库和基于知识的文本语义相似度测量

于 2009-03-22T19:41:14.223 回答