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

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

Odd One out проблема - одна из самых интересных и распространенных проблем, когда дело доходит до проверки навыков логического мышления человека. Он часто используется во многих конкурсных экзаменах и раундах размещения, поскольку он проверяет аналитические навыки человека и способность принимать решения. В этой статье мы собираемся написать код на Python, который можно использовать для поиска нечетных слов среди заданного набора слов.

Предположим, нам дан набор слов, таких как Apple, Mango, Orange, Party, Guava, и мы должны найти нечетное слово. Мы, как люди, можем анализировать и предсказывать, что партия - это странное слово, поскольку все остальные слова - это названия фруктов, но модели понять это и выяснить это очень сложно. Здесь мы будем использовать модель Word2Vec и предварительно обученную модель под названием « GoogleNews-vectors-negative300.bin », которую Google обучил более чем 50 миллиардам слов. Каждое слово в предварительно обученном наборе данных встроено в 300-мерное пространство, а слова, которые похожи по контексту / значению, размещаются в пространстве ближе друг к другу и имеют высокое значение косинусного сходства.

Методика определения лишнего слова:

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

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

Нам нужно установить дополнительную библиотеку gensim , чтобы использовать модель word2vec, для установки gensim используйте команду pip install 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 odd_word_out(input_words):
'''The function accepts a list of word and returns the odd word.'''
# Generate all word embeddings for the given list of words
whole_word_vectors = [vector_word_notations[i] for i in input_words]
# average vector for all word vectors
mean_vector = np.mean(whole_word_vectors,axis = 0 )
# Iterate over every word and find similarity
odd_word = None
minimum_similarity = 99999.0 # Can be any very high value
for i in input_words:
similarity = cosine_similarity([vector_word_notations[i]],[mean_vector])
if similarity < minimum_similarity:
minimum_similarity = similarity
odd_word = i
print ( "cosine similarity score between %s and mean_vector is %.3f" % (i,similarity))
print ( " The odd word is: " + odd_word)


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

Python3




input_1 = [ 'apple' , 'mango' , 'juice' , 'party' , 'orange' , 'guava' ] # party is odd word
odd_word_out(input_1)

Выход:

 Оценка косинусного сходства между яблоком и средним_вектором составляет 0,765
Оценка косинусного сходства между манго и mean_vector составляет 0,808
Оценка косинусного сходства между соком и mean_vector составляет 0,688
оценка косинусного сходства между party и mean_vector составляет 0,289
Оценка косинусного сходства между оранжевым и средним_вектором составляет 0,611
Оценка косинусного сходства между гуавой и mean_vector составляет 0,790

Странное слово: вечеринка

Точно так же для другого примера скажем:

Python




input_2 = [ 'India' , 'paris' , 'Russia' , 'France' , 'Germany' , 'USA' ]
# paris is an odd word since it is a capital and other are countries
odd_word_out(input_2)

Выход:

 Оценка косинусного сходства между Индией и mean_vector составляет 0,660 
оценка косинусного сходства между paris и mean_vector составляет 0,518
Оценка косинусного сходства между Россией и mean_vector составляет 0,691
Оценка косинусного сходства между Францией и mean_vector составляет 0,758
Оценка косинусного сходства между Германией и mean_vector составляет 0,763     
Оценка косинусного сходства между USA и mean_vector составляет 0,564

Странное слово: париж