Поиск аналогии со словом из заданных слов с помощью вложений Word2Vec
Во многих раундах квалификационных экзаменов мы часто сталкиваемся с простым вопросом, чтобы найти аналогии со словами. В задаче аналогии со словом мы завершаем предложение « 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 |