问题如下:

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

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

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

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

有帮助吗?

解决方案

您可以看看在 WEBSOM项目

虽然他们的网站还没有确切今年更新,正在解决的问题是非常相似的。当他们10年前处理类似你(及以上)类似的数据量,今天你很可能几乎手机上运行的算法。

其他提示

您可以尝试使用一些字符串的相似性措施,如捷卡和骰子,但不是计算字符重叠,你算算字重叠。例如,使用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())

由于Python对集合有很好的原生支持,我们可以修改 JG代码 作为,

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"))

是不是真的有一个特定的语言来接。你试图找到语义相似。这是一个非常大的区域。您可能会感兴趣的文章:

文本语义相似度的基于语料库和基于知识的措施

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top