Ошибка значения: 0 отсутствует в списке в python - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь вернуть список кортежей, отсортированных по аналогичному кандидату в 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 Я пытался проверить косинус, подобный между строка, которая получила исключение и обнаружила, что все элементы имеют значение ноль?

1 Ответ

0 голосов
/ 14 апреля 2020

После более подробного изучения ошибки выяснилось, что использование словаря при обработке данных в функции приводит к замене значений, имеющих одинаковое значение косинуса. поэтому функция должна выглядеть следующим образом:

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=[]
    updated_most_candidates=[]
    q_vec=question_to_vec(question,wv_embeddings,300)
    for i in candidates:
 # print(type(i))
      can_vec=question_to_vec(i,wv_embeddings,300)

      #cosi_dic[cosine_similarity(can_vec.reshape(1,-1),  q_vec.reshape(1,-1))[0][0]]=i
      sim=cosine_similarity(can_vec.reshape(1,-1),  q_vec.reshape(1,-1))[0][0]
    #for i in (list(reversed(sorted(cosi_dic.keys(),)))):
      #most_candidates.append((candidates.index(cosi_dic[i]),cosi_dic[i]))
      most_candidates.append((sim,i))
    most_candidates.sort(key=lambda x: x[0],reverse=True)
    for i in most_candidates:
      updated_most_candidates.append((candidates.index(i[1]),i[1]))


    return updated_most_candidates
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...