Как модели машинного обучения понимают текст

Сегодня мы поговорим о том, что и почему из мешков слов.

Модели машинного обучения требуют ввода числовых данных. Мы называем эти числовые представления «векторами». Поэтому, если вы работаете с текстом, вам нужно будет преобразовать текст в вектор, прежде чем передавать его модели.

Построение векторов из текста обычно включает один из следующих подходов:
1) набор слов
2) встраивание слов

В этом посте мы рассмотрим только №1.

Мешок слов (ЛУК)

Мы называем это набором слов, чтобы подчеркнуть тот факт, что порядок слов не принимается во внимание.

При построении BOW каждому уникальному слову в вашем наборе обучающих документов присваивается уникальный индекс (его собственное место) в массиве (списке) фиксированной длины всех уникальных слов.

Итак, если в вашем наборе тренировочных данных есть следующие предложения:
1) «Быстрая коричневая лиса»
2) «Перепрыгнула ленивую собаку»
3) «Собака быстро залаяла»

Модель BOW будет выглядеть так:

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

Давайте сгенерируем модель BOW на Python, используя CountVectorizer из Sklearn. CountVectorizer построит для вас модель BOW.

# import the library
from sklearn.feature_extraction.text import CountVectorizer
# create an instance of count vectorizer
#
# stop_words='english', automatically removes common english words 
# like 'the' which don't carry meaning
vectorizer = CountVectorizer(stop_words='english', binary=True)
# here's our sentences
data = [
    'The quick brown fox',
    'Jumped over the lazy dog',
    'The dog barked quickly'
]
# train the model on the data
vectorizer.fit_transform(data)
# investigate the words our model extracted
vectorizer.get_feature_names()
=> ['barked', 'brown', 'dog', 'fox', 'jumped', 'lazy', 'quick', 'quickly']

Теперь мы можем создавать числовые представления любого предложения, используя эту модель. Если новое предложение содержит слово в нашей модели, индекс этого слова будет установлен на «1», иначе он будет на «0». Давай попробуем.

Вход: «Быстрая пурпурная собака».
Выход: [0, 0, 1, 0, 0, 0, 1, 0]

«1» существуют потому, что в нашем предложении были слова «собака» и «быстрый». Индексы всех остальных слов установлены на «0», потому что в нашем предложении их не было. Давайте сделаем еще несколько.

Вход: «Рыба залаяла и прыгнула».
Выход: [1, 0, 0, 0, 1, 0, 0, 0]

Вход: «Кот быстро побежал».
Выход: [0, 0, 0, 0, 0, 0, 0, 0]

В последнем примере не было ни одного слова в нашей модели, поэтому все значения равны 0. Это одна из проблем с обучением на небольшом наборе данных. Эта модель BOW была бы более полезной, если бы она была обучена тысячам предложений, прежде чем мы начнем ее использовать.

Сделаем то же самое в Python.

# the sentences we want to convert into numerical representations
input_data = [
    "The quick purple dog.",
    "The fish barked and jumped.",
    "The cat ran fast."
]
# create vectors from our data and assign to a variable
vectorized_data = vectorizer.transform(input_data)
# convert the variable into a matrix so we can read it
vectorized_data.todense()
# output: each row is a vector relating to one of our examples
=> matrix([[0, 0, 1, 0, 0, 0, 1, 0],
          [1, 0, 0, 0, 1, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0]])

Вывод каждого предложения числовой и отличается от других. Модель машинного обучения теперь может их читать и различать. Буйя!

В других статьях мы расскажем об использовании вывода BOW для регрессии или классификации, а также о том, как BOW отличаются от встраивания слов.