Используйте Word2vec, чтобы определить, какие два слова в группе слов наиболее похожи - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь использовать оболочку Python вокруг Word2vec.У меня есть вложение слов или группа слов, которые можно увидеть ниже, и из них я пытаюсь определить, какие два слова наиболее похожи друг на друга.

Как я могу это сделать?

['архитектор', 'медсестра', 'хирург', 'бабушка', 'папа']

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Учитывая, что вы используете gensim's word2vec, согласно вашему комментарию:

Загрузите или обучите модель для ваших вложений, а затем, по вашей модели, вы можете позвонить:

min_distance = float('inf')
min_pair = None
word2vec_model_wv = model.wv  # Unsure if this can be done in the loop, but just to be safe efficiency-wise
for candidate_word1 in words:
    for candidate_word2 in words:
        if candidate_word1 == candidate_word2:
            continue  # ignore when the two words are the same

        distance = word2vec_model_wv.distance(candidate_word1, candidate_word2)
        if distance < min_distance:
            min_pair = (candidate_word1, candidate_word2)
            min_distance = distance

https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.distance

Может также быть сходство (я не совсем уверен, есть ли разница). https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.similarity

Если сходство становится больше с более близкими словами, как я и ожидал, тогда вы захотите максимизировать, а не минимизировать, а просто заменить вызовы функции расстояния вызовами сходства. По сути, это просто простая функция min / max для пар.

1 голос
/ 15 марта 2019
Ответ

@ rylan-feldspar, как правило, является правильным и сработает, но вы можете сделать это немного более компактно, используя стандартные библиотеки / идиомы Python, особенно itertools, функции обработки списка и сортировки.

Например, сначала используйте combinations() из itertools, чтобы сгенерировать все пары ваших слов-кандидатов:

from itertools import combinations
candidate_words = ['architect', 'nurse', 'surgeon', 'grandmother', 'dad']
all_pairs = combinations(candidate_words, 2)

Затем украсьте пары с их попарным сходством:

scored_pairs = [(w2v_model.wv.similarity(p[0], p[1]), p)
                for p in all_pairs]

Наконец, сортируйте, чтобы поставить сначала наиболее похожую пару, и сообщите, что оценка и пара:

sorted_pairs = sorted(scored_pairs, reverse=True)
print(sorted_pairs[0])  # first item is most-similar pair

Если вы хотите быть компактным, но немного менее читабельным, это может быть (long) "1-liner":

print(sorted([(w2v_model.wv.similarity(p[0], p[1]), p) 
              for p in combinations(candidate_words, 2)
             ], reverse=True)[0])

Обновление:

Интеграция предложения @ ryan-feldspar о max() и минимальность, это также должноработа, чтобы сообщить лучшую пару (но не ее счет):

print(max(combinations(candidate_words, 2),
          key=lambda p:w2v_model.wv.similarity(p[0], p[1])))
...