Модель мешка слов (BoW) — это модель текста, которая использует представление текста, основанное на неупорядоченной коллекции (« мешке ») слов. Она используется в обработке естественного языка и информационном поиске (IR). Она игнорирует порядок слов (и, следовательно, большую часть синтаксиса или грамматики), но охватывает множественность .
Модель «мешка слов» обычно используется в методах классификации документов , где, например, частота (употребления) каждого слова используется в качестве признака для обучения классификатора . [1] Она также использовалась для компьютерного зрения . [2]
Раннее упоминание «мешка слов» в лингвистическом контексте можно найти в статье Зеллига Харриса 1954 года о структуре распределения . [3]
Ниже приведены модели текстового документа с использованием мешка слов. Вот два простых текстовых документа:
(1) Джон любит смотреть фильмы. Мэри тоже любит фильмы.
(2) Мэри также любит смотреть футбольные матчи.
На основе этих двух текстовых документов для каждого документа составляется следующий список:
«Джон» , «нравится» , « смотреть» , « фильмы» , «Мэри» , «нравится» , «фильмы» , «тоже»«Мэри» , «также» , «нравится» , « смотреть» , «футбол» , « игры»
Представим каждый набор слов как объект JSON и припишем его соответствующей переменной JavaScript :
BoW1 = { "Джон" : 1 , "нравится" : 2 , "на" : 1 , "смотреть" : 1 , "фильмы" : 2 , "Мэри" : 1 , "тоже" : 1 }; BoW2 = { "Мэри" : 1 , "также" : 1 , "нравится" : 1 , "на" : 1 , "смотреть" : 1 , "футбол" : 1 , "игры" : 1 };
Каждый ключ — это слово, а каждое значение — это количество появлений этого слова в заданном текстовом документе.
Порядок элементов свободен, поэтому, например, {"too":1,"Mary":1,"movies":2,"John":1,"watch":1,"likes":2,"to":1}
также эквивалентен BoW1 . Это также то, чего мы ожидаем от строгого представления объекта JSON .
Примечание: если другой документ представляет собой объединение этих двух,
(3) Джон любит смотреть фильмы. Мэри тоже любит фильмы. Мэри также любит смотреть футбольные матчи.
его представление в JavaScript будет следующим:
BoW3 = { "Джон" : 1 , "нравится" : 3 , "кому" : 2 , "смотреть" : 2 , "фильмы" : 2 , "Мэри" : 2 , "тоже" : 1 , "также" : 1 , "футбол" : 1 , "игры" : 1 };
Итак, как мы видим в алгебре мешков , «объединение» двух документов в представлении мешков слов формально является непересекающимся объединением , суммирующим кратности каждого элемента.
Представление BoW текста удаляет весь порядок слов. Например, представление BoW для " man bites dog " и "dog bites man" одинаково, поэтому любой алгоритм, работающий с представлением BoW текста, должен обрабатывать их одинаково. Несмотря на отсутствие синтаксиса или грамматики, представление BoW является быстрым и может быть достаточным для простых задач, не требующих порядка слов. Например, для классификации документов , если слова "stocks", "trade", "investors" встречаются несколько раз, то текст, скорее всего, является финансовым отчетом, даже если этого будет недостаточно, чтобы различить
Вчера инвесторы росли, но сегодня они отступают.
и
Вчера инвесторы отступали, но сегодня они растут.
и поэтому представление BoW будет недостаточным для определения подробного смысла документа.
Реализации модели «мешка слов» могут включать использование частот слов в документе для представления его содержимого. Частоты могут быть «нормализованы» с помощью обратной частоты документа или tf–idf . Кроме того, для конкретных целей классификации были разработаны контролируемые альтернативы для учета метки класса документа. [4] Наконец, для некоторых задач вместо частот используется двоичное (наличие/отсутствие или 1/0) взвешивание (например, эта опция реализована в системе программного обеспечения машинного обучения WEKA ).
# Сначала убедитесь, что установлены необходимые пакеты # pip install --upgrade pip # pip install tensorflow from tensorflow import keras from typing import List from keras.preprocessing.text import Tokenizerпредложение = [ "Джон любит смотреть фильмы. Мэри тоже любит фильмы." ]def print_bow ( предложение : Список [ строка ]) -> Нет : токенизатор = Токенизатор () токенизатор . fit_on_texts ( предложение ) последовательности = токенизатор . texts_to_sequences ( предложение ) word_index = токенизатор . word_index лук = {} для ключа в word_index : лук [ ключ ] = последовательности [ 0 ] . count ( word_index [ ключ ]) print ( f "Предложение с набором слов 1: \n { bow } " ) print ( f "Мы нашли { len ( word_index ) } уникальных токенов." )print_bow ( предложение )
Распространенной альтернативой использованию словарей является трюк с хешированием , когда слова напрямую сопоставляются с индексами с помощью функции хеширования. [5] Таким образом, для хранения словаря не требуется памяти. Коллизии хеширования обычно решаются путем освобождения памяти для увеличения количества хеш-корзин [ необходимо разъяснение ] . На практике хеширование упрощает реализацию моделей «мешок слов» и улучшает масштабируемость.
И этот запас комбинаций элементов становится фактором, определяющим способ, которым делается последующий выбор... поскольку язык — это не просто набор слов, а инструмент с определенными свойствами, которые были сформированы в ходе его использования.