我有一些巨大的数据集(介于10-20之间),我需要找出这些数据集之间的关系。数据集非常庞大,计算可能不适合单台计算机。这些数据集中的字段是文本而不是数字。更复杂的是,某些字段也可能包含不正确的字词,例如'huose'代表我正在使用模糊算法的'house'。
为了解决这个问题,我正在考虑使用余弦相似性但不确定这么大的数据集的性能。我的问题是,这种算法是否足以应对这种问题(性能和准确性)。如果没有,我还应该研究一些其他算法吗?
修改:更多信息
我将使用的数据集可能是文本文件和数据库表的混合。列中的值通常为10-50 char,并且它不是一个巨大的文档。我寻找的关系是数据集的一列与另一列的相似程度。我有点想根据列之间的相似性得出分数。例如
Col1 Col2 Col3 A B X C S B E C A T V C X E
因此,在上面的示例中,可以说Col1
和Col3
彼此之间存在很强的关系,而Col1
和Col2
的关系较弱。
答案 0 :(得分:5)
不,使用余弦相似性不是一个好的选择,因为:
您可能会在Information Retrieval中寻找更像近似重复检测的内容。我已经在different thread中解释了一次(虽然不是一个确切的欺骗),但是这里是如何做到的:
其中一个已知的解决方案是使用 Jaccard-Similarity 来获取两个文档之间的差异。
Jaccard基本相似 - 从每个文档中获取单词集,让这些集合为s1
和s2
- 并且jaccard相似度为|s1 [intersection] s2|/|s1 [union] s2|
。
通常在面临重复时 - 但是单词的顺序有一些重要性。为了处理它 - 在生成集s1
和s2
时 - 你实际上生成了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的问题。
余弦距离确实听起来像是你所描述的非常好的方法。将每列视为长文档,并比较列之间的余弦距离。