Как вычислить сходство предложений с помощью модели word2vec gensim с python



по словам Word2Vec Gensim, Я могу использовать модель word2vec в пакете gensim для вычисления сходства между 2 словами.



например



trained_model.similarity('woman', 'man') 
0.73723527


однако модель word2vec не может предсказать сходство предложений. Я узнаю модель LSI с подобием предложения в gensim, но, похоже, это не может быть объединено с моделью word2vec. Длина корпуса каждого предложения у меня не очень долго (менее 10 слов). Так есть ли простые способы достижения цели?

2393   11  

11 ответов:

Это на самом деле довольно сложная проблема, которую вы задаете. Вычисление сходства предложений требует построения грамматической модели предложения, понимания эквивалентных структур (например, "он вчера ходил в магазин" и "вчера он ходил в магазин"), нахождения сходства не только в местоимениях и глаголах, но и в собственных существительных, нахождения статистических совпадений / отношений во многих реальных текстовых примерах и т. д.

самое простое, что вы можно было бы попробовать - хотя я не знаю, насколько хорошо это будет работать, и это, конечно, не даст вам оптимальных результатов-было бы сначала удалить все слова "стоп" (такие слова, как "the", "an" и т. д. это не добавляет большого смысла к предложению), а затем запустите word2vec на словах в обоих предложениях, суммируйте векторы в одном предложении, суммируйте векторы в другом предложении, а затем найдите разницу между суммами. Суммируя их вместо того, чтобы делать разницу в словах, вы по крайней мере не подчиняться порядку слов. Тем не менее, это будет неудачно во многих отношениях и никоим образом не является хорошим решением (хотя хорошие решения этой проблемы почти всегда включают в себя некоторое количество НЛП, машинного обучения и другого ума).

Итак, короткий ответ, Нет, нет простой способ сделать это (по крайней мере, не делать это хорошо).

поскольку вы используете gensim, вы, вероятно, должны использовать его реализацию doc2vec. doc2vec-это расширение word2vec до уровня фразы, предложения и документа. Это довольно простое расширение, описанное здесь

http://cs.stanford.edu/~quocle / paragraph_vector. pdf

Gensim хорош, потому что он интуитивно понятен, быстр и гибок. Что здорово, так это то, что вы можете захватить предварительно обученные встраивания слов с официальной страницы word2vec и слоя syn0 модель Doc2Vec от gensim выставляется так, что вы можете посеять вложения слов с этими векторами высокого качества!

GoogleNews-vectors-negative300.бункер.ГЗ

Я думаю, что gensim, безусловно, самый простой (и до сих пор для меня лучший) инструмент для встраивания наказание в векторном пространстве.

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

1. semantics of the words

2. rules for how these words interact and combine into phrases

они предложили несколько таких моделей (становящихся все более сложными) для использования композиционности для построения представлений на уровне предложений.

2011-разворачивание рекурсивного автоэнкодера (очень сравнительно просто. начните здесь, Если интересно)

2012-матрично-векторная нейронная сеть

2013(?) - нейронная тензорная сеть

2015-дерево LSTM

все его документы доступны по адресу socher.org. некоторые из этих моделей доступны, но я все равно рекомендую gensim doc2vec. Во-первых, 2011 URAE не особенно мощный. Кроме того, он поставляется с предварительно обученными весами, подходящими для перефразирования новостных данных. Код, который он предоставляет, не позволяет вам переобучать сеть. Вы также не можете поменять местами в разных векторах word, поэтому вы застряли в 2011 году с вложениями pre-word2vec от Туриан. Эти векторы, конечно, не на уровне word2vec или перчатки.

еще не работал с деревом LSTM, но это кажется очень перспективным!

tl; dr да, используйте doc2vec gensim. Но существуют и другие методы!

Если вы используете word2vec, вам нужно вычислить средний вектор для всех слов в каждом предложении / документе и использовать косинусное сходство между векторами:

import numpy as np
from scipy import spatial

index2word_set = set(model.wv.index2word)

def avg_feature_vector(sentence, model, num_features, index2word_set):
    words = sentence.split()
    feature_vec = np.zeros((num_features, ), dtype='float32')
    n_words = 0
    for word in words:
        if word in index2word_set:
            n_words += 1
            feature_vec = np.add(feature_vec, model[word])
    if (n_words > 0):
        feature_vec = np.divide(feature_vec, n_words)
    return feature_vec

вычислить сходство:

