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

import pandas as pd
from sklearn.datasets import fetch_20newsgroups 
from sklearn.feature_extraction.text import CountVectorizer

Вам нужно будет импортировать панды (конечно) и CountVectorizer. Мы будем использовать образец набора данных 20newsgroups, который содержит образец текста и классификации для более чем 11 000 новостных статей, хотя его можно использовать для любого достаточно большого набора текстов.

categories = ['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space']
data_train = fetch_20newsgroups(subset='train', categories=categories, remove=('headers', 'footers', 'quotes'))
data_test = fetch_20newsgroups(subset='test', categories=categories, remove=('headers', 'footers', 'quotes'))

Мы будем работать со статьями, которые для простоты попадают всего в 4 категории. Набор данных 20newsgroups предварительно разделен на набор для обучения и тестирования для вашего удобства.

cvec = CountVectorizer()
train_data_features=cvec.fit(data_train.data)
cvecdata= cvec.transform(data_train.data)
df=pd.DataFrame(cvecdata.todense(),columns=cvec.get_feature_names())

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

from sklearn.linear_model import LogisticRegression y=data_train.target
model=LogisticRegression()
log_model=model.fit(df,y)

Теперь мы можем использовать наш объект CountVectorizer «cvec» для преобразования любого текста в его количество слов (если они присутствуют в нашем исходном обучающем наборе), и мы можем использовать «log_model» для прогнозирования категории.

X_test=cvec.transform(data_test.data)
y_test=data_test.target
log_model.score(X_test,y_test)

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

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer