【问题标题】:Cosine similarity between columns of two different DataFrame两个不同DataFrame的列之间的余弦相似度
【发布时间】:2021-10-07 23:12:48
【问题描述】:

我想计算两个 DataFrame 之间的余弦相似度(对于不同的大小)并将结果存储在新数据中。使用 BERT 嵌入计算相似度

 df1
title
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet

df2
claim
fact checked claims one
fact checked claims tweet

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
df_1['title_embeddings']=df_1['title'].apply(lambda x: model.encode(x))
df_2['claim_embeddings']=df_2['claim'].apply(lambda x: model.encode(x))

sim_score=[]
text =[]
for i in range(len(df['claim_embeddings'])):
   t=df['title_embeddings'].apply(lambda x: cosine_similarity(x, df['claim_embeddings'][i]))
   sim_score.append(t)
   text.append(claim_embeddings'][i])

当前错误

ValueError: Expected 2D array, got 1D array instead:

预期输出

df
title                       claims                  sim score
Lorem ipsum dolor sit amet fact checked claims one    0
Lorem ipsum dolor sit amet fact checked claims one    0
Lorem ipsum dolor sit amet fact checked claims one    0
Lorem ipsum dolor sit amet fact checked claims tweet   0  
Lorem ipsum dolor sit amet fact checked claims tweet   0
Lorem ipsum dolor sit amet fact checked claims tweet   0

我试过Calculate cosine similarity for vectors between two pandas columns?,但没有解决问题。

【问题讨论】:

  • 你可以做类似cosine_similarity(df_1['title_embeddings'].to_numpy()[:, None], df_2['claim_embeddings'].to_numpy()的事情来获得所有可能组合的相似矩阵。
  • 也会报错ValueError: setting an array element with a sequence。

标签: python python-3.x pandas bert-language-model word-embedding


【解决方案1】:

这里必须使用array.reshape(1, -1),因为您只比较单个样本。例如cosine_similarity(x.reshape(1,-1),y.reshape(1,-1))

from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
title=df['title'].tolist()
claim=df['claim'].tolist()
title=model.encode(title)
claim=model.encode(claim)
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(title[0].reshape(1,-1),claim[0].reshape(1,-1))

【讨论】:

  • 它没有解决 n*m 映射的问题,顺便说一句谢谢
  • 你是说它适用于所有标题*声明吗?
  • 它有效,但无法循环获取 title[0] 和 claim[0],有什么解决方案吗?
猜你喜欢
  • 2018-09-27
  • 2020-04-19
  • 2020-10-28
  • 1970-01-01
  • 2020-04-21
  • 2011-02-01
  • 2015-07-21
  • 2019-12-27
  • 2018-01-05
相关资源
最近更新 更多