【问题标题】:Cosine similarity between lists is not being calculated未计算列表之间的余弦相似度
【发布时间】:2019-08-11 18:20:11
【问题描述】:

我目前正在尝试计算列表之间的相似性,并在我的数据框上创建一个新列来显示结果。但是,当我尝试这样做时,它会为我的所有数据条目返回 0(如下所示)


        list1                   list2                   similarity
[action, adventure,...]   [[zoe_saldana, action,...],..]    [0.0, 0.0,...]
         ...                     ...                       ...

这是我正在使用的代码:

def counter_cosine_similarity(c1, c2):
    terms = set(c1).union(c2)
    dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)
    magA = math.sqrt(sum(c1.get(k, 0)**2 for k in terms))
    magB = math.sqrt(sum(c2.get(k, 0)**2 for k in terms))
    try:
        return dotprod / (magA * magB)
    except ZeroDivisionError:
        pass


#SIMILARITY#
def get_similarity (row):
        similarities = []
        for idx, list_of_lists in enumerate(row['list1']):
                for l1 in list_of_lists:
                        counter_list1=Counter(l1)
                        counter_list2 = Counter(row['list2'])
                        similarities.append(counter_cosine_similarity(counter_list1,counter_list2))

        return similarities

frame['similarity']=frame.apply(lambda row: get_similarity(row), axis=1)

我一直试图了解它发生了什么,但我还没有得出结论。特别是因为当我按照下面的方式进行操作时,相似度列表会返回正确的值:

similarity=[]
for idx, list_of_lists in enumerate(frame['list1']):
        for l1 in list_of_lists:
                counter1=Counter(l1)
                for idx1 , l2 in enumerate(frame['list2']):
                        counter2=Counter(l2)
                        if idx==idx1:
                        similarity.append(counter_cosine_similarity(counter1,counter2))


如果有人可以提供帮助,我将非常感激!

【问题讨论】:

    标签: python apply cosine-similarity


    【解决方案1】:

    既然您在将它们附加到列表时能够正确地获得相似性,那么您是否有不能这样做的原因:

    frame['similarity'] = similarity
    

    【讨论】:

    • 不起作用的唯一原因是列表和数据框的长度不同(列表列表中有行 list2 有 2 个或更多列表)。但这可以解决。我真的很想了解我在第一个实现中做错了什么,因为它看起来与第二个非常相似
    • @J.Doe 它的长度可能不同,因为您需要在“if idx==idx1:”下修复该缩进。 Similarity.append(counter_cosine_similarity(counter1,counter2)) 应该被标记,所以它只在 if 条件下发生,现在不是
    • @J.Doe 如果您发布完整的代码以及您如何导入和创建该列表以及列表的值,我可以在我的计算机上运行它并弄清楚。使用您提供的内容,我无法运行您的实际代码
    猜你喜欢
    • 2017-03-19
    • 2015-05-24
    • 2015-07-21
    • 2019-12-27
    • 2017-07-07
    • 2018-04-11
    • 2016-10-22
    • 2020-03-16
    相关资源
    最近更新 更多