[Stove AI] Машинное обучение 039-NLP Текстовый классификатор

машинное обучение искусственный интеллект Python NLP

[Stove AI] Машинное обучение 039-NLP Текстовый классификатор

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)

Ранее мы узнали много о сегментации текста, сегментации текста и создании модели мешка слов с помощью НЛП. Эти шаги можно рассматривать как основу обработки текста НЛП. Здесь мы рассмотрим очень важное применение НЛП, используя наблюдение за текст Научитесь делать автоматическую классификацию.


1. Введение в набор данных 20 групп новостей

В этой статье будет использоваться очень классический набор данных в НЛП: 20 групп новостей. Этот набор данных является одним из международных стандартных наборов данных, посвященных классификации текстов, интеллектуальному анализу текста и поиску информации.Подобно набору данных Iris, используемому в традиционном машинном обучении, к нему можно получить доступ черезОфициальный сайтскачать и узнать больше.

20 групп новостей содержат помеченные образцы 20 категорий с общим размером выборки около 20 000. 20 категорий:

Существует три версии этого набора данных, основное содержание и отличия:

  1. 20news-19997.tar.gz: Оригинальная, немодифицированная версия.
  2. 20news-bydate.tar.gz: версия bydate, классифицированная по времени, разделена на две части: обучающий набор (60%) и тестовый набор (40%), за исключением дубликатов документов и названий групп новостей. Всего имеется 18846 образцов (или документов)
  3. 20news-18828.tar.gz: Не включает дубликаты образцов, только источник и тему, всего 18828 образцов.

В sklearn есть два метода загрузки. Первый — sklearn.dataset.fetch_20newsgroups, который возвращает исходную текстовую последовательность, которую можно извлечь с помощью пользовательских параметров экстрактора текстовых признаков (CountVectorizer). возвращает текстовую последовательность, из которой были извлечены признаки, т.е. экстрактор признаков не требуется.

Примечание. Приведенное выше содержимое в основном предназначено для справки.блог

Здесь мы скачиваем только вторую версию.После скачивания получаем файл 20news-bydate.tar.gz.После распаковки получаем две папки следующим образом:

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

Метод загрузки этого набора данных был интегрирован в код sklearn.Основной интерфейс — sklearn.dataset.fetch_20newsgroups, который по умолчанию загружает вторую версию. Параметры этой функции: подмножество имеет три варианта обучения, проверки, все и выбирает тип данных. категория — выбрать тип новостей, удалить — возможность удалить («заголовки», «нижние колонтитулы», «кавычки») эти три статьи. Другие не важны.

# 认识20newsgroups数据集
from sklearn.datasets import fetch_20newsgroups
# dataset=fetch_20newsgroups(subset='all') 
# 自动下载第二个版本20news-bydate.tar.gz
# print(len(dataset.data)) # dataset_X 的样本数
# print(dataset.target_names) # dataset_y的名称,标签名称

# train_set=fetch_20newsgroups(subset='train') # 仅仅提取中间的train set
# test_set=fetch_20newsgroups(subset='test')

# 如果仅仅需要其中的某几个类别,可以用
sample_cate = ['alt.atheism', 'soc.religion.christian',
               'comp.graphics', 'sci.med', 'rec.sport.baseball'] # 只取5个类别
train_set = fetch_20newsgroups(subset='train',categories=sample_cate,
                               shuffle=True, random_state=42,
                               remove = ('headers', 'footers', 'quotes'))
test_set = fetch_20newsgroups(subset='test', categories=sample_cate,
                              shuffle=True, random_state=42,
                              remove = ('headers', 'footers', 'quotes'))
print(len(train_set.data), len(test_set.data)) # 2854 1899
print(train_set.target_names) # 只有五个类别

------------------------------------- потерять-- ------------------------------

2854 1899 ['alt.atheism', 'comp.graphics', 'rec.sport.baseball', 'sci.med', 'soc.religion.christian']

--------------------------------------------Заканчивать----- --------------------------------


2. Создайте классификатор

2.1 Подготовьте набор данных

# 1, 准备数据集
category_map = {'misc.forsale': 'Sales', 'rec.motorcycles': 'Motorcycles', 
        'rec.sport.baseball': 'Baseball', 'sci.crypt': 'Cryptography', 
        'sci.space': 'Space'}
