Применить вложения слов ко всему документу, чтобы получить вектор объектов


38

Как использовать вложение слов для сопоставления документа с вектором объектов, подходящим для использования с контролируемым обучением?

Слово вложение отображает каждое слово к вектору , где некоторые не слишком большое количество (например, 500). Популярные вложения слова включают в себя word2vec и Glove .весvрdd

Я хочу применять контролируемое обучение для классификации документов. В настоящее время я сопоставляю каждый документ с вектором объектов, используя представление пакета слов, а затем применяю готовый классификатор. Я хотел бы заменить вектор характеристик пакета слов чем-то, основанным на существующем предварительно обученном встраивании слов, чтобы воспользоваться семантическими знаниями, содержащимися в встраивании слов. Есть ли стандартный способ сделать это?

Я могу представить некоторые возможности, но я не знаю, есть ли что-то, что имеет смысл. Подходы к кандидатам, которые я рассмотрел:

  • Я мог бы вычислить вектор для каждого слова в документе и усреднить их все. Тем не менее, похоже, что он может потерять много информации. Например, с представлением мешка слов, если есть несколько слов, которые очень важны для задачи классификации, и большинство слов не имеют значения, классификатор может легко понять это; если я усредню векторы для всех слов в документе, у классификатора нет шансов.

  • Конкатенация векторов для всех слов не работает, потому что это не приводит к вектору объектов фиксированного размера. Также это кажется плохой идеей, потому что она будет слишком чувствительной к определенному расположению слова.

  • Я мог бы использовать встраивание слова, чтобы объединить словарь всех слов в фиксированный набор кластеров, скажем, 1000 кластеров, где я использую косинусное сходство векторов как меру сходства слов. Тогда вместо пакета слов у меня мог бы быть пакет кластеров: вектор признаков, который я предоставляю классификатору, мог бы быть вектором 1000, где й компонент подсчитывает количество слов в документе, который являются частью кластера .яя

  • Для данного слова эти вложения позволяют мне вычислить набор из 20 самых похожих слов и их оценки сходства . Я мог бы адаптировать вектор признаков, подобный сумке слов, используя это. Когда я вижу слово w , в дополнение к увеличению элемента, соответствующего слову w, на 1 , я могу также увеличить элемент, соответствующий слову w_1, на s_1 , увеличить элемент, соответствующий слову w_2, на s_2 и так далее.w 1 , , w 20 с 1 , , с 20 w w 1 w 1 с 1 w 2 с 2весвес1,...,вес20s1,...,s20весвес1вес1s1вес2s2

Есть ли какой-то конкретный подход, который может хорошо работать для классификации документов?


Я не ищу параграфа 2vec или doc2vec; те требуют обучения на большом корпусе данных, а у меня нет большого корпуса данных. Вместо этого я хочу использовать существующее вложение слов.


1
Вы определились с конкретным методом представления документов с использованием предварительно обученных вложений? Возможно, это могло бы помочь немного?
turdus-merula

1
@ user115202, аккуратно! Это не решает проблему, которая у меня была, но это умная идея, о которой стоит знать - спасибо, что указали на это! Я никогда не находил очень хорошего решения этой проблемы, которое было бы значительно лучше, чем просто использование пакета слов. Может быть, это не то, что вложения слов хороши в. Благодарность!
DW

Эта проблема также связана с вашей проблемой, возможно, немного больше, чем предыдущая: Обучение представлению очень коротких текстов с использованием взвешенной агрегации встраивания слов .
turdus-merula


1
Почему бы не использовать RNN? Документы переменной длины не являются проблемой для RNN. wildml.com/2015/09/…
калу

Ответы:


23

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

