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

Полный исходный код, использованный в этой статье, доступен здесь.

Первый шаг: сбор набора данных

Amazon Review DataSet - полезный ресурс для практики. Здесь мы выбираем меньший набор данных - Одежда, обувь и украшения для демонстрации.

Формат - один обзор на строку в json.

{   
   "reviewerID": "A2SUAM1J3GNN3B",   
   "asin": "0000013714",
   "reviewerName": "J. McDonald",
   "helpful": [2, 3],
   "reviewText": "I bought this for my husband who plays the piano.  He is having a wonderful time playing these old hymns.  The music  is at times hard to read because we think the book was published for singing from more than playing from.  Great purchase though!",
   "overall": 5.0,
   "summary": "Heavenly Highway Hymns",
   "unixReviewTime": 1252800000,
   "reviewTime": "09 13, 2009" 
}

куда

  • reviewText - текст отзыва
  • общий - рейтинг товара

Если вы не знакомы с файлом json, вы можете преобразовать его в csv, просто следуя приведенному ниже коду.

Поскольку значение total составляет от 1 до 5, для удобства мы рассматриваем reviewText как две классификации - отрицательную и положительную, помеченную -1 и +1 соответственно.

Вот правила:
1. Если оценка равна 1 или 2, тогда reviewText рассматривается как отрицательный, помеченный - 1.
2.
Если оценка составляет 4 или 5, текст reviewText рассматривается как положительный, помеченный +1.
3. Игнорировать
все отзывы Текст с оценкой 3. Так как они относятся к нейтральному настроению.

Разделение набора данных на наборы для обучения и тестирования

Обучающий набор - подмножество для обучения модели.
Тестовое множество - подмножество для тестирования обученной модели.

Используя пакет scikit-learn, мы можем легко разделить данные.

Второй шаг: обработка текстовых данных

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

  • Удалите не буквенно-цифровые символы, кроме пробелов.
  • Преобразуйте все символы в нижний регистр, чтобы одинаково обрабатывать такие слова, как «Hello», «hello», «HELLO», «HEllO».
  • Рассмотрим токенизацию, стемминг и лемматизацию.

и так далее.

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

Модель-мешок слов

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

Есть два этапа - токенизация и векторизация.

Токенизация - это задача разбиения предложения на слова, называемые токенами.

Например, если мы токенизируем три предложения S1, S2 и S3, мы получим token_set, каждый элемент в нем называется токен.

S1 = "John likes to watch movies"
S2 = "Mary likes movies too"
S3 = "Joe likes horror movies and action movies"
token_set = {"John", "Mary", "Joe", "likes", "to", "watch", "movies", "too", "horror", "and", "action"}

Следующим этапом является векторизация, который создает вектор для представления текста.
Например, возьмите S3: «Джо любит фильмы ужасов и боевики. и проверьте частоту слов из tokens_set.

Джон: 0
Мэри »: 0
Джо: 1
любит: 1
кому: 0
смотреть: 0
фильмы: 2
тоже: 0
ужас: 1
и: 1
действие: 1

Таким образом, вектор S3 можно представить как:

vector_S3 = [0, 0, 1, 1, 0, 0, 2, 0, 1, 1, 1]

CountVectorizer

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

Обратите внимание, что параметр token_pattern - это регулярное выражение, обозначающее, что составляет «токен», установка token_pattern = r '\ b \ w + \ b' означает, что мы принимаем только слово как жетон.

Применяя метод fit_transform к обучающему набору (например, train_X), мы получим словарь слов (например, token_set) и вектор всех reviewText (т. е. train_vector)

Чтобы облегчить понимание результата, мы визуализируем форму train_vector и помечаем индекс, как показано в следующей таблице.

Применив метод transform к набору тестов (т.е. test_X), мы получим вектор всех reviewText с тем же token_set (т. е. test_vector)

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

Код такой:

Заключительный шаг - построение модели

Для задачи классификации мы используем популярную модель - Логистическая регрессия для демонстрации. Ниже показано, как мы используем модель.

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

Я надеюсь, что эта статья будет для вас полезной / полезной, и если она вам нравится, поставьте мне. Любые отзывы, мысли, комментарии, предложения или вопросы приветствуются!