Как модели машинного обучения понимают текст
Сегодня мы поговорим о том, что и почему из мешков слов.
Модели машинного обучения требуют ввода числовых данных. Мы называем эти числовые представления «векторами». Поэтому, если вы работаете с текстом, вам нужно будет преобразовать текст в вектор, прежде чем передавать его модели.
Построение векторов из текста обычно включает один из следующих подходов:
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 отличаются от встраивания слов.