Python 3.x 如何计算两个字符串列表之间的jaccard相似距离

Python 3.x 如何计算两个字符串列表之间的jaccard相似距离,python-3.x,nlp,Python 3.x,Nlp,我的意见如下: list1=[['Search','engines','using','machine','learning','pattern','detections',['machine','learning','help','Google','automatically','sift','pages'] 清单2=[‘机器’、‘学习’、‘曾经’、‘进化’、‘技术’] 我尝试了以下代码: def jaccard_相似性(列表1、列表2): 交叉点=len(列表(集合(列表1).交叉点(列表

我的意见如下:

list1=[['Search','engines','using','machine','learning','pattern','detections',['machine','learning','help','Google','automatically','sift','pages']
清单2=[‘机器’、‘学习’、‘曾经’、‘进化’、‘技术’]
我尝试了以下代码:

def jaccard_相似性(列表1、列表2):
交叉点=len(列表(集合(列表1).交叉点(列表2)))
打印(列表(集合(列表1).交叉点(列表2)))
并集=(列(列表1)+列(列表2))-交点
返回浮动(交点/并集)
jaccard_相似性(输入_列表,输入_列表1)
获取以下错误:

TypeError:不可损坏的类型:“列表”

您可以使用函数计算两个列表之间的Jaccard索引:

jaccard\u相似性(列表1[0],列表2)
返回:

['learning']
Out[7]:0.091

您还可以使用循环将函数应用于list1中的不同子列表,并获取list1和list2子列表之间的Jaccard索引

我相信您要做的是获得
list1
中每个列表的
jaccard\u相似性。如果是这样的话,只需在它们之间循环。此外,还对
jaccard\u similarity
中的行进行了一些小的修改

list1=[
    ['Search','engines','using','machine','learning','pattern','detections'], 
    ['machine','learning','helped','Google','automatically','sift','pages']
]
list2 = ['Machine','learning','ever','evolving','technology']

def jaccard_similarity(list1, list2):
    intersection = len(set(list1).intersection(list2)) #no need to call list here
    union = len(list1 + list2) - intersection #you only need to call len once here
    return intersection / union #also no need to cast to float as this will be done for you

for l in list1:
    print(jaccard_similarity(l, list2))
或者在理解中

similarities = [jaccard_similarity(l, list2) for l in list1]
编辑这里有一个更简单的方法来获取
jaccard\u相似性
btw:

def jaccard_similarity(list1, list2):
    s1, s2 = set(list1), set(list2)
    return len(s1 & s2) / len(s1 | s2)

您不能创建一组列表,即
list1
还有什么是预期输出,一个浮动列表?预期输出应该是浮动列表。在本例中,预期输出是
[0.166666666,0.166666666]
?是。完美的像这样,我已经添加了答案,请看一下@Praveenkumar