Поиск аналогии со словом из заданных слов с помощью вложений Word2Vec

Опубликовано: 16 Июля, 2021

Во многих раундах квалификационных экзаменов мы часто сталкиваемся с простым вопросом, чтобы найти аналогии со словами. В задаче аналогии со словом мы завершаем предложение « a относится к b, как c относится к ___ », которое часто представляется как a: b :: c: d, и мы должны найти слово «d». Примерный вопрос может быть таким: « мужчина для женщины, как король для ___ ».

Человеческий мозг может распознать, что пробел должен быть заполнен словом « королева ». Но для того, чтобы машина могла понять этот шаблон и заполнить пробел наиболее подходящим словом, необходимо много тренироваться. Что, если мы сможем использовать алгоритм машинного обучения, чтобы автоматизировать задачу поиска аналогии слова. В этом руководстве мы будем использовать модель Word2Vec и предварительно обученную модель под названием « GoogleNews-vectors-negative300.bin », которую Google обучил более чем 50 миллиардам слов. Каждое слово в предварительно обученном наборе данных встроено в 300-мерное пространство, а слова, похожие по контексту / значению, помещаются в этом пространстве ближе друг к другу.

Методика поиска аналогичного слова:

В этой задаче наша цель - найти слово d , такое, что связанные векторы слов va, vb, vc, vd связаны друг с другом следующим соотношением: ' vb - va = vd - vc '. Мы будем измерять сходство между vb-va и vd-vc, используя косинусное сходство.

Импорт важных библиотек:

Нам необходимо установить дополнительную gensim библиотеку, чтобы использовать word2vec модель, установить gensim использовать команду «пип установить gensim» на вашем терминале / командной строки.

Python3




import numpy as np
import gensim
from gensim.models import word2vec,KeyedVectors
from sklearn.metrics.pairwise import cosine_similarity

Загрузка векторов слов с использованием предварительно обученной модели:

Python3




vector_word_notations = KeyedVectors.load_word2vec_format( 'GoogleNews-vectors-negative300.bin' ,binary = True )

Определение функции для предсказания аналогичного слова:

Python3




def analogous_word(word_1,word_2,word_3,vector_word_notations):
''' The function accepts a triad of words, word_1, word_2, word_3 and returns word_4 such that word_1:word_2::word_3:word_4 '''
# converting each word to its lowercase
word_1,word_2,word_3 = word_1.lower(),word_2.lower(),word_3.lower()
# Similarity between |word_2-word_1| = |word_4-word_3| should be maximum
maximum_similarity = - 99999
word_4 = None
words = vector_word_notations.vocab.keys()
va,vb,vc = vector_word_notations[word_1],
vector_word_notations[word_2],vector_word_notations[word_3]
# to find word_4 such that similarity
# (|word_2 - word_1|, |word_4 - word_3|) should be maximum
for i in words:
if i in [word_1,word_2,word_3]:
continue
wvec = vector_word_notations[i]
similarity = cosine_similarity(,[wvec - vc])
if similarity > maximum_similarity:
maximum_similarity = similarity
word_4 = i
return word_4

Тестируем нашу модель:

Python3




triad_1 = ( "Man" , "Woman" , "King" )
# *triad_1 is written to unpack the elements in the tuple
output = analogous_word( * triad_1,word_vectors)
print (output)
# The output will be shown as queen