s1_afv = avg_feature_vector('this is a sentence', model=model, num_features=300, index2word_set=index2word_set)
s2_afv = avg_feature_vector('this is also sentence', model=model, num_features=300, index2word_set=index2word_set)
sim = 1 - spatial.distance.cosine(s1_afv, s2_afv)
print(sim)

> 0.915479828613

Как только вы вычислите сумму двух наборов векторов слов, вы должны взять Косинус между векторами, а не разницу. Косинус можно вычислить, взяв точечное произведение двух нормализованных векторов. Таким образом, количество слов не является фактором.

вы можете использовать алгоритм расстояния Word Mover. вот это простое описание о WMD.

#load word2vec model, here GoogleNews is used
model = gensim.models.KeyedVectors.load_word2vec_format('../GoogleNews-vectors-negative300.bin', binary=True)
#two sample sentences 
s1 = 'the first sentence'
s2 = 'the second text'

#calculate distance between two sentences using WMD algorithm
distance = model.wmdistance(s1, s2)

print ('distance = %.3f' % distance)

P. s.: Если вы столкнулись с ошибкой об импорте pyemd библиотека, вы можете установить его с помощью следующей команды:

pip install pyemd

Я использую следующий метод, и он работает хорошо. Сначала вам нужно запустить POSTagger, а затем отфильтровать свое предложение, чтобы избавиться от стоп-слов (детерминанты, союзы,...). Я рекомендую TextBlob APTagger. Затем вы строите word2vec, беря среднее значение каждого вектора слова в предложении. Элемент метод n_similarity в Gemsim word2vec делает именно это, позволяя пройти два набора слов для сравнения.

существуют расширения Word2Vec, предназначенные для решения проблемы сравнения более длинных фрагментов текста, таких как фразы или предложения. Один из них-paragraph2vec или doc2vec.

"распределенные представления предложений и документов" http://cs.stanford.edu/~quocle / paragraph_vector. pdf

http://rare-technologies.com/doc2vec-tutorial/

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

Шаг 1:

загрузите подходящую модель с помощью gensim и вычислите векторы слов для слов в предложении и сохраните их в виде списка слов

Шаг 2 : Вычисление вектора предложения

вычисление семантического сходства между предложениями было трудно раньше, но недавно статья под названием"A ПРОСТОЙ, НО ЖЕСТКИЙ К ИЗБИЕНИЮ БАЗОВЫЙ УРОВЕНЬ ДЛЯ ПРИГОВОРА Вложения" был предложен простой подход, который предполагает вычисление средневзвешенного значения векторов слов в предложении, а затем удаление проекций средних векторов на их первую главную компоненту.Здесь вес слова w - это a / (a + p(w)) с параметром A и P (w) (оценочная) частота слова, называемая гладкой обратной частотой.этот метод работает значительно лучше.

простой код вычисление вектора предложения с использованием SIF (гладкой обратной частоты) метод, предложенный в статье, был дан здесь

Шаг 3: используя sklearn cosine_similarity загрузите два вектора для предложений и вычислите сходство.

Это самый простой и эффективный метод для вычисления сходства предложений.

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

Я думал, что должен передумать и использовать встраивание предложения вместо этого, как изучено в этой статье и этой.

есть функция от документация составление списка слов и сравнение их сходства.

s1 = 'This room is dirty'
s3 = 'dirty and disgusting room'

distance = model.wv.n_similarity(s1.lower().split(), s2.lower().split())

исследовательская группа Facebook выпустила новое решение под названием InferSent Результаты и код публикуются на Github, проверьте их РЕПО. Это довольно удивительно. Я планирую использовать его. https://github.com/facebookresearch/InferSent

их бумаги https://arxiv.org/abs/1705.02364 Абстрактный: Многие современные системы НЛП полагаются на встраивание слов, ранее обученных неконтролируемым образом на больших корпусах, в качестве базовых функций. Усилия по получению вложений для больших кусков текста, таких как предложения, однако не были столь успешными. Несколько попыток изучения неконтролируемых представлений предложений не достигли достаточно удовлетворительной производительности, чтобы быть широко принятыми. В этой статье мы покажем, как универсальные представления предложений, обученные с использованием контролируемых данных наборов данных вывода естественного языка Стэнфорда, могут последовательно превосходить неконтролируемые методы, такие как векторы пропусков, в широком диапазоне задач передачи. Как компьютерное зрение использует ImageNet для получения функций, которые затем могут быть перенесены на другие задачи, наша работа имеет тенденцию указывать на пригодность вывода естественного языка для переноса обучения на другие задачи НЛП. Наш кодировщик находится в открытом доступе.

Comments

    Ничего не найдено.