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


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 n ∈ R 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.