新闻分类
本文选取的数据集是一个包含五千条新闻的数据集,该数据集一共有四个维度,主要使用朴素贝斯进行分类,仅供学习和参考
数据集:https://pan.baidu.com/s/14z–kvHYgwDAbgO0dxlHDg 提取码:9a8a
使用的工具如下:
- numpy
- pandas
- jieba
- sklearn
1.数据读取
首先读取数据,并对数据进行清洗
import numpy as np
import pandas as pd
newdata = pd.read_table("数据集路径",names=['label','theme','URL','content'],encoding='utf-8')
newdata = df_news.dropna()#删除缺失值
#查看数据维度
newdata.shape
(5000,4)
#查看数据前五行
newdata.tail()
从上面不难看出我们的数据一共有五千篇文章和四个特征,而我们主要用到的就是文章内容,我们要根据文章的内容来判断文章的类别,接下来我们提取我们要用到的数据(就是文章内容)
content = newdata['content'].values.tolist()
#content[100]
2.分词,删除停用词(删除那些没有价值的内容)
import jieba
#分词
content_S = []
for text in content:
cut_content = jieba.lcut(text)
if len(cut_content)>1 and cut_content != '\r\n':
content_S.append(cut_content)
接下来删除停用词
停用词:是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词。
这里要注意,不设置quoting,默认会去除英文双引号,只留下英文双引号内的内容,设置quoting = 3,会如实读取内容。
#删除停用词
stopwords = pd.read_csv("停用词表路径",sep='t',quoting=3,names=['stopwords'],encoding='utf-8')
def drop_stopwords(contents,stopwords):
content_clearn = []
for line in contents:
line_clearn = []
for word in line:
if word in stopwords:
continue
line_clearn.append(word)
content_clearn.append(line_clearn)
return content_clearn
stopwords = stopwords.stopwords.values.tolist()
content_clearn = drop_stopwords(content_S,stopwords)
df_content = pd.DataFrame({'content_clearn':content_clearn})
#查看前五行
df_content.head()
3.划分训练集和测试集
我们已经把用于训练模型的数据提取出来了,接下来对数据做最后一部整理,找到数据对应的标签,划分训练集和测试集
new_train = pd.DataFrame({'content_clearn':content_clearn,'label':df_news['label']})
#查看后五行
new_train.tail()
先看看我们的数据集一共有几个标签,然后给每个标签构建对应的映射,毕竟计算机只看得懂数字嘛
new_train.label.unique()
用数字构建对应的标签,比如 1 代表 汽车
label_mapping = {'汽车':1, '财经':2, '科技':3, '健康':4, '体育':5, '教育':6, '文化':7, '军事':8, '娱乐':9, '时尚':0}
new_train['label'] = new_train['label'].map(label_mapping)#构建一个映射方法
#new_train.head()
#划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(new_train['content_clearn'].values,new_train['label'].values,random_state=1)
#x_train.shape
4.模型训练
4.1利用词袋模型进行训练
#首先将训练集中的所有词都存在一起
words = []
for line_index in range(len(x_train)):
try:
words.append(" ".join(x_train[line_index]))
except:
print(line_index)
#查看有多少个词print(len(words)) 一共有3750个词
制作词袋特征模型
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(analyzer='word', max_features=4000 ,lowercase=False)
feature = vec.fit_transform(words)
feature.shape #(3750,4000)
导入贝叶斯模型进行训练
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(feature, y_train)
#查看在训练集上的测试结果
classifier.score(feature,y_train)
查看在测试集上的结果
test_words = []
#提取测试集中的所有词
for line_index in range(len(x_test)):
try:
test_words.append(" ".join(x_test[line_index]))
except:
print(line_index)
#len(test_words)
classifier.score(vec.transform(test_words),y_test)
2利用TF-IDF进行训练
TF-IDF是一种统计方法,用以评估一个字或一个词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数正比增加,但同时会随着它在语料库中出现的频率成反比下降.
该方法常用与NLP分类任务中的特征提取环节,且往往有很好的效果
TF:词频 IDF:逆文本频率指数
主要思想:如果某个词或者某个短语在一篇文章中出现的频率TF高,并且在其它文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。
from sklearn.feature_extraction.text import TfidfVectorizer
vectotizer = TfidfVectorizer(analyzer='word', max_features=4000,lowercase=False )
vectotizer.fit(words)
模型训练
classifier.fit(vectotizer.transform(words),y_train)
训练集测试
classifier.score(vectotizer.transform(words),y_train)
测试集测试
classifier.score(vectotizer.transform(test_words),y_test)