Я пытаюсь решить следующую проблему: у меня есть набор предложений в качестве моего набора данных, и я хочу иметь возможность набрать новое предложение и найти предложение, которое новое наиболее похоже в наборе данных. Пример будет выглядеть так:
Новое предложение: " I opened a new mailbox
"
Прогноз на основе набора данных:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
Я читал, что косинусное сходство может быть использовано для решения подобных проблем в паре с tf-idf (а RNN не должны приносить существенных улучшений основным методам), или же word2vec используется для подобных проблем. Действительно ли они пригодны для использования в этом конкретном случае? Существуют ли другие методы / алгоритмы для решения этой проблемы (желательно с Python и SKLearn, но я тоже открыт для изучения TensorFlow)?
источник
Ответы:
Ваша проблема может быть решена с помощью Word2vec, а также Doc2vec. Doc2vec даст лучшие результаты, потому что он учитывает предложения при обучении модели.
Решение Doc2vec
Вы можете обучить свою модель doc2vec по этой ссылке . Возможно, вы захотите выполнить некоторые шаги предварительной обработки, такие как удаление всех стоп-слов (таких слов, как «the», «an» и т. Д., Которые не добавляют большого значения к предложению). После того, как вы обучили свою модель, вы можете найти похожие предложения, используя следующий код.
Результаты:
Приведенные выше результаты являются списком кортежей для
(label,cosine_similarity_score)
. Вы можете сопоставить результаты с предложениями, выполнивtrain[29670]
.Обратите внимание, что описанный выше подход даст хорошие результаты, только если ваша модель doc2vec содержит вложения для слов, найденных в новом предложении. Если вы попытаетесь получить сходство для какого-то напыщенного предложения, например
sdsf sdf f sdf sdfsdffg
, оно даст вам несколько результатов, но это могут быть не совсем похожие предложения, поскольку ваша обученная модель, возможно, не видела эти напыщенные слова во время обучения модели. Поэтому постарайтесь обучить свою модель как можно большему числу предложений, чтобы включить как можно больше слов для достижения лучших результатов.Решение Word2vec
Если вы используете word2vec, вам нужно вычислить средний вектор для всех слов в каждом предложении и использовать косинусное сходство между векторами.
Рассчитать сходство
источник
sentence_1.split()
делает то же самое.Word Mover's Distance (WMD) - это алгоритм для определения расстояния между предложениями. ОМУ основывается на встраивании слов (например, word2vec), которые кодируют семантическое значение слов в плотные векторы.
Например:
Источник: документ «От вложения слов в расстояния до документов»
Пакет gensim имеет реализацию ОМУ .
Для вашей проблемы вы должны сравнить введенное предложение со всеми другими предложениями и вернуть предложение с наименьшим ОМУ.
источник
Вы можете попробовать простое решение, используя sklearn, и оно будет работать нормально.
Используйте tfidfvectorizer, чтобы получить векторное представление каждого текста
Установите векторизатор со своими данными, удалив стоп-слова.
Преобразование новой записи с ранее обученным векторизатором
Вычислите косинусное сходство между этим представлением и каждым представлением элементов в вашем наборе данных.
Если у вас есть огромный набор данных, вы можете кластеризовать его (например, используя KMeans из scikit learn) после получения представления и до прогнозирования новых данных.
Этот код выполняет все эти шаги. Вы можете проверить это на моем GitHub репо .
источник
Существует несколько последних работ, основанных на вариационном авто-кодировщике в моделях RNN. Генерация предложений из непрерывного пространства с использованием реализаций pytorch: код github .
им удалось сжать семантическую, синтаксическую глобальную особенность предложения в некоторое скрытое пространство, выраженное, возможно, с помощью конечных 10-30 независимых случайных величин (факторизованное распределение).
Новая идея в этой работе, они интерполируют между двумя предложениями. и результаты были довольно удивительными.
источник
Обобщенное решение состоит из следующих шагов -
Для 1. word2vec - лучший выбор, но если вы не хотите использовать word2vec, вы можете сделать некоторые приближения к нему. Одним из способов является создание матрицы совпадений слов из ваших обученных предложений с последующим применением к ним ЦВД . Coccurance матрицаn XN размерность при преобразовании в n Xd размерность, делает для векторов слова d Габаритные размеры.
Получив вложение слов каждого слова, вы можете применить к каждому предложению любую метрику сходства, например косинусное сходство и т. Д., Чтобы измерить сходство с другими.
источник