查找对象之间相似性的算法

时间:2015-04-30 09:12:49

标签: algorithm bigdata string-matching

我有一些巨大的数据集(介于10-20之间),我需要找出这些数据集之间的关系。数据集非常庞大,计算可能不适合单台计算机。这些数据集中的字段是文本而不是数字。更复杂的是,某些字段也可能包含不正确的字词,例如'huose'代表我正在使用模糊算法的'house'。

为了解决这个问题,我正在考虑使用余弦相似性但不确定这么大的数据集的性能。我的问题是,这种算法是否足以应对这种问题(性能和准确性)。如果没有,我还应该研究一些其他算法吗?

修改:更多信息

我将使用的数据集可能是文本文件和数据库表的混合。列中的值通常为10-50 char,并且它不是一个巨大的文档。我寻找的关系是数据集的一列与另一列的相似程度。我有点想根据列之间的相似性得出分数。例如

Col1     Col2     Col3
A        B        X
C        S        B
E        C        A
T        V        C
X        E

因此,在上面的示例中,可以说Col1Col3彼此之间存在很强的关系,而Col1Col2的关系较弱。

2 个答案:

答案 0 :(得分:5)

不,使用余弦相似性不是一个好的选择,因为:

  1. 没有考虑单词的顺序(假设单词包模型)。
  2. 它需要计算每对物体的成对距离,这对于大型集合来说在计算上是不可能的。
  3. 您可能会在Information Retrieval中寻找更像近似重复检测的内容。我已经在different thread中解释了一次(虽然不是一个确切的欺骗),但是这里是如何做到的:

    其中一个已知的解决方案是使用 Jaccard-Similarity 来获取两个文档之间的差异。

    Jaccard基本相似 - 从每个文档中获取单词集,让这些集合为s1s2 - 并且jaccard相似度为|s1 [intersection] s2|/|s1 [union] s2|

    通常在面临重复时 - 但是单词的顺序有一些重要性。为了处理它 - 在生成集s1s2时 - 你实际上生成了k-shinglings集合,而不是单词集合。
    例如

    Text 1:"I'm writing a crawler to"
    Text 2:"I'm writing a some text crawler to get"
    

    使用k=2,集合将为:

    s1 = { I'm write, write a, a crawler, crawler to }
    s2 = { I'm write, write a, a some, some text, text crawler, crawler to, to get }
    s1 [union] s2 = { I'm write, write a, a crawler, crawler to, a some, some text, text crawler, to get } 
    s1 [intersection] s2 = { I'm write, write a, crawler to }
    

    在上文中,jaccard相似性将为3/8。如果你使用相同方法的单个单词,(k = 1个shinglings)你将得到你想要的5/8 - 但这是我(以及大多数IR专家)意见中更糟糕的解决方案。

    这个过程可以很好地扩展,以便非常有效地处理大型集合,而无需检查所有对并创建大量集合。更多细节可以在these lecture notes中找到(我在2年前根据作者的笔记给了这个讲座。)

答案 1 :(得分:0)

这听起来像一个通常被称为Schema Matching的问题。

余弦距离确实听起来像是你所描述的非常好的方法。将每列视为长文档,并比较列之间的余弦距离。