Основываясь на результатах одной недавней статьи, кажется, что использование min и max работает достаточно хорошо. Это не оптимально, но это просто и примерно так же хорошо или лучше, чем другие простые методы. В частности, если векторами для слов в документе являются , то вы вычисляете и . Здесь мы берем координатный минимум, т. Минимум - это такой вектор , что и аналогично для максимума. Вектор признаков - это объединение этих двух векторов, поэтому мы получаем вектор признаков вv 1 , v 2 , , v nR d min ( v 1 , , v n ) max ( v 1 , , v n ) u u i = min ( v 1 i , , v n i ) R 2 dNv1,v2,...,vNрdмин(v1,...,vN)Максимум(v1,...,vN)UUязнак равномин(vя1,...,vяN)р2d, Я не знаю, лучше это или хуже, чем представление с пакетом слов, но я подозреваю, что для коротких документов это может работать лучше, чем пакет с словами, и это позволяет использовать предварительно обученные вложения слов.

TL; DR: Удивительно, но объединение min и max работает достаточно хорошо.

Ссылка:

Обучение представлению очень коротких текстов с использованием взвешенной агрегации встраивания слов. Седрик Де Бум, Стивен Ван Каннейт, Томас Деместер, Барт Дхоедт. Письма распознавания образов; Arxiv: 1607,00570. аннотация , pdf . Смотрите особенно таблицы 1 и 2.

Благодарности: Спасибо @ user115202 за то, что обратили мое внимание на эту статью.


4
для короткого текста, avg / min / max может хорошо работать, но что если длинный текст, такой как новостная статья?
авокадо

1
Для любого, кто читает эту статью и запутывается так же, как и я: статья не фокусируется на подходе, упомянутом @DW, они лишь кратко упоминают его в разделе «5.1. Исходные условия» как базовый подход. Основная часть статьи посвящена их собственной методике, которая включает в себя обучение классификатора с использованием вложений, что намного сложнее, чем подход, изложенный здесь!
Мигвелл

16

Вы можете использовать doc2vec, похожий на word2vec, и использовать предварительно обученную модель из большого корпуса. Затем используйте что-то вроде .infer_vector()gensim для создания вектора документа. Обучение doc2vec не обязательно должно происходить из тренировочного набора.

Другой метод заключается в использовании RNN, CNN или сети прямой связи для классификации. Это эффективно объединяет векторы слов в вектор документа.

Вы также можете комбинировать разреженные элементы (слова) с плотными (векторными) элементами, чтобы дополнять друг друга. Таким образом, ваша матрица признаков будет представлять собой конкатенацию матрицы разреженных пакетов слов со средним значением векторов слов. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Другой интересный метод - использовать алгоритм, аналогичный word2vec, но вместо предсказания целевого слова вы можете предсказать целевую метку. Это напрямую настраивает векторы слов на задачу классификации. http://arxiv.org/pdf/1607.01759v2.pdf

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


6

Если вы работаете с текстом на английском языке и хотите начать с предварительно подготовленного встраивания слов, ознакомьтесь со следующим: https://code.google.com/archive/p/word2vec/

Это оригинальная C версия word2vec. Наряду с этим выпуском они также выпустили модель, обученную на 100 миллиардов слов, взятых из статей Новостей Google (см. Подраздел «Предварительно обученные векторы слов и фраз»).

По моему мнению и опыту работы над встраиванием слов, для классификации документов такая модель, как doc2vec (с CBOW), работает намного лучше, чем мешок слов.

Поскольку у вас небольшой корпус, я полагаю, вы инициализируете свою матрицу встраивания слов с помощью предварительно обученных встраиваний, упомянутых выше. Затем тренируйтесь для вектора абзаца в коде doc2vec. Если вы знакомы с Python, вы можете проверить его версию Gensim, которую очень легко изменить.

Также проверьте этот документ, который детализирует внутреннюю работу word2vec / doc2vec: http://arxiv.org/abs/1411.2738 . Это сделает понимание кода gensim очень простым.


1
Спасибо за предложения. Я не прошу слова вложения; Я уже знаю, как получить предварительно обученное встраивание слова (я упомянул word2vec в моем вопросе). Мой вопрос заключается в том, как построить конструктивные векторы из предварительно обученного встраивания слов. Я ценю ссылку на doc2vec, но мой корпус довольно мал, и поэтому я подозреваю / боюсь, что попытка обучить кодам doc2vec будет соответствовать и работать плохо (даже если я инициализирую матрицу с предварительно обученными вложениями).
DW
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.