Работа с текстом в ML — одно из самых интеллектуально стимулирующих упражнений, но недостатком этого упражнения является то, что наши алгоритмы ML не могут напрямую работать с текстом, все эти алгоритмы ML требуют чисел в качестве параметров. Это означает, что наши текстовые данные должны быть преобразованы в векторы чисел. На жаргоне обработки естественного языка это называется извлечением признаков. В частности, извлечение текстовых признаков.

CountVectorizer — это класс, написанный на sklearn, чтобы помочь нам преобразовать текстовые данные в векторы чисел. Я буду использовать пример, представленный в sklearn. Перво-наперво; нам нужно импортировать класс из sklearn, чтобы иметь к нему доступ.

Поскольку мы будем использовать пример из sklearn [1], у нас будет корпус с четырьмя документами. Это текстовые данные, которые мы преобразуем в векторы. Предполагая, что вы все еще второкурсник, вектор - это указатель или, проще говоря, массив 1 * 1. Например, в нашем корпусе ниже у нас будет четыре вектора, в каждом векторе мы будем хранить некоторые числовые входные данные, которые представляют наши текстовые данные. Корпус — это набор фрагментов языка, коллекция может включать список, графы, деревья и т. д.

corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]

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

vectorizer = CountVectorizer()

Есть пара параметров, которые принимает класс. Одним из значимых является анализатор, который имеет три варианта. Word, char и char_ws. В анализаторе вы указываете, как n-грамма должна обрабатывать ваши данные, должна ли она обрабатывать их как символы или как слова. Таким образом, если вы настроите свой анализатор на слово, а n-gram_range на (2, 2), он выберет два соседних слова и соединит их. Если ваш n-gram_range установлен в (1, 2), наш словарь будет принимать слово плюс пары (соседние пары). Теперь, когда мы инициализировали класс, у нас есть объект, который мы можем использовать для доступа к его методам. В нем есть функция() с именем fit_transform, которой мы возьмем наш корпус в качестве параметра и преобразуем текстовые данные в векторы. Для этого в этом методе используется метод Bag of Words (BoW).

X = vectorizer.fit_transform(corpus)

Мешок слов

То, что делает Bag of words, похоже на то, что делает функция flatten() в python;

1. Сначала форма массива сворачивается в одно измерение, а затем удаляются все дубликаты. Таким образом, мы получим такой вывод:

«Это», «есть», «тот», «первый», «документ», «второй», «и», «третий», «один».

Но функция get_feature_names() вернет что-то вроде этого:

«и», «документ», «первый», «является», «один», «второй», «тот», «третий», «этот»

Это связано с тем, что массив отсортирован в алфавитном порядке.

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

В нашем словаре 9 элементов. Таким образом, в каждом из наших векторов (индексов) массива будет по 9 элементов.

Примерно так (это до расчетов)

[ 0  0  0  0  0  0  0  0  0 ]
[ 0  0  0  0  0  0  0  0  0 ]
[ 0  0  0  0  0  0  0  0  0 ]
[ 0  0  0  0  0  0  0  0  0 ]

Запомните все эти числа, представляющие наш словарь «и», «документ», «первый», «есть», «один», «второй», «тот», «третий», «этот».

Для первого элемента вы спрашиваете, появляется ли он в документе, о котором идет речь, и сколько раз он появляется. Для «Это первый документ» мы видим, что термин «и», который является первым термином в нашем словаре, не встречается в нашем документе (мы имеем дело с первым документом), поэтому мы заменяем его индекс на 0. Второй термин это «документ», который появляется в документе один раз, поэтому мы заменяем второй индекс на 1. В конце для первого вектора у вас должно получиться что-то вроде этого.

[0 1 1 1 0 0 1 0 1]

Цитаты

Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, стр. 2825–2830, 2011.

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html