Согласно Gensim Word2Vec , я могу использовать модель word2vec в пакете gensim для вычисления сходства между двумя словами.
например
trained_model.similarity('woman', 'man')
0.73723527
Однако модель word2vec не может предсказать сходство предложений. Я обнаружил модель LSI с подобием предложений в gensim, но, похоже, это не может быть объединено с моделью word2vec. Длина корпуса каждого имеющегося у меня предложения не очень велика (короче 10 слов). Итак, есть ли простые способы достичь цели?
Ответы:
На самом деле это довольно сложная проблема, которую вы задаете. Вычисление сходства предложений требует построения грамматической модели предложения, понимания эквивалентных структур (например, «он ходил в магазин вчера» и «вчера, он ходил в магазин»), обнаружения сходства не только в местоимениях и глаголах, но и в имена собственные, поиск статистических совпадений / отношений во множестве реальных текстовых примеров и т. д.
Самое простое, что вы могли бы попробовать - хотя я не знаю, насколько хорошо это будет работать и определенно не даст вам оптимальных результатов - это сначала удалить все "стоп-слова" (такие как "the", "an "и т. д., которые не добавляют особого смысла предложению), а затем запустите word2vec для слов в обоих предложениях, просуммируйте векторы в одном предложении, просуммируйте векторы в другом предложении, а затем найдите разницу между суммы. Суммируя их, вместо того, чтобы различать слова, вы, по крайней мере, не будете зависеть от порядка слов. Тем не менее, это приведет к неудаче по многим причинам и ни в коем случае не является хорошим решением (хотя хорошие решения этой проблемы почти всегда включают в себя некоторое количество НЛП, машинного обучения и других умений).
Итак, короткий ответ: нет, простого способа сделать это (по крайней мере, не делать хорошо) не существует.
источник
Поскольку вы используете gensim, вам, вероятно, следует использовать его реализацию doc2vec. doc2vec - это расширение word2vec на уровне фраз, предложений и документов. Это довольно простое расширение, описанное здесь
http://cs.stanford.edu/~quocle/paragraph_vector.pdf
Gensim хорош тем, что он интуитивно понятен, быстр и гибок. Что здорово, так это то, что вы можете получить предварительно обученные вложения слов с официальной страницы word2vec, а слой syn0 модели Gensim Doc2Vec открыт, так что вы можете засеять вложения слов этими высококачественными векторами!
GoogleNews-vectors-negative300.bin.gz (как указано в Google Code )
Я думаю, что gensim - определенно самый простой (и пока что для меня лучший) инструмент для встраивания предложения в векторное пространство.
Существуют и другие методы преобразования предложения в вектор, кроме предложенного в статье Ле и Миколова выше. Сохер и Мэннинг из Стэнфорда, несомненно, являются двумя из самых известных исследователей, работающих в этой области. Их работа была основана на принципе композиции - семантика предложения происходит от:
Они предложили несколько таких моделей (которые становятся все более сложными) того, как использовать композиционность для построения представлений на уровне предложений.
2011 - разворачивание рекурсивного автоэнкодера (относительно просто. Начните здесь, если интересно)
2012 - матрично-векторная нейронная сеть
2013 - нейронная тензорная сеть
2015 - Дерево LSTM
все его статьи доступны на socher.org. Некоторые из этих моделей доступны, но я все же рекомендую doc2vec от gensim. Во-первых, URAE 2011 года не особенно мощный. Кроме того, он поставляется с предварительно обученными весами, подходящими для перефразирования новостных данных. Предоставляемый им код не позволяет переобучать сеть. Вы также не можете поменять местами разные векторы слов, так что вы застряли на вложениях pre-word2vec 2011 года от Turian. Эти векторы, конечно же, не на уровне word2vec или GloVe.
Еще не работал с Tree LSTM, но он кажется очень многообещающим!
tl; dr Да, используйте doc2vec от gensim. Но есть и другие методы!
источник
Если вы используете word2vec, вам необходимо вычислить средний вектор для всех слов в каждом предложении / документе и использовать косинусное сходство между векторами:
Рассчитайте сходство:
источник
вы можете использовать алгоритм Word Mover's Distance. вот простое описание ОМУ .
Ps: если вы столкнулись с ошибкой при импорте библиотеки pyemd , вы можете установить ее, используя следующую команду:
источник
После того, как вы вычислили сумму двух наборов векторов слов, вы должны взять косинус между векторами, а не разницу. Косинус можно вычислить, взяв скалярное произведение двух нормализованных векторов. Таким образом, количество слов не имеет значения.
источник
Существует функция из документации принимает список слов и сравнивая их сходство.
источник
Я хотел бы обновить существующее решение, чтобы помочь людям, которые собираются вычислять семантическое сходство предложений.
Шаг 1:
Загрузите подходящую модель с помощью gensim и вычислите векторы слов для слов в предложении и сохраните их как список слов.
Шаг 2: вычисление вектора предложения
Раньше вычисление семантического сходства между предложениями было трудным, но недавно была предложена статья под названием « ПРОСТАЯ, НО СЛОЖНАЯ БАЗА ВНЕДРЕНИЯ ПРЕДЛОЖЕНИЙ », которая предлагает простой подход: вычисление средневзвешенного числа векторов слов в предложении с последующим удалением проекции средних векторов на их первую главную составляющую. Здесь вес слова w равен a / (a + p (w)), где a - параметр, а p (w) - (оценочная) частота слова, называемая гладкой обратной частотой. .Этот метод работает значительно лучше.
Простой код для вычисления вектора приговора с помощью SIF (плавного обратной частоты) метода , предложенного в работе была дано здесь
Шаг 3: используя sklearn cosine_similarity, загрузите два вектора для предложений и вычислите сходство.
Это наиболее простой и эффективный метод вычисления сходства предложений.
источник
Я использую следующий метод, и он хорошо работает. Сначала вам нужно запустить 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/
источник
Gensim реализует модель под названием Doc2Vec для встраивания абзацев .
В виде записных книжек IPython представлены различные учебные пособия:
Другой метод будет полагаться на Word2Vec и Word Mover's Distance (WMD) , как показано в этом руководстве:
Альтернативным решением было бы полагаться на средние векторы:
Наконец, если вы можете запустить Tensorflow, вы можете попробовать: https://tfhub.dev/google/universal-sentence-encoder/2
источник
Я пробовал методы, указанные в предыдущих ответах. Это работает, но его главный недостаток заключается в том, что чем длиннее предложения, тем больше будет сходство (для вычисления сходства я использую косинусный балл двух средних вложений любых двух предложений), поскольку чем больше слов, тем больше положительных семантических эффектов. будет добавлено к предложению.
Я подумал, что мне следует передумать и вместо этого использовать вложение предложений, как описано в этой и этой статье .
источник
Группа Facebook Research выпустила новое решение под названием InferSent Results, и код опубликован на Github, проверьте их репо. Это довольно круто. Планирую использовать. https://github.com/facebookresearch/InferSent
их статья https://arxiv.org/abs/1705.02364 Аннотация: Многие современные системы НЛП полагаются на вложения слов, ранее обученные неконтролируемым образом на больших корпусах, в качестве базовых функций. Однако попытки получить вложения для больших фрагментов текста, таких как предложения, не увенчались успехом. Несколько попыток обучения неконтролируемому представлению предложений не дали достаточных результатов, чтобы получить широкое распространение. В этой статье мы покажем, как универсальные представления предложений, обученные с использованием контролируемых данных из наборов данных Stanford Natural Language Inference, могут последовательно превосходить неконтролируемые методы, такие как векторы SkipThought, в широком диапазоне задач передачи. Подобно тому, как компьютерное зрение использует ImageNet для получения функций, которые затем могут быть переданы другим задачам, наша работа имеет тенденцию указывать на пригодность логического вывода на естественном языке для переноса обучения на другие задачи НЛП. Наш кодировщик находится в открытом доступе.
источник
Если вы не используете Word2Vec, у нас есть другая модель, чтобы найти ее, используя BERT для встраивания. Ниже приведена справочная ссылка https://github.com/UKPLab/sentence-transformers
Другая ссылка для перехода на https://github.com/hanxiao/bert-as-service
источник