Работа с текстом в 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.