计算一行的一列与其他所有行的余弦相似度

时间:2020-05-12 18:13:08

标签: python cosine-similarity

我想为一列行的所有组合计算余弦相似度

我的输入数据框

1   Text1
2   Text2
3   Text3
4   Text4
5   Text5

像这样,我有30000行 我的输出应包含一个新列,该列包含相似度大于90的索引列表

输出数据帧

1  Text1  [2,3]
2  Text2  [1,3]
3  Text3  [1,2]
4  Text4  [5]
5  Text5  [4]

我已经尝试过

def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])

    sum1 = sum([vec1[x] ** 2 for x in list(vec1.keys())])
    sum2 = sum([vec2[x] ** 2 for x in list(vec2.keys())])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)

    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

for i in tqdm(range(0,20)):
    list_req_90 = []
    list_req_85 = []
    text1 = data.loc[i,'Text'] 
    vector1 = text_to_vector(text1)

    for j in range(0,20):
        if (i != j):
             text2 = data.loc[j,'Text'] 
             vector2 = text_to_vector(text2)
             cosine = get_cosine(vector1, vector2)
             if cosine >= 0.90:
                  list_req_90.append(j)
             if cosine >= 0.85:
                  list_req_85.append(j)

     data.at[i,'similar_cosine_90'] = list_req_90
     data.at[i,'similar_cosine_85'] = list_req_85

这对我有用,但是它的作用是计算1,2和2,1的相似度 有什么方法可以只计算1,2的相似度,当它是2,1时,使用已经生成的输入1,2 在大型数据集上花费大量时间

0 个答案:

没有答案