NLP实战之基于sklearn+TfidfVectorizer/CountVectorizer+贝叶斯模型进行THUCNews文本分类python

数据处理

首先介绍一下数据集:我们采用THUCNews数据集的子集,这是个链接(提取码:acvu)啦啦啦。完整数据自行去下哦 (地址:http://thuctc.thunlp.org/)~我们来看看这个数据,这个数据格式呢是一个样本是一条新闻,包括类别和内容。首先我们加载数据:

import pandas as pd
import jieba

#%%数据加载
f_train=open('C:/Users/29811/Desktop/NLP/03文本分类/cnews.train.txt',"rt", encoding='utf-8')
f_test=open('C:/Users/29811/Desktop/NLP/03文本分类/cnews.test.txt',"rt", encoding='utf-8')
train=pd.read_table(f_train,names=['类别','内容'])
test=pd.read_table(f_test,names=['类别','内容'])

x_train=train['内容']
y_train=train['类别']
x_test=test['内容']
y_test=test['类别']

我们可以看到的语料长这样:
NLP实战之基于sklearn+TfidfVectorizer/CountVectorizer+贝叶斯模型进行THUCNews文本分类python_第1张图片

然后我们来进行常规的数据处理,主要包括结巴分词停词过滤TF-IDF提取特征

#%%数据处理
#jieba分词
def cut_context(data):
    words=data.apply(lambda x: ' '.join(jieba.cut(x)))
    return words

train_data=cut_context(x_train)

#停词过滤
stopwords=open('C:/Users/29811/Desktop/NLP/03文本分类/cnews.vocab.txt',encoding='utf-8')
stopwords_list=stopwords.readlines()
stopworsd=[x.strip() for x in stopwords_list]

#TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
tv=TfidfVectorizer(stop_words=stopwords,max_features=5000,lowercase=False)
tv.fit(train_data)

贝叶斯模型建立及结果

然后就可以建立我们的贝叶斯模型啦,利用一下sklearn:

#%%贝叶斯分类
from sklearn.naive_bayes import MultinomialNB
model=MultinomialNB(alpha=0.2)#参数自己选 当然也可以不特殊设置
model.fit(tv.transform(cut_context(x_train)),y_train)#训练
#结果0.91
print(model.score(tv.transform(cut_context(x_test)),y_test))#测试
##打印概率
#model.predict_proba(tv.transform(cut_context(x_test)))

然后可以得到准确率为0.91,我们再具体的来看看每个类别的分类情况,

#评估一下各类指标
from sklearn.metrics import classification_report
print('其他指标:\n',classification_report(y_test,model.predict(tv.transform(cut_context(x_test)))))

得到下面这个结果
NLP实战之基于sklearn+TfidfVectorizer/CountVectorizer+贝叶斯模型进行THUCNews文本分类python_第2张图片

我们接下来利用CountVectorizer代替TF-IDF来看看结果:

#%%不用tfidf
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer()
x_train=vec.fit_transform(cut_context(x_train))
x_test=vec.transform(cut_context(x_test))
model=MultinomialNB(alpha=0.2)
model.fit(x_train,y_train)
y_predict=model.predict(x_test)
print('其他指标:\n',classification_report(y_test,y_predict))

得到了一个精度更好一点的结果:
NLP实战之基于sklearn+TfidfVectorizer/CountVectorizer+贝叶斯模型进行THUCNews文本分类python_第3张图片
贝叶斯的模型的alpha还可以自己调整啦~我们这个数据集还是比较好的,类别数据也很均衡,所以用贝叶斯分类的精度还可以,下一次我们再来尝试其他的方法吧。

你可能感兴趣的:(机器学习,python,nlp,自然语言处理,深度学习)