【问题标题】:How to measure contents differences within lists如何衡量列表中的内容差异
【发布时间】:2014-11-04 23:31:32
【问题描述】:

不想在这里引起混乱。我希望每个列表都附加一个值的原因是我想将每个列表中的内容用作聚类算法的特征值。最初的想法是我有 1000 个项目,每个项目都有一个公司名称列表。我想将此列表内容转换为一个值。这就是为什么我希望附加到每个列表的每个值都作为该项目的功能之一......谢谢......(这也是我使用基本列表的原因......)

我正在尝试使用 python 来分析一些文本,现在我有 1000 个列表,每个列表都包含公司名称列表。例如:

list1 = ['google', 'facebook' 'twitter', 'IBM']
list2 = ['microsoft', 'bloomberg', '1010Data']
list3 = ['google', 'microsoft', '1010Data']

我想衡量这些列表的相似性。 list1list2有0个相似之处,但list1list3list2list3有一些相似之处。但是如何测量呢?

最初我考虑使用一个包含这些列表中所有单词的基本向量。这里的基本列表可能是:

base_list = ['google', 'facebook', 'twitter', 'IBM', 'microsoft', 'bloomberg','1010Data'] 

其向量值为:

base_vector = [1, 1, 1, 1, 1, 1, 1]

然后这些列表中的每一个都有根据单词外观及其位置的向量值。 (这里,base_listlist1list2list3都是排序的)

list1 = [1, 1, 1, 1, 0, 0, 0]
list2 = [0, 0, 0, 0, 1, 1, 1]
list3 = [1, 0, 0, 0, 1, 0, 1]

我想通过将它们中的每一个与 base_vector 进行比较来测量它们的差异(或相似性),以获得角度值。

但是!一个大问题可能是

list1 = [1, 1, 1, 0, 0, 0]
list2 = [0, 0, 0, 1, 1, 1]

那么它们与基向量的角度值是一样的!

还有什么建议?关于如何衡量列表中内容的相似性?我的意思是我不必使用这种矢量方法,我只是被阻止了。

谢谢!

【问题讨论】:

  • 你的输入输出应该是什么?您可以对每个列表进行排序,然后比较相应的位置。
  • 为什么不将列表相互比较,以及base_vector?
  • @corn3lius 我想到了这一点,但我的清单太多了。我想最后我会有 12000 个列表。如果我相互比较,它将是 O(N^2)。
  • @neo 说我有 1000 个列表。我希望每个列表都有一个值,该函数的输入是 foo(v, v1) 其中 v 是基向量,v1 是 list1 的向量。并且输出应该是一个值。这样一直持续到所有列表都有对应的值。
  • 基本列表的问题在于 (list1, base) 之间的相似性与 (list1, list2) 之间的相似性无关。

标签: python list similarity cosine-similarity


【解决方案1】:

您可以使用numpy 计算列表之间的cosine similarity

>>> import numpy as np
>>> list2 = [0, 0, 0, 0, 1, 1, 1]
>>> list3 = [1, 0, 0, 0, 1, 0, 1]
>>> angle = np.dot(list2,list3)/(np.linalg.norm(list2)*np.linalg.norm(list3))
>>> angle
0.66666666666666674

或者,您可以使用scipy 及其空间距离公式,如曼哈顿、欧几里得、杰卡德。它们也是相似度的度量。 Scipy 还具有余弦相似度,这似乎更易于使用。

【讨论】:

  • 是的。但是我将每个列表与 base_vector 进行比较,即 [1, 1, 1, 1, 1, 1]。如果 list2 是 [1, 1, 1, 0, 0, 0] 并且 list3 是 [0, 0, 0, 1, 1,1] 那么 base_vector 和 list1 的值,base_vector 和 list3 将是相同的。
  • 这确实是有道理的,因为list2list3 都与base_vector 相似。
  • 您不计算列表和基本列表之间的相似度。您计算列表之间的相似性。 sim([1,1,1,0,0,0],[0,0,0,1,1,1]) 结果为 0。
  • @BrunoCalza 但是如果我有 10, 000 个列表呢?我比较他们每个人?
  • 如果您将列表相互比较,并且它们仅包含 1 和 0,则异或列表的总和应作为相似性度量。
【解决方案2】:

我想到了另一个使用Jaccard 相似性的解决方案。您不必使用基本列表作为参考将列表转换为数字列表。只需应用公式

>>> list1 = ['google', 'facebook' 'twitter', 'IBM']
>>> list2 = ['microsoft', 'bloomberg', '1010Data']
>>> list3 = ['google', 'microsoft', '1010Data']

>>> float(len(set(list2).intersection(list3)))/len(set(list2).union(list3))
0.5

【讨论】:

  • 但在这种情况下,我仍然需要将 list1 与 list2 和 list3 进行比较,将 list2 与 list3 进行比较?
  • 每个列表的值应该是多少?
  • 这取决于您需要存储所有列表对之间的相似性。如果你这样做,你将不得不比较每一个。我没有看到其他选择
  • 值应与 (list1,list2) 对一起存储
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多