Здесь нам дан набор данных, содержащий газетные заголовки и их категорию. Здесь существует 4 категории, а именно: бизнес, образование, медицина и технологии.

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

import pickle
import pandas as pd
dataset = pd.read_csv(“uci-news-aggregator.csv”)
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
corpus=[]

Стоп-слова — это в основном обычные слова, такие как «a,an,the,is…». Слова, подобные этим, не несут никаких чувств и, следовательно, бесполезны. Нам нужно удалить все эти слова.

def formatHeadline(hl):
 hl=re.sub(‘[^a-zA-Z]’,’ ‘,hl)
 hl=hl.lower()
 hl=hl.split()
 ps=PorterStemmer()
 hl=[ps.stem(word) for word in hl if word not in set(stopwords.words(‘english’))]
 hl=’ ‘.join(hl)
 return hl

В первой строке специальные символы заменяются только пробелами.

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

for i in range(0,70000):
 corpus.append(formatHeadline(dataset[‘TITLE’][i]))
 print(i)

Следовательно, мы создаем корпус (то есть набор слов) правильно отформатированных заголовков.

from sklearn.feature_extraction.text import CountVectorizer
cv= CountVectorizer(max_features=1500)
X=cv.fit_transform(corpus).toarray()
y=dataset.iloc[:,4].values

Мы используем Count Vectorizer для преобразования корпуса заголовков в двумерный массив.

from sklearn.preprocessing import LabelEncoder
labelencoder=LabelEncoder()
y=labelencoder.fit_transform(y)
y=y[0:70000] #Change here
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test= train_test_split(X,y,test_size=0.2)
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.transform(X_test)
from sklearn.naive_bayes import GaussianNB
classifier=GaussianNB()
classifier.fit(X_train,y_train)
with open(“HeadlinesClassifier.pickle”,’wb’) as f:
pickle.dump(classifier,f)
pickle.dump(cv,f)
pickle_in=open(“HeadlinesClassifier.pickle”,’rb’)
classifier=pickle.load(pickle_in)
y_pred=classifier.predict(X_test)
from sklearn.metrics import confusion_matrix
cm=confusion_matrix(y_test,y_pred)

Чтобы предсказать новый заголовок, вы можете написать новый код на Python, чтобы открыть файл .pickle, в котором хранится обученная модель и векторизатор….

import pickle
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
def formatHeadline(hl):
 hl=re.sub(‘[^a-zA-Z]’,’ ‘,hl)
 hl=hl.lower()
 hl=hl.split()
 ps=PorterStemmer()
 hl=[ps.stem(word) for word in hl if word not in set(stopwords.words(‘english’))]
 hl=’ ‘.join(hl)
 return hl
pickle_in=open(“HeadlinesClassifier.pickle”,’rb’)
classifier=pickle.load(pickle_in)
cv=pickle.load(pickle_in)
new_headline = ‘Doctors find a cure for Cancer’
new_headline= formatHeadline(new_headline)
test_corpus = []
test_corpus.append(new_headline)
X_new_test = cv.transform(test_corpus).toarray()
prediction = classifier.predict(X_new_test)

И вот как вы классифицируете заголовки…