使用朴素贝叶斯对新闻进行自动分类。
导包
import numpy as np
import pandas as pd
import jieba
读入数据,删除空值。
df_techology=pd.read_csv(r'bayes/technology_news.csv')
df_techology=df_techology.dropna()
df_car=pd.read_csv(r'bayes/car_news.csv')
df_car=df_car.dropna()
df_entertainment=pd.read_csv(r'bayes/entertainment_news.csv')
df_entertainment=df_entertainment.dropna()
df_military=pd.read_csv(r'bayes/military_news.csv')
df_military=df_military.dropna()
df_sports=pd.read_csv(r'bayes/sports_news.csv')
df_sports=df_sports.dropna()
将每类新闻中的每条新闻放入一个列表中
technology=df_techology.content.values.tolist()
car=df_car.content.values.tolist()
entertainment=df_entertainment.content.values.tolist()
military=df_military.content.values.tolist()
sports=df_sports.content.values.tolist()
读入停用词
stopwords=pd.read_csv(r'bayes/stopwords.txt',index_col=False,quoting=3,sep='\t',names=['stopword'],encoding='utf-8')
stopwords=stopwords['stopword'].values
定义一个函数,将刚才的新闻列表,一个新的空列表以及新闻的标签作为函数的参数。
def preprocess_text(content_lines, sectences, category):
for line in content_lines:
try:
segs=jieba.lcut(line)
segs=filter(lambda x :len(x)>1,segs)
sectences.append((' '.join(segs),category))
except Exception as e:
print(line)
continue
调用刚才定义的函数
sentences=[]
preprocess_text(technology,sentences,'technology')
preprocess_text(car,sentences,'car')
preprocess_text(entertainment,sentences,'entertainment')
preprocess_text(military,sentences,'military')
preprocess_text(sports,sentences,'sports')
打乱顺序,随机取三条新闻
import random
random.shuffle(sentences)
sentences[:3]
大概长这个样子
数据的清洗工作基本上就搞定了,这就来划分训练集和测试集
from sklearn.model_selection import train_test_split
x,y=zip(*sentences)
xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3)
选取词特征
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer(analyzer='word',max_features=5000,stop_words=stopwords.tolist())
CountVec=vec.fit_transform(xtrain)
features=vec.get_feature_names()
导包
from sklearn.naive_bayes import MultinomialNB
实例化
classifier=MultinomialNB()
放入训练集
classifier.fit(vec.transform(xtrain),ytrain)
查看测试集得分
classifier.score(vec.transform(xtest),ytest)
到此,整个贝叶斯新闻分类器就已经基本完成了。
下面四行代码用来以报告的形式输出所有类别新闻分类器的信息
from sklearn.metrics import classification_report
name=['technology','car','entertainment','military','sports']
y=classifier.predict(vec.transform(xtest))
print(classification_report(y,ytest,target_names=name))
最后,还可以使用面向对象编程的方式,将整个过程放入一个类中,下次要对某个新闻进行分类的时候,直接调用类中的方法就好啦!!!
class TextClassifier():
def __init__(self, classifier=MultinomialNB()):
self.classifier = classifier
self.vectorizer = CountVectorizer(analyzer='word', max_features=50000)
def features(self, X):
return self.vectorizer.transform(X)
def fit(self, X, y):
self.vectorizer.fit(X)
self.classifier.fit(self.features(X), y)
def predict(self, x):
return self.classifier.predict(self.features([x]))
def score(self, X, y):
return self.classifier.score(self.features(X), y)
实例化对象
text_classifier = TextClassifier()
测试一下我们的模型
inputyournews=input("输入新闻:")
cutyournews=jieba.lcut(inputyournews)
content = " ".join(cutyournews)
print("新闻类型:",text_classifier.predict(content))
基本上还是正确的
关于文本分类,还可以使用
TF-IDF
的方式来测试一下哪种训练方式准确率更高,下次再更。
版权声明:本文为echo666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。