Python 两个嵌套字符串列表之间的相似性分数

Python 两个嵌套字符串列表之间的相似性分数,python,python-3.x,Python,Python 3.x,我有两个嵌套列表,我想将一个列表中的所有嵌套列表与另一个列表中的所有嵌套列表进行比较 示例数据: list1 = [['a', 'b', 'c', 'x'], ['d', 'e', 'f', 'p'], ['g', 'h', 'i']] list2 = [['g', 'a', 'c'], ['d', 'h', 'b'], ['e', 'f', 'x', 't', 'q']] 为了进行比较,我想将一个列表中的每个嵌套列表与另一个列表中的每个嵌套列表进行比较。比较分数将通过以下公式计算: numb

我有两个嵌套列表,我想将一个列表中的所有嵌套列表与另一个列表中的所有嵌套列表进行比较

示例数据:

list1 = [['a', 'b', 'c', 'x'], ['d', 'e', 'f', 'p'], ['g', 'h', 'i']]
list2 = [['g', 'a', 'c'], ['d', 'h', 'b'], ['e', 'f', 'x', 't', 'q']]
为了进行比较,我想将一个列表中的每个嵌套列表与另一个列表中的每个嵌套列表进行比较。比较分数将通过以下公式计算:

number of overlaps / length of the longer sublist
对于列表1中的第一个嵌套列表,列表2的分数为:

2/4 -> 0.5
1/4 -> 0.25
1/5 -> 0.2
看起来最好的方法是创建一个矩阵,但我不确定这是不是最好的选择,或者如何计算分数

我试着这样计算分数,但这些数字没有意义:

overlaps = []
for sublist in list1:
    for sublist2 in list2:
        comb_list = sublist + sublist2
        num_overlap = len(set(comb_list))
        num_long = max(len(sublist), len(sublist2))
        overlap = num_overlap/num_long
        overlaps.append(overlap)
解决方案 因此,原始方法的问题是,您正在计算
set(sublist1+sublist2)
的长度,但您需要的是
set(sublist1)&set(sublist2)
的长度或集合交点的长度:

A=['A','b','c','x'],['d','e','f','p'],['g','h','i']]
B=['g','a','c'],['d','h','B'],['e','f','x','t','q']]
重叠=[]
对于a中的a:
对于b中的b:
重叠数量=长度(集合(a)和集合(b))
num_long=max(len(a),len(b))
重叠。追加(num\u重叠/num\u长)
输出:

[0.5,0.25,0.2,0.0,0.25,0.4,0.3333,0.3333,0.0]
理解版 既然如此喜欢理解:

overlaps=[len(set(a)和set(b))/max(len(a),len(b))表示a中的a表示b中的b]
最初的方法出了什么问题 下面是一个简单的例子,说明您最初的方法在使用前两个比较时不起作用的原因:

>>> a = ['a', 'b', 'c', 'x']
>>> b = ['g', 'a', 'c']
>>> comb_list = a + b
>>> comb_list
['a', 'b', 'c', 'x', 'g', 'a', 'c']
>>> set(comb_list)
{'c', 'g', 'a', 'x', 'b'}
原始方法的变通方法
>>透镜(梳状列表)-透镜(集合(梳状列表))
2.
但这比我在上面的解决方案中提出的要多

词典版本 由于没有上下文的分数列表可能很难解释,让我们使用字典:

scores={}
对于枚举(a,1)中的i,a:
对于枚举(b,1)中的j,b:
重叠数量=长度(集合(a)和集合(b))
num_long=max(len(a),len(b))
分数[f“a{i}b{j}]=num_重叠/num_长
对于键,分数中的val.items():
打印(f“{key}:{val}”)
输出:

a1b1:0.5
a1b2:0.25
a1b3:0.2
a2b1:0.0
a2b2:0.25
a2b3:0.4
a3b1:0.3333
a3b2:0.3333
a3b3:0.0

只是提醒一下:“重叠”听起来像是在比较元素,而不是只寻找普通元素。您如何准确地设想创建矩阵?当然,你的意思不是从列表本身创建一个矩阵,因为它们的长度不均匀……为什么最后一个是1/5?没有对手。此外,该列表是否可以包含重复的元素,如
['a','a','b','c']
?@blorgon对于重叠混淆表示抱歉,重叠是我正在处理的项目中使用的词,在本例中被定义为“重叠最大的簇(交叉点)”,因此在本例中它的意思就是重叠。在第二个例子中,你想到的是我是如何根据这个定义来实现它的,但是我的结果显示了介于1和2之间的值,但我认为它应该在0和1之间,因为它们最多会有100%的重叠?@kr419请看我的解释。长话短说,您没有正确计算交叉点。为什么要除以较长子列表的长度?如果你把这个术语作为集合并集的长度,那么你就有了一个很好的相似性