Как реализовать подготовку текстовых данных для машинного обучения с помощью Scikit-learn

машинное обучение алгоритм scikit-learn API

Перед использованием текстовых данных для построения прогностических моделей требуется специальная подготовка.

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

scikit-learn предоставляет простые инструменты, помогающие нам токенизировать и извлекать функции из ваших текстовых данных.

В этом посте вы узнаете, как реализовать подготовку текстовых данных для машинного обучения с помощью scikit-learn в Python.

Прочитав эту статью, вы будете знать:

  • Как использовать CountVectorizer для преобразования текста в частотный вектор слов.
  • Как извлечь векторы веса слова из текста с помощью TfidfVectorizer.
  • Как сопоставить текст с индексами объектов с помощью HashingVectorizer.

Давайте начнем.

Модель «мешок слов».

При работе с алгоритмами машинного обучения мы не можем работать напрямую с текстом. Вместо этого нам нужно преобразовать текст в числа.

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

В области машинного обучения есть простая и эффективная модель для текстовых документов, называемая моделью Bag-of-Words, или сокращенно BOW.

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

Этого можно добиться, присвоив каждому слову уникальный номер. Таким образом, любой документ, который мы видим, может быть закодирован в вектор фиксированной длины, равной длине словаря известных слов. Значение в каждой позиции в этом векторе — это количество или частота вхождений каждого слова в закодированном документе.

Это модель «мешка слов», нас интересует только метод кодирования, который может представлять, какие слова появляются в документе или как часто они появляются в закодированном документе, без учета какой-либо информации о порядке.

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

scikit-learn предоставляет 3 различных метода, которые мы можем использовать, и мы кратко рассмотрим каждый из них.

CountVectorizer - подсчитывает количество слов

CountVectorizerПредоставляет простой способ не только преобразовать набор данных текстовых документов в термины и создать словарь известных слов, но и использовать этот словарь для кодирования нового текста.

Способ применения следующий:
1. Создайте экземпляр класса CountVectorizer.
2. Вызовите функцию fit(), чтобы выучить словарь из одного или нескольких документов.
3. Примените функцию transform() к одному или нескольким документам, закодировав каждый документ в вектор.

Закодированный вектор возвращает длину всего словаря и количество раз, которое каждое слово появляется в документе.

Поскольку эти векторы содержат много нулей, мы называем их разреженными. Питон вscipy.sparseБиблиотека предоставляет эффективный способ обработки таких разреженных векторов.

Векторы, возвращаемые вызовом transform(), являются разреженными векторами. Вы можете преобразовать их в массивы numpy, которые более интуитивно понятны и понятны. Этот шаг можно выполнить, вызвав функцию toarray().

Ниже приведен пример использования CountVectorizer для токенизации, построения словаря и кодирования документов.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__from sklearn.feature_extraction.text import CountVectorizer
# 文本文档列表
text = ["The quick brown fox jumped over the lazy dog."]
# 构造变换函数
vectorizer = CountVectorizer()
# 词条化以及建立词汇表
vectorizer.fit(text)
# 总结
print(vectorizer.vocabulary_)
# 编码文档
vector = vectorizer.transform(text)
# 总结编码文档
print(vector.shape)
print(type(vector))
print(vector.toarray())__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Как видно из примера выше, мы просматриваем словарь, чтобы увидеть, что именно лемматизировано:

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__print(vectorizer.vocabulary_)__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Как видите, по умолчанию все слова в нижнем регистре, а знаки препинания игнорируются. Эти параметры и другие аспекты лемматизации настраиваются, я предлагаю вамДокументация APIчтобы увидеть все варианты.

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

Видно, что закодированный вектор представляет собой разреженную матрицу. Наконец, мы можем видеть закодированный вектор в виде массива, показывающего, что каждое слово имеет вхождение 1, за исключением слова с индексом 7, которое имеет вхождение 2.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__{'dog': 1, 'fox': 2, 'over': 5, 'brown': 0, 'quick': 6, 'the': 7, 'lazy': 4, 'jumped': 3}
(1, 8)
<class 'scipy.sparse.csr.csr_matrix'>
[[1 1 1 1 1 1 1 2]]__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Важно отметить, что этот метод количественной оценки можно использовать для документов, содержащих слова, не встречающиеся в словаре. Эти слова игнорируются, и тогда количество вхождений не задается в результирующем векторе.

Ниже приведен пример кодирования документа, содержащего слово в словаре и слово, которого нет в словаре, с помощью инструмента токенизации, описанного выше.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__# 编码其他文档
text2 = ["the puppy"]
vector = vectorizer.transform(text2)
print(vector.toarray())__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

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

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__[[0 0 0 0 0 0 0 1]]__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

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

TfidfVectorizer - Рассчитать веса слов

Подсчет вхождений слов является хорошей отправной точкой, но также и очень простой функцией.

Одна из проблем с простыми подсчетами заключается в том, что некоторые слова, такие как «the», появляются так много раз, что их подсчеты не имеют особого смысла для кодирования векторов.

Альтернативным методом является подсчет весов слов, в настоящее время наиболее популярным методом являетсяTF-IDF. Это аббревиатура, расшифровывающаяся как «Term Frequency-Inverse Document Frequency», что означает важность слова в документе.

Термин Частота: Относится к тому, сколько раз данное слово появляется в документе.
Обратная частота документа (обратная частота документа): Чем выше частота слова появляется в документе, тем ниже значение IDF.