from sklearn.datasets import fetch_20newsgroups
train_set=fetch_20newsgroups(subset='train',categories=category_map.keys(),
                             shuffle=True,random_state=42,
                            remove = ('headers', 'footers', 'quotes'))
test_set=fetch_20newsgroups(subset='test',categories=category_map.keys(),
                             shuffle=True,random_state=42,
                           remove = ('headers', 'footers', 'quotes'))
# 获取到的train_set包含有2968个样本,
print('train sample num: ', len(train_set.data)) # 2968
print(train_set.target_names) # 确保是我们要提取的这五个类别

print('test sample num: ', len(test_set.data)) # 1975

-------------- потерять --------- выход ----------

train sample num: 2968 ['misc.forsale', 'rec.motorcycles', 'rec.sport.baseball', 'sci.crypt', 'sci.space'] test sample num: 1975

-------------------Заканчивать-----------------

2.2 Извлечение признаков

Здесь мы используем TfidfVectorizer для извлечения признаков, TfidfVectorizer см. в моей предыдущей статье.[Искусственный интеллект для обработки печи] Машинное обучение 038-NLP создает модель мешка слов.

Перейдите непосредственно к коду:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words='english',lowercase=True)
train_vector = vectorizer.fit_transform(train_set.data)
print(train_vector.shape) # (2968, 31206)
# 此处相当于有2968个词袋,对这些词袋进行TfidfVectorizer进行特征提取,
# 得到最具典型的一些单词,这些单词的个数有31206个,故而得到(2968, 30206)矩阵
# 矩阵中的元素表示这个单词在该词袋中出现的tf-idf权重,值越大,表示该单词越重要。

2.3 Определить модель, обучить модель

# 定义模型,训练特征
from sklearn.naive_bayes import MultinomialNB
classifier=MultinomialNB(alpha=.01, fit_prior = False)
classifier.fit(train_vector,train_set.target)

2.4 Просмотр производительности модели на тестовом наборе

# 查看这个数据集在test_set上的表现
from sklearn import metrics
test_vector=vectorizer.transform(test_set.data)
print(test_vector.shape)
pred=classifier.predict(test_vector)
F1_score=metrics.f1_score(test_set.target, pred, average='micro')
print('test set F1 score: ',F1_score)

-------- ВХОД --------- ВЫХОД ----------------

(1975, 31206) test set F1 score: 0.8774683544303797

-------------------------Заканчивать----------------


3. Оптимизируйте параметры с помощью GridSearch

# 用GridSearchCV优化参数
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report

parameters = {'fit_prior':(True, False), 'alpha':(0.01,0.05,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)}
clf = GridSearchCV(classifier,parameters,cv=5,scoring='precision_macro',n_jobs=-1)
clf.fit(train_vector, train_set.target)
print("Best param_set found on train set: {}".format(clf.best_params_))

print("Detailed classification report on test set:")
y_true, y_pred = test_set.target, clf.predict(test_vector)
print(classification_report(y_true, y_pred))

------------------------------------- потерять-- ------------------------------

Best param_set found on train set: {'alpha': 0.05, 'fit_prior': True} Detailed classification report on test set: precision recall f1-score support

      0       0.92      0.89      0.91       390
      1       0.80      0.91      0.85       398
      2       0.93      0.88      0.91       397
      3       0.90      0.88      0.89       396
      4       0.91      0.88      0.89       394

avg / total 0.89 0.89 0.89 1975

--------------------------------------------Заканчивать----- --------------------------------

Как видно из классификационного отчета, наилучшие результаты у классов 0 и 2 с показателем F1 0,91, а худшие результаты у класса 1 со значением F1 всего 0,85.

########################резюме########################## ######

1. Основное различие между использованием НЛП для классификации текста и традиционным машинным обучением заключается в извлечении предыдущих признаков.После извлечения признаков последующее создание модели, обучение, тестирование, отчеты о классификации и т. д. остаются теми же.

2. Существует два вида извлечения признаков для текста: CountVectorizer и TfidfVectorizer, но чаще всего используется TfidfVectorizer, и он более точен для случая очень большого количества текста, поэтому здесь я использую только TfidfVectorizer для извлечения признаков.

3. Есть одно место, которое легко проигнорировать: тестовый набор должен быть преобразован с помощью vectorizer.transform перед использованием, Этот процесс похож на нормализацию данных и т. д. И train_X, и test_X должны быть обработаны.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.