新闻分类(文本分类)

该博客介绍了如何对新闻数据集进行预处理,包括数据清洗、分词、删除停用词,以及使用朴素贝叶斯进行文本分类。首先,通过jieba进行分词并去除停用词,接着使用词袋模型和TF-IDF方法构建特征,最后运用MultinomialNB进行训练和测试。
摘要由CSDN通过智能技术生成

新闻分类

本文选取的数据集是一个包含五千条新闻的数据集,该数据集一共有四个维度,主要使用朴素贝斯进行分类,仅供学习和参考

数据集: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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值