朴素贝叶斯——新闻分类

  • Post author:
  • Post category:其他


使用朴素贝叶斯对新闻进行自动分类。

导包

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 版权协议,转载请附上原文出处链接和本声明。