Я сгенерировал векторы для списка токенов из большого документа, используя word2vec. Учитывая предложение, возможно ли получить вектор предложения из вектора токенов в предложении.
Как получить вектор для предложения из word2vec токенов в предложении
Ответы (9)
Существуют разные методы получения векторов предложений:
- Doc2Vec: вы можете обучить свой набор данных с помощью Doc2Vec, а затем использовать векторы предложений.
- Среднее значение векторов Word2Vec. Вы можете просто взять среднее значение всех векторов слов в предложении. Этот средний вектор будет представлять ваш вектор предложений.
- Усреднение векторов Word2Vec с TF-IDF: это один из лучших подходов, который я рекомендую. Просто возьмите векторы слов и умножьте их на их оценки TF-IDF. Просто возьмите среднее значение, и оно будет представлять ваш вектор предложений.
Есть несколько способов получить вектор для предложения. У каждого подхода есть преимущества и недостатки. Выбор зависит от задачи, которую вы хотите выполнить с вашими векторами.
Во-первых, вы можете просто усреднять векторы из word2vec. По словам Ле и Миколова, этот подход плохо работает для задач анализа тональности, потому что он "теряет порядок слов в так же, как это делают стандартные модели «мешок слов» и «не могут распознать многие сложные языковые явления, например, сарказм». С другой стороны, согласно Kenter et al. 2016, «простое усреднение словесных вложений всех слов в тексте оказалось надежной основой или функцией для множества задач», таких как задачи на сходство коротких текстов. Вариантом может быть взвешивание векторов слов с их TF-IDF, чтобы уменьшить влияние наиболее распространенных слов.
Более сложный подход, разработанный Socher et al., заключается в объединении векторов слов в порядке, заданном деревом синтаксического анализа. предложения, используя матрично-векторные операции. Этот метод работает для анализа настроений предложений, потому что он зависит от синтаксического анализа.
Можно, но не от word2vec. Композиция векторов слов для получения представлений более высокого уровня для предложений (и далее для абзацев и документов) является действительно активной темой исследования. Для этого нет одного лучшего решения, это действительно зависит от того, к какой задаче вы хотите применить эти векторы. Вы можете попробовать конкатенацию, простое суммирование, поточечное умножение, свертку и т. д. Есть несколько публикаций по этому вопросу, из которых вы можете извлечь уроки, но в конечном итоге вам просто нужно поэкспериментировать и посмотреть, что подходит вам лучше всего.
Это зависит от использования:
1) Если вы хотите получить вектор предложения только для некоторых известных данных. Проверьте вектор абзаца в этих статьях:
Куок В. Ле и Томас Миколов. 2014. Распределенные представления приговоров и документов. Эпринт Архив, 4:1188–1196.
А. М. Дай, К. Олах и К. В. Ле. 2015. Встраивание документов с помощью векторов абзацев. Электронные отпечатки ArXiv, июль.
2) Если вы хотите, чтобы модель оценивала вектор предложений для неизвестных (тестовых) предложений с неконтролируемым подходом:
Вы можете ознакомиться с этой бумагой:
3) Исследователь также ищет выходные данные определенного слоя в сети RNN или LSTM, недавний пример:
http://www.aaai.org/ocs/index.php/AAAI/AAAI16/paper/view/12195
4) Для gensim doc2vec многие исследователи не смогли получить хороших результатов, чтобы преодолеть эту проблему, следуя статье, использующей doc2vec на основе предварительно обученных векторов слов.
У Facebook есть проект SentEval для оценки качества векторов предложений.
https://github.com/facebookresearch/SentEval
6) Более подробная информация содержится в следующем документе:
Нейросетевые модели для идентификации парафраз, семантического текстового сходства, вывода на естественном языке и ответов на вопросы
А пока вы можете использовать «BERT»:
Google выпускает исходный код, а также предварительно обученные модели.
https://github.com/google-research/bert
А вот пример запуска bert как службы:
https://github.com/hanxiao/bert-as-service
Вы можете получить векторные представления предложений на этапе обучения (присоединитесь к тесту и обучите предложения в одном файле и запустите код word2vec, полученный по следующей ссылке).
Код для предложения2vec был опубликован Томасом Миколовым здесь. Предполагается, что первое слово строки является идентификатором предложения. Скомпилируйте код, используя
gcc word2vec.c -o word2vec -lm -pthread -O3 -march=native -funroll-loops
и запустите его с помощью
./word2vec -train alldata-id.txt -output vectors.txt -cbow 0 -size 100 -window 10 -negative 5 -hs 0 -sample 1e-4 -threads 40 -binary 0 -iter 20 -min-count 1 -sentence-vectors 1
ИЗМЕНИТЬ
В Gensim (разрабатываемая версия), похоже, есть метод определения векторов новых предложений. Ознакомьтесь с методом model.infer_vector(NewDocument)
в https://github.com/gojomo/gensim/blob/develop/gensim/models/doc2vec.py
Встраивания Google Universal Sentence Encoder — обновленное решение этой проблемы. Он не использует Word2vec, но в результате получается конкурирующее решение.
Вот через TFHub и Keras.
У меня были хорошие результаты от:
- Суммирование векторов слов (со взвешиванием tf-idf). Это игнорирует порядок слов, но для многих приложений этого достаточно (особенно для коротких документов).
- Быстрая отправка
Сеть глубокого усреднения (DAN) может обеспечивать встраивание предложений, в которых биграммы слов усредняются и передаются через глубокую нейронную сеть с прямой связью (DNN).
Обнаружено, что трансферное обучение с использованием встраивания предложений имеет тенденцию превосходить перенос на уровне слов, поскольку оно сохраняет семантические отношения.
Вам не нужно начинать обучение с нуля, предварительно обученные модели DAN доступны для ознакомления (проверьте модуль Universal Sentence Encoder в google hub).
допустим, это текущее предложение
import gensim
from gensim.models import Word2Vec
from gensim import models
model = gensim.models.KeyedVectors.load_word2vec_format('path of your trainig
dataset', binary=True)
strr = 'i am'
strr2 = strr.split()
print(strr2)
model[strr2] //this the the sentance embeddings.