Как использовать вложение слов для сопоставления документа с вектором объектов, подходящим для использования с контролируемым обучением?
Слово вложение отображает каждое слово к вектору , где некоторые не слишком большое количество (например, 500). Популярные вложения слова включают в себя word2vec и Glove .
Я хочу применять контролируемое обучение для классификации документов. В настоящее время я сопоставляю каждый документ с вектором объектов, используя представление пакета слов, а затем применяю готовый классификатор. Я хотел бы заменить вектор характеристик пакета слов чем-то, основанным на существующем предварительно обученном встраивании слов, чтобы воспользоваться семантическими знаниями, содержащимися в встраивании слов. Есть ли стандартный способ сделать это?
Я могу представить некоторые возможности, но я не знаю, есть ли что-то, что имеет смысл. Подходы к кандидатам, которые я рассмотрел:
Я мог бы вычислить вектор для каждого слова в документе и усреднить их все. Тем не менее, похоже, что он может потерять много информации. Например, с представлением мешка слов, если есть несколько слов, которые очень важны для задачи классификации, и большинство слов не имеют значения, классификатор может легко понять это; если я усредню векторы для всех слов в документе, у классификатора нет шансов.
Конкатенация векторов для всех слов не работает, потому что это не приводит к вектору объектов фиксированного размера. Также это кажется плохой идеей, потому что она будет слишком чувствительной к определенному расположению слова.
Я мог бы использовать встраивание слова, чтобы объединить словарь всех слов в фиксированный набор кластеров, скажем, 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
Есть ли какой-то конкретный подход, который может хорошо работать для классификации документов?
Я не ищу параграфа 2vec или doc2vec; те требуют обучения на большом корпусе данных, а у меня нет большого корпуса данных. Вместо этого я хочу использовать существующее вложение слов.
Ответы:
Один простой метод, который, кажется, работает достаточно хорошо для коротких текстов (например, предложения или твита), состоит в том, чтобы вычислить вектор для каждого слова в документе, а затем агрегировать их, используя среднее по координатам, минимальное или максимальное значение.
Основываясь на результатах одной недавней статьи, кажется, что использование 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 dN v1, v2, ... , VN∈ Rd мин ( v1, ... , VN) max ( v1, ... , VN) U Uя= мин ( v1я, ... , VNя) р2 д , Я не знаю, лучше это или хуже, чем представление с пакетом слов, но я подозреваю, что для коротких документов это может работать лучше, чем пакет с словами, и это позволяет использовать предварительно обученные вложения слов.
TL; DR: Удивительно, но объединение min и max работает достаточно хорошо.
Ссылка:
Обучение представлению очень коротких текстов с использованием взвешенной агрегации встраивания слов. Седрик Де Бум, Стивен Ван Каннейт, Томас Деместер, Барт Дхоедт. Письма распознавания образов; Arxiv: 1607,00570. аннотация , pdf . Смотрите особенно таблицы 1 и 2.
Благодарности: Спасибо @ user115202 за то, что обратили мое внимание на эту статью.
источник
Вы можете использовать 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
Для более специальных методов вы можете попробовать взвешивать слова по-разному в зависимости от синтаксиса. Например, вы можете взвешивать глаголы сильнее, чем определители.
источник
Если вы работаете с текстом на английском языке и хотите начать с предварительно подготовленного встраивания слов, ознакомьтесь со следующим: 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 очень простым.
источник