初探文本分类,本文使用的数据是5000条中文新闻文本数据,目的是使用朴素贝叶斯算法,对中文新闻文本进行分类预测。流程如下:
文本数据载入及清洗
搜狗新闻数据源:http://www.sogou.com/labs/resource/ca.php
我们从搜狗下载的数据是类似XML的带标签对的数据,因此需要使用正则表达式或者BeautifulSoup等工具处理为dataframe格式,如下图,大家通过网络爬虫获取的数据处理方法也类似。
文本数据提取这里就不赘述了,下面直接读入处理后的csv文件
import pandas as pd
import jieba
data = pd.read_table('news_data/news_data.txt')
把数据集分为训练集和测试集
sk-learn库中train_test_split函数可以把数据集随机划分为训练集和测试集,训练集用于模型训练,测试集用于检验模型的优劣,random_state参数是指定随机种子。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data['新闻内容'], data['类别'], random_state=1)
中文分词
我们使用jieba库进行分词,并以空格把分词连成字符串。
def fenci(train_data):
words_df = train_data.apply(lambda x:' '.join(jieba.cut(x)))
return words_df
x_train_fenci = fenci(x_train)
x_train_fenci[:5]
分词后的数据如下:
3186 中新网 上海 6 月 1 4 日电 ( 记者 于俊 ) 今年 的 父亲节 , 人们 可 通过...
632 目前 正值 中 报 发布 之际 , 多家 券商 认为 , 上半年 银行 整体 利润 增速 下...
577 作为 中非 合作 论坛 的 重要 分 论坛 之一 , 中 非金融 合作 论坛 将 于 1 3...
2406 雅虎 体育讯 北京 时间 7 月 3 日 下午 , 炎炎夏日 中 山东 球迷 终于 迎来...
4686 欧莱雅集团 的 药妆 品牌 理肤泉 ( 右图 ) 和 薇 姿 ( 左图 ) 。 资料 图...
Name: 新闻内容, dtype: object
引入停用词
infile = open("stopwords.txt",encoding='utf-8')
stopwords_lst = infile.readlines()
stopwords = [x.strip() for x in stopwords_lst]
文本特征提取(词库表示法)
CountVectorizer旨在通过计数来将一个文档转换为向量。当不存在先验字典时,Countvectorizer作为Estimator提取词汇进行训练,并生成一个CountVectorizerModel用于存储相应的词汇向量空间。该模型产生文档关于词语的稀疏表示。下面举一个例子示范:
#用于转词向量的语料
yuliao = ['dog cat fish dog dog dog','cat eat fish','i like eat fish']
#sklearn库CountVectorizer转词向量
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
vector = cv.fit_transform(yuliao)
vector.todense()
转换后的矩阵为
matrix([[1, 4, 0, 1, 0],
[1, 0, 1, 1, 0],
[0, 0, 1, 1, 1]], dtype=int64)
接下来我们看下提取到的特征分别是
#提取到的文本特征
cv.vocabulary_
得到的文本特征
{'cat': 0, 'dog': 1, 'eat': 2, 'fish': 3, 'like': 4}
从上面的例子可以看出,语料中每个词作为一个特征,词频数作为特征的值,如第一句中dog出现了4次,因此特征值为4。下面我们使用CountVectorizer把分词后的新闻文本转为向量。sklearn库中可以指定stopwords,我们把之前准备好的停用词表穿进去就好,这样我们的文本特征提取就做好啦。
vectorizer =