Помимо математики, TF-IDF дает веса слов и помечает более интересные слова, например слова, которые очень часто встречаются только в определенном документе, но не часто встречаются во всех документах.

TfidfVectorizerДокументы могут быть токенизированы, списки словарей и обратные весовые коэффициенты частоты документов могут быть изучены, а новые документы могут быть закодированы. В качестве альтернативы, если вы изучили вектор с помощью CountVectorizer, вы можете использоватьTfidftransformerфункция, которая вычисляет обратную частоту документа и начинает кодировать документ.

Точно так же функции создания, подгонки и преобразования называются так же, как CountVectorizer.

Ниже приведен пример использования TfidfVectorizer для изучения словарного запаса и обратной частоты документов для 3 небольших документов и кодирования одного из них.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__from sklearn.feature_extraction.text import TfidfVectorizer
# 文本文档列表
text = ["The quick brown fox jumped over the lazy dog.",
"The dog.",
"The fox"]
# 创建变换函数
vectorizer = TfidfVectorizer()
# 词条化以及创建词汇表
vectorizer.fit(text)
# 总结
print(vectorizer.vocabulary_)
print(vectorizer.idf_)
# 编码文档
vector = vectorizer.transform([text[0]])
# 总结编码文档
print(vector.shape)
print(vector.toarray())__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

В приведенном выше примере мы изучили словарь из 8 слов из документа, и каждому слову был присвоен уникальный целочисленный индекс в выходном векторе.

Мы рассчитали обратную частотность документа для каждого слова в словаре, присвоив наблюдаемому наиболее частому употреблению слова «the» (индекс 7) самый низкий балл 1,0.

Наконец, первый документ закодирован в разреженную матрицу из 8 элементов, и мы можем посмотреть на окончательную оценку веса для каждого слова, и мы можем увидеть, что значения «the», «fox» и «dog» различны. от других слов в словаре.Слова имеют разные значения.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__{'fox': 2, 'lazy': 4, 'dog': 1, 'quick': 6, 'the': 7, 'over': 5, 'brown': 0, 'jumped': 3}
[ 1.69314718 1.28768207 1.28768207 1.69314718 1.69314718 1.69314718
1.69314718 1. ]
(1, 8)
[[ 0.36388646 0.27674503 0.27674503 0.36388646 0.36388646 0.36388646
0.36388646 0.42983441]]__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Эти оценки нормализованы до значения от 0 до 1, а закодированные векторы документов могут использоваться непосредственно в большинстве алгоритмов машинного обучения.

HashingVectorizer - хеширование квантованного текста

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

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

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

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

Ниже приведен пример кодирования одного документа с помощью HashingVectorizer.

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

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

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__from sklearn.feature_extraction.text import HashingVectorizer
# 文本文档列表
text = ["The quick brown fox jumped over the lazy dog."]
# 创建变换函数
vectorizer = HashingVectorizer(n_features=20)
# 编码文档
vector = vectorizer.transform(text)
# 总结编码文档
print(vector.shape)
print(vector.toarray())__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Запуск примера кода кодирует образец документа в разреженную матрицу из 20 элементов.

Значение закодированного документа соответствует регуляризованному количеству слов, значение по умолчанию находится в диапазоне от -1 до 1, но значение по умолчанию можно изменить и задать целочисленное значение счетчика.

__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__(1, 20)
[[ 0. 0. 0. 0. 0. 0.33333333
0. -0.33333333 0.33333333 0. 0. 0.33333333
0. 0. 0. -0.33333333 0. 0.
-0.66666667 0. ]]__Wed Nov 01 2017 10:39:44 GMT+0800 (CST)____Wed Nov 01 2017 10:39:44 GMT+0800 (CST)__

Глубокое чтение

В этом разделе мы предлагаем вам некоторые подробные материалы для чтения для этой статьи.

обработка естественного языка

scikit-learn

API класса

Суммировать

В этом руководстве вы узнаете, как использовать scikit-learn для подготовки текстовых данных для машинного обучения.

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

Посмотреть исходный английский текст:How to Prepare Text Data for Machine Learning with scikit-learn

благодарныйСюэ МиндэнОбзор этой статьи.

Этот контент находится в теменаука о данных

Следить за темой
связанная тема:

связанная информация

Введение в сортировку машинного обучения LTR — линейные модели

AWS и Microsoft объединяются для выпуска Gluon API для быстрого создания моделей машинного обучения

Проприета находится в цехе, и самосовершенствование отличной платформы обучения машины

Машинное обучение в технологии блокчейн

Справочные коды для внутренних программистов для преобразования алгоритмов: четырехкратное царство крупномасштабных платформ машинного обучения

Связанный контент производителя

Открыть за секунды! Ele.me Mobile Performance Visualization Road

Ключевая технология, стоящая за сотнями миллионов видеозвонков WeChat

Применение обратной связи по релевантности Tumblr в рекомендательных системах

Jingdong искусственная интеллектуальная посадочная практика опыта

Получите новейшие инструменты, фреймворки для искусственного интеллекта, машинного обучения и глубокого обучения

Связанные спонсоры

Привет друг!

тебе нужноЗарегистрируйте учетную запись InfoQилиАвторизоватьсяМожет комментировать. Некоторые настройки необходимы после завершения регистрации.

Получите больше опыта от InfoQ.

Скажи нам что ты думаешь

комментарий сообществаWatch Thread закрытие закрытие закрытие