Я пытаюсь вернуть список кортежей, отсортированных по аналогичному кандидату в mosr, с вопросом и указателем этого кандидата в оригинальном списке кандидатов: я реализовал эту функцию:
from sklearn.metrics.pairwise import cosine_similarity
def rank_candidates(question, candidates, embeddings, dim=300):
"""
question: a string
candidates: a list of strings (candidates) which we want to rank
embeddings: some embeddings
dim: dimension of the current embeddings
result: a list of pairs (initial position in the list, question)
"""
cosi_dic={}
most_candidates=[]
q_vec=question_to_vec(question,embeddings,dim)
for i in candidates:
can_vec=question_to_vec(i,embeddings,dim)
cosi_dic[cosine_similarity(can_vec.reshape(1,-1), q_vec.reshape(1,-1))[0][0]]=i
for i in (list(reversed(sorted(cosi_dic.keys(),)))):
most_candidates.append((candidates.index(cosi_dic[i]),cosi_dic[i]))
return most_candidates
и functions question_to_vec
- это функция, используемая для получения среднего значения всех слов вложения векторов в предложении, здесь это функция:
def question_to_vec(question, embeddings, dim=300):
"""
question: a string
embeddings: dict where the key is a word and a value is its' embedding
dim: size of the representation
result: vector representation for the question
"""
v=np.zeros(dim)
all_vectors=[]
question=question.split()
for i in question:
if i in embeddings:
all_vectors.append(embeddings[i])
if all_vectors:
v=np.mean(all_vectors, axis=0)
return v
ожидаемый результат должен быть примерно таким: [(2, c), (0, b), (1, a)], если c является наиболее похожим с индексом два в кандидате входного списка, а a является наименее похожим. Однако, когда я попытался запустить этот код:
wv_ranking = []
for i in range(len(validation)):
line=validation[i]
q, *ex = line
ranks = rank_candidates(q, ex, wv_embeddings)
wv_ranking.append([r[0] for r in ranks].index(0) + 1)
, где wv_embeddings
- это вложения GoogleNews-vectors-positive300, я получил ошибку: ValueError: 0 is not in list
Я пытался проверить косинус, подобный между строка, которая получила исключение и обнаружила, что все элементы имеют значение ноль?