首页 > 解决方案 > 在包含词嵌入的数组中循环

问题描述

我想检查第一个数组的第一个元素与第二个数组的所有其他元素的余弦相似度,然后检查第一个元素的第二个元素与第二个数组的所有元素的余弦相似度,依此类推。我还想存储所有匹配的数组。

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 sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
title=df1['title'].tolist()
claim=df2['claim'].tolist()
title=model.encode(title)
claim=model.encode(claim)
from sklearn.metrics.pairwise import cosine_similarity
for i in title:
   for j in claim:
      cosine_similarity(title[i].reshape(1,-1),claim[j].reshape(1,-1))

错误

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-26-7d0694ac4823> in <module>()
  1 for i in title:
  2   for j in claim:
  ----> 3     cosine_similarity(title[i].reshape(1,-1),claim[j].reshape(1,-1))
  4 

 IndexError: arrays used as indices must be of integer (or boolean) type

标签: pythonpython-3.xloopsfor-loopword-embedding

解决方案


该代码未使用整数/布尔类型变量进行索引。

实际上,代码中的 for 循环是for-each而不是for-range,因此变量 i 和 j 等于整行(字符串),而不是它们相对于整个文件的索引。

因此,您可以更改为 for-range 循环:

for i in range(len(title)):
    for j in range(len(claim)):
        cosine_similarity(title[i].reshape(1,-1),claim[j].reshape(1,-1))

或直接重塑和比较 i 和 j:

for i in title:
    for j in claim:
        cosine_similarity(i.reshape(1,-1),j.reshape(1,-1))

推荐阅读