Здесь нам дан набор данных, содержащий газетные заголовки и их категорию. Здесь существует 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)
И вот как вы классифицируете заголовки…