Мешок слов (Byokt vlkf)

Перейти к навигации Перейти к поиску

Мешок слов (англ. bag-of-words) — упрощенное представление текста, которое используется в обработке естественных языков и информационном поиске. В этой модели текст (одно предложение или весь документ) представляется в виде мешка (мультимножества) его слов без какого-либо учета грамматики и порядка слов, но с сохранением информации об их количестве.

Мешок слов обычно используется в методах классификации документов, где частотность вхождения слова используется как признак для обучения классификатора[1].

Одно из первых упоминаний «мешка слов» в лингвистическом контексте встречается в статье 1954 года Зеллига Харриса Distributional Structure[2].

Модель «мешок слов» также используется в задачах компьютерного зрения[3].

Пример реализации[править | править код]

Далее приводится пример моделирования текста с помощью мешка слов на языке программирования JavaScript.

Возьмем два простых документа:

(1) Иван любит смотреть фильмы. Мария тоже любит фильмы.
(2) Иван также любит смотреть футбольные матчи.

Для каждого документа строится список его слов:

«Иван», «любит», «смотреть», «фильмы», «Мария», «тоже», «любит», «фильмы»
«Иван», «также», «любит», «смотреть», «футбольные», «матчи»

Из этих списков можно создать объекты, представляющие мешок слов:

 BoW1 = { "Иван" : 1, "любит" : 2, "смотреть" : 1, "фильмы" : 2, "Мария" : 1, "тоже" : 1 }; 
 BoW2 = { "Иван" : 1, "также" : 1, "любит" : 1, "смотреть" : 1, "футбольные" : 1, "матчи" : 1 };

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

Если объединить эти два документа в третий документ

(3) Иван любит смотреть фильмы. Мария тоже любит фильмы. Иван также любит смотреть футбольные матчи.

то его представление в виде мешка слова имеет вид

BoW3 = { "Иван" : 2, "любит" : 3, "смотреть" : 2, "фильмы" : 2, "Мария" : 1, "тоже" : 1, "также" : 1, "футбольные" : 1, "матчи" : 1 };

Как видно, в алгебре мешков «объединение» двух документов является дизъюнктным объединением, суммирующим кратности элементов:

Применение[править | править код]

На практике модель мешка слов в основном используется для формирования признаков. На основе мешка слова можно вычислять различные меры, характеризующие исходный текст. Чаще всего по мешку слов находят абсолютную частотность слов, то есть количество появлений каждого слова во всем тексте. В приведенном выше примере можно построить следующие два списка, или вектора, абсолютных частотностей слов (BoW1 и BoW2 упорядочены как BoW3):

(1) [1, 2, 1, 2, 1, 1, 0, 0, 0]
(2) [1, 1, 1, 0, 0, 0, 1, 1, 1]

Каждое число списка соответствует количеству появлений соответствующего слова в тексте, также это можно назвать гистограммой. Например, в первом списке первые два числа — это «1, 2»: первое число соответствует слову «Иван», которое появляется в первом документе только 1 раз, второе число соответствует слову «любит», которое появляется в 2 раза.

Этот список не сохраняет порядок слов оригинального предложения, что является основной особенностью модели «мешка слов».

Мешок слов имеет несколько успешных приложений, например фильтрация электронной почты[3].

Однако, частотность слов не всегда являются наилучшей характеристикой текста. Распространенные слова, такие как «и», «в», «но», почти всегда имеют наивысшую частотность в тексте. Таким образом, высокая частотность появления слова не обязательно означает, что это слово является более важным по смыслу. Популярным способом решения этой проблемы является мера TF-IDF, которая нормализует частотность слова в документе делением на частотность этого слова во всей коллекции документов. Кроме того, для задач классификации были разработаны альтернативы определения частотностей с помощью обучения с учителем, которые учитывают тип документа[4]. Наконец, в некоторых задачах вместо частотностей слов используют бинарные веса (наличие/отсутствие, 1/0), например, такая опция есть в системе машинного обучения Weka.

N-грамма[править | править код]

Модель «мешок слов» — это неупорядоченное представление документа, в котором важно только количество слов. Например, в приведенном выше примере «Иван любит смотреть фильмы. Мария тоже любит фильмы», мешок слов не содержит информации о том, что глагол «любит» всегда следует после имени человека. Эту пространственную информацию может сохранить модель N-грамм. Применяя к приведенному примеру модель биграмм, получим следующее представление текста:

[ 
  "Иван любит", 
  "любит смотреть", 
  "смотреть фильмы", 
  "Мария любит", 
  "любит фильмы", 
  "фильмы тоже", 
]

Мешок слов можно рассматривать как частный случай модели n-грамм при n = 1. Для n > 1 модель называется w-shingling (где w, также как n, обозначает количество сгруппированных слов). Подробнее см. в статье о языковой модели.

Реализация на Python[править | править код]

from keras.preprocessing.text import Tokenizer

sentence = ["Иван любит смотреть фильмы. Мария тоже любит фильмы."]

def print_bow(sentence: str) -> None:
    tokenizer = Tokenizer()
    tokenizer.fit_on_texts(sentence)
    sequences = tokenizer.texts_to_sequences(sentence)
    word_index = tokenizer.word_index 
    bow = {}
    for key in word_index:
        bow[key] = sequences[0].count(word_index[key])

    print(f"Мешок слов предложения 1:\n{bow}")
    print(f'Нашли {len(word_index)} уникальных токенов.')

print_bow(sentence)

Хэширование признаков[править | править код]

Распространенной альтернативой представлению мешка слов словарем является метод хэширования признаков[en], в котором слова с помощью хэш-функции преобразуются в индексы массива[5]. Таким образом, не требуется память, чтобы хранить ключи словаря. Коллизии хеш-функции разрешаются освобождением памяти, что позволяет увеличить количество хэш-корзин. Практически, хэширование упрощает реализацию мешка слов и улучшает масштабируемость.

Фильтрация спама[править | править код]

В байесовской фильтрации спама сообщения электронной почты моделируется неупорядоченным набором слов, выбранных из одного из двух распределений вероятностей: спама и обычных электронных писем (ham). Построим мешок слов для каждого из типов писем, одна будет содержать слова из всех спам-сообщений, а другая — слова из обычных сообщений. Мешок слов для спама будет содержать слова, связанные со спамом, такие как «акции», «виагра» и «покупать», значительно чаще, а мешок для ham будет содержать больше слов, связанных с друзьями или работой.

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

См. также[править | править код]

Примечания[править | править код]

  1. McTear et al 2016, p. 167.
  2. Harris, Zellig (1954). "Distributional Structure". Word (англ.). 10 (2/3): 146—62. И этот запас комбинаций элементов становится фактором того, какие решения выбираются затем... потому что язык - это не просто мешок слов, а инструмент с особыми свойствами, которые были созданы при его использовании
  3. 1 2 Sivic, Josef (April 2009). http://www.di.ens.fr/~josef/publications/sivic09a.pdf (PDF). IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 31, NO. 4. IEEE. pp. 591—605. Архивировано (PDF) 22 февраля 2016. Дата обращения: 7 февраля 2021. {{cite conference}}: В |url= пропущен заголовок (справка)
  4. Youngjoong Ko (2012). "A study of term weighting schemes using class information for text classification". SIGIR'12. ACM.
  5. Weinberger, K. Q. (2009). "Feature hashing for large scale multitask learning,". Proceedings of the 26th Annual International Conference on Machine Learning: 1113—1120. arXiv:0902.2206. Bibcode:2009arXiv0902.2206W.

Литература[править | править код]

  • McTear, Michael (et al) (2016). The Conversational Interface. Springer International Publishing.