И как создать свой собственный классификатор слов

С помощью изящного извлекающего резюмирования текста, который мы создали в Части 1, мы могли брать новостные статьи и сокращать их вдвое или больше! Теперь пора взять эти статьи и классифицировать их по темам. В этой части мы рассмотрим, как создать мешок слов классификатора НЛП для этого!

Как создать классификатор "Сумка слов" (Python)

Репозиторий GitHub:

Https://github.com/Vedant-Gupta523/text-summarization-project

Обзор:

  1. Импортировать библиотеки и набор данных
  2. Очистите статьи в наборе данных и сохраните каждую статью как элемент в списке.
  3. Создайте нашу матрицу мешка слов
  4. Разделите массив на тестовый и обучающий набор
  5. Прогнозируйте результаты тестирования и оценивайте точность
  6. Делайте прогнозы для наших обобщенных статей

Импортировать библиотеки и набор данных

# Importing the libraries
import numpy as np
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('subject_freq.csv')

Чтобы классифицировать тематику статей, нам сначала нужен набор данных, который содержит статьи, помеченные своей тематикой. В свой репозиторий GitHub я включил такой набор данных и инструмент, который поможет вам быстро создать собственный набор данных (с компромиссом в точности). В моем наборе данных есть одна из трех меток для статей: Наука, Технология или Жизнь.

Мы импортируем numpy и pandas, а затем сохраняем набор данных «subject_freq.csv» в переменной «dataset».

Создание списка с очищенными статьями из набора данных

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

# Cleaning the texts
import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
corpus = []
for i in range(0, numDatapoints):
    review = re.sub('[^a-zA-Z]', ' ', dataset['Article'][i])
    review = review.lower()
    review = review.split()
    review = ' '.join(review)
    corpus.append(review)

Как и в Части 1, мы импортируем Regex и NLTK и загружаем английские стоп-слова, чтобы очистить текст. Мы очищаем каждую статью и добавляем ее в наш список корпус.

Создание матрицы мешка слов

Пришло время создать матрицу, на которой будет обучаться наш классификатор!

# Creating the Bag of Words model
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features = 1500)
X = cv.fit_transform(corpus).toarray()
y = dataset.iloc[:, 1].values

Мы импортируем CountVectorizer из модуля sklearn, а затем устанавливаем его max_features равным 1500. Это устанавливает ограничение в 1500 уникальных слов в нашей матрице. Затем мы создаем нашу матрицу функций (X) и создаем отдельный список для наших меток (y). Матрица, созданная CountVectorizer, выглядит примерно так:

Каждая строка представляет статью, а каждый столбец представляет уникальное слово (с ограничением 1500 слов / столбцов). Число в каждой ячейке - это количество раз, когда каждое слово появлялось в соответствующей статье.

Создание обучающего набора и тестового набора и обучение модели

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

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
# Fitting Naive Bayes to the Training set
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

Мы используем «train_test_split» из sklearn, чтобы разделить статьи в матрице и их метки. Как указано в «test_size», 80% исходного корпуса станет обучающими данными, а модель будет протестирована на оставшихся 20%.

Мы импортируем классификатор Наивный Байес из sklearn и обучаем его на X_train и y_train.

Оценка точности

Пришло время протестировать классификатор и посмотреть, как он себя чувствует!

# Predicting the Test set results
y_pred = classifier.predict(X_test)
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

Мы сохраняем прогнозы классификатора на «X_test» в «y_pred», а затем используем матрицу путаницы sklearn для визуализации наших результатов:

Вау, это потрясающе…? Сначала это может показаться запутанным, но на самом деле это просто, когда вы понимаете, как это читать. Столбцы представляют собой фактические метки (Наука, Технология и Жизнь), а строки представляют собой предсказанные метки. В этом случае первая строка говорит нам, что классификатор предсказал науку 3 раза, когда на самом деле это была наука, и предсказал науку 0 раз, когда на самом деле это были технологии или жизнь. Чтобы легко вычислить общее количество правых прогнозов, вы найдете сумму чисел от верхнего левого угла до нижнего правого. Классификатор сделал 8 верных прогнозов из 12 тестовых вопросов!

Точность 75% - это неплохо, но ее определенно можно улучшить. Самая большая проблема в том, что в созданной нами модели не было достаточно данных для обучения, поэтому она не могла делать полностью точные прогнозы. Наличие большого набора данных - ключ к созданию высокоточных классификаторов!

Делаем прогнозы по нашим обобщенным статьям

Целью создания классификатора мешка слов было в конечном итоге классифицировать наши обобщенные статьи из Части 1.

from bagofwords_classifier import corpus, cv, classifier
testData = article_text
testReview = re.sub('[^a-zA-Z]', ' ', testData)
testReview = testReview.lower()
testReview = testReview.split()
testReview = ' '.join(testReview)
corpus.append(testReview)
testX = cv.fit_transform(corpus).toarray()
testX = testX[-1:, :]
testResult = classifier.predict(testX)
corpus = corpus[:-1]
print(testResult)

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

Примеры прогнозов:

  1. Статья: «https://goo.gl/Qfq8A Настоящее Ожидается: TECH Результат: TECH
  2. Статья: https://goo.gl/AfHLL5 Ожидается: НАУКА Результат: НАУКА
  3. Статья: https://goo.gl/gE8rEX Ожидается: LIFE Результат: LIFE

Ключевые выводы

У классификаторов обработки естественного языка очень много приложений, от простой предметной классификации до анализа настроений. НЛП окажет большое влияние на нашу жизнь, и важно понимать, как работает эта технология. Теперь вы знаете, как сделать классификатор НЛП методом мешка слов!

Репозиторий GitHub: https://github.com/Vedant-Gupta523/text-summarization-project