毕业设计 : 中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类
文章目录
- 0 简介
- 1 前言
- 2 中文文本分类
- 3 数据集准备
- 4 经典机器学习方法
- 4.1 分词、去停用词
- 4.2 文本向量化 tf-idf
- 4.3 构建训练和测试数据
- 4.4 训练分类器
- 4.4.1 logistic regression分类器
- 4.5 Random Forest 分类器
- 4.6 结论
- 5 深度学习分类器 - CNN文本分类
- 5.1 字符级特征提取
- 6 最后
0 简介
今天学长向大家介绍一个毕设项目,中文文本分类技术
中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类
1 前言
学长今天帮助同学开发项目,正好需要到文本分类,今天就带大家梳理一下中文文本分类的主要方法和流程
学长本片博客的目的主要记录学长自己构建文本分类系统的过程,分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统,并在同一数据集上进行测试。
2 中文文本分类
作为NLP领域最经典的场景之一,文本分类积累了大量的技术实现方法,如果将是否使用深度学习技术作为标准来衡量,实现方法大致可以分成两类:
- 基于传统机器学习的文本分类
- 基于深度学习的文本分类
facebook之前开源的fastText属于简化版的第二类,词向量取平均直接进softmax层,还有业界研究上使用比较多的TextCNN模型属于第二类。
学长本片博客的目的主要记录学长自己构建文本分类系统的过程,分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统,并在同一数据集上进行测试。
经典的机器学习方法采用获取tf-idf文本特征,分别喂入logistic regression分类器和随机森林分类器的思路,并对两种方法做性能对比。
基于深度学习的文本分类,这里主要采用CNN对文本分类,考虑到RNN模型相较CNN模型性能差异不大并且耗时还比较久,这里就不多做实验了。
实验过程有些比较有用的small trick分享,包括多进程分词、训练全量tf-idf、python2对中文编码的处理技巧等等,在下文都会仔细介绍。
3 数据集准备
本文采用的数据集是很流行的搜狗新闻数据集,get到的时候已经是经过预处理的了,所以省去了很多数据预处理的麻烦,数据集内容如下
数据集一共包括10类新闻,每类新闻65000条文本数据,训练集50000条,测试集10000条,验证集5000条。
4 经典机器学习方法
4.1 分词、去停用词
使用短文本分类博文中提到的分词工具类,对训练集、测试集、验证集进行多进程分词,以节省时间:
import multiprocessingtmp_catalog = '/home/zhouchengyu/haiNan/textClassifier/data/cnews/'
file_list = [tmp_catalog+'cnews.train.txt', tmp_catalog+'cnews.test.txt']
write_list = [tmp_catalog+'train_token.txt', tmp_catalog+'test_token.txt']def tokenFile(file_path, write_path):word_divider = WordCut()with open(write_path, 'w') as w:with open(file_path, 'r') as f:for line in f.readlines():line = line.decode('utf-8').strip()token_sen = word_divider.seg_sentence(line.split('\t')[1])w.write(line.split('\t')[0].encode('utf-8') + '\t' + token_sen.encode('utf-8') + '\n') print file_path + ' has been token and token_file_name is ' + write_pathpool = multiprocessing.Pool(processes=4)
for file_path, write_path in zip(file_list, write_list):pool.apply_async(tokenFile, (file_path, write_path, ))
pool.close()
pool.join() # 调用join()之前必须先调用close()
print "Sub-process(es) done."
4.2 文本向量化 tf-idf
这里有几点需要注意的,一是计算tf-idf是全量计算,所以需要将train+test+val的所有corpus都相加,再进行计算,二是为了防止文本特征过大,需要去低频词,因为是在jupyter上写的,所以测试代码的时候,先是选择最小的val数据集,成功后,再对test,train数据集迭代操作,希望不要给大家留下代码冗余的影响…[悲伤脸]。实现代码如下:
def constructDataset(path):"""path: file pathrtype: lable_list and corpus_list"""label_list = []corpus_list = []with open(path, 'r') as p:for line in p.readlines():label_list.append(line.split('\t')[0])corpus_list.append(line.split('\t')[1])return label_list, corpus_listtmp_catalog = '/home/zhouchengyu/haiNan/textClassifier/data/cnews/'
file_path = 'val_token.txt'
val_label, val_set = constructDataset(tmp_catalog+file_path)
print len(val_set)from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizertmp_catalog = '/home/zhouchengyu/haiNan/textClassifier/data/cnews/'
write_list = [tmp_catalog+'train_token.txt', tmp_catalog+'test_token.txt']tarin_label, train_set = constructDataset(write_list[0]) # 50000
test_label, test_set = constructDataset(write_list[1]) # 10000
# 计算tf-idf
corpus_set = train_set + val_set + test_set # 全量计算tf-idf
print "length of corpus is: " + str(len(corpus_set))
vectorizer = CountVectorizer(min_df=1e-5) # drop df < 1e-5,去低频词
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus_set))
words = vectorizer.get_feature_names()
print "how many words: {0}".format(len(words))
print "tf-idf shape: ({0},{1})".format(tfidf.shape[0], tfidf.shape[1])"""
length of corpus is: 65000
how many words: 379000
tf-idf shape: (65000,379000)
"""
4.3 构建训练和测试数据
因为本来文本就是以一定随机性抽取成3份数据集的,所以,这里就不shuffle啦,偷懒一下下。
from sklearn import preprocessing# encode label
corpus_label = tarin_label + val_label + test_label
encoder = preprocessing.LabelEncoder()
corpus_encode_label = encoder.fit_transform(corpus_label)
train_label = corpus_encode_label[:50000]
val_label = corpus_encode_label[50000:55000]
test_label = corpus_encode_label[55000:]
# get tf-idf dataset
train_set = tfidf[:50000]
val_set = tfidf[50000:55000]
test_set = tfidf[55000:]
4.4 训练分类器
4.4.1 logistic regression分类器
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# from sklearn.metrics import confusion_matrix# LogisticRegression classiy model
lr_model = LogisticRegression()
lr_model.fit(train_set, train_label)
print "val mean accuracy: {0}".format(lr_model.score(val_set, val_label))
y_pred = lr_model.predict(test_set)
print classification_report(test_label, y_pred)
分类结果如下(包括准确率、召回率、F1值):
4.5 Random Forest 分类器
# 随机森林分类器
from sklearn.ensemble import RandomForestClassifier rf_model = RandomForestClassifier(n_estimators=200, random_state=1080)
rf_model.fit(train_set, train_label)
print "val mean accuracy: {0}".format(rf_model.score(val_set, val_label))
y_pred = rf_model.predict(test_set)
print classification_report(test_label, y_pred)
分类结果(包括准确率、召回率、F1值):
4.6 结论
- 1 上面采用逻辑回归分类器和随机森林分类器做对比:
- 2 可以发现,除了个别分类随机森林方法有较大进步,大部分都差于逻辑回归分类器
- 3 并且200棵树的随机森林耗时过长,比起逻辑回归分类器来说,运算效率太低
5 深度学习分类器 - CNN文本分类
5.1 字符级特征提取
这里和前文差异比较大的地方,主要是提取文本特征这一块,这里的CNN模型采用的是字符级特征提取,比如data目录下cnews_loader.py中:
def read_file(filename):"""读取文件数据"""contents, labels = [], []with open_file(filename) as f:for line in f:try:label, content = line.strip().split('\t')contents.append(list(content)) # 字符级特征labels.append(label)except:passreturn contents, labelsdef build_vocab(train_dir, vocab_dir, vocab_size=5000):"""根据训练集构建词汇表,存储"""data_train, _ = read_file(train_dir)all_data = []for content in data_train:all_data.extend(content)counter = Counter(all_data)count_pairs = counter.most_common(vocab_size - 1)words, _ = list(zip(*count_pairs))# 添加一个 <PAD> 来将所有文本pad为同一长度words = ['<PAD>'] + list(words)
学长这里做了一下测试:
#! /bin/env python
# -*- coding: utf-8 -*-
from collections import Counter"""
字符级别处理,
对于中文来说,基本不是原意的字,但是也能作为一种统计特征来表征文本
"""
content1 = "你好呀大家"
content2 = "你真的好吗?"
# content = "abcdefg"
all_data = []
all_data.extend(list(content1))
all_data.extend(list(content2))
# print list(content) # 字符级别处理
# print "length: " + str(len(list(content)))
counter = Counter(all_data)
count_pairs = counter.most_common(5)
words, _ = list(zip(*count_pairs))
words = ['<PAD>'] + list(words) #['<PAD>', '\xe5', '\xbd', '\xa0', '\xe4', '\xe7']
这种基本不是原意的字符级别的特征,也能从统计意义上表征文本,从而作为特征,这一点需要清楚。
最终,在同一数据集上,得到的分类结果如下:
6 最后
毕业设计 : 中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类相关推荐
- 深度操作系统 机器学习_深度学习如何构建情感聊天机器人,第2部分对话系统...
深度操作系统 机器学习 情感聊天机器人(emotional chatbot) From part 1, we have built the BERT sentiment predictor, we n ...
- 机器学习代码实战——朴素贝叶斯(实现垃圾邮件分类)
文章目录 1.实验目的 2.导入必要模块并读取数据 3.训练+预测 4.使用Sklearn Pipeline方法 1.实验目的 (1)分析邮件数据并对数据进行预处理 (2)运行朴素贝叶斯模型对邮件进行 ...
- 检测用户命令序列异常——使用LSTM分类算法【使用朴素贝叶斯,类似垃圾邮件分类的做法也可以,将命令序列看成是垃圾邮件】...
通过 搜集 Linux 服务器 的 bash 操作 日志, 通过 训练 识别 出 特定 用户 的 操作 习惯, 然后 进一步 识别 出 异常 操作 行为. 使用 SEA 数据 集 涵盖 70 多个 U ...
- 机器学习_深度学习毕设题目汇总——表情情感
下面是该类的一些题目: 题目 人脸表情图像识别关键技术的分析与研究 在线学习环境下的表情识别算法及应用研究 基于图卷积网络的方面级情感分析方法研究 基于多特征融合的人脸表情识别研究 基于子空间学习的微 ...
- 机器学习_深度学习毕设题目汇总——遥感
下面是该类的一些题目: 题目 光学遥感图像典型目标检测方法研究 内蒙古草地生产力时空分析及产草量遥感估算和预测 双支路深度神经网络下的遥感图像配准及多分辨率融合分类 可见光遥感图像海面目标自动检测关键 ...
- 日本好的机器学习,深度学习相关书籍推荐
日本好的机器学习,深度学习相关书籍推荐 日文书名:ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 中文书名:用Python从0开始深度学习理论与实践 作者: ...
- 朴素贝叶斯(垃圾邮件分类)
一.基于贝叶斯决策理论的分类方法 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比 ...
- [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(BERT)
文章目录 1. 数据处理 2. 下载预训练模型 3. 加载数据 4. 定义模型 5. 训练 6. 提交测试结果 练习地址:https://www.kaggle.com/c/ds100fa19 相关博文 ...
- [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(RNN/GRU/LSTM)
文章目录 1. 读入数据 2. 文本处理 3. 建模 4. 训练 5. 测试 练习地址:https://www.kaggle.com/c/ds100fa19 相关博文 [Kaggle] Spam/Ha ...
- 【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现
文章目录 一.贝叶斯简介 二.贝叶斯公式推导 三.拼写纠正案例 四.垃圾邮件过滤案例 4.1 问题描述 4.2 朴素贝叶斯引入 五.基于朴素贝叶斯的垃圾邮件过滤实战 5.1 导入相关库 5.2 邮件数 ...
最新文章
- AI基础架构Pass Infrastructure
- Android:ViewPager为页卡内视图组件添加事件
- python爬虫鼠标模拟悬停并点击
- 《TCP/IP详解:卷1》之TCP/UDP总结
- dsge模型难做吗_百度Seo优化好做吗,现在做是不是越来越难做?
- 090518-C++primer 4th学习笔记:1.3节
- 【数据结构的魅力】001.认识复杂度二分法异或运算
- 使用Yii2中dropdownlist实现地区三级联动的例子
- linux之tcpdump抓包工具
- NAND Flash 芯片测试
- 扩展卡尔曼滤波EKF
- 【无需卸载,丝滑关闭奇安信天擎开机自启动(步骤超简单)】
- 【Qt开发】编译时报“undefined reference to“问题的解决方案
- CSS基础教程(下)
- Ubuntu 14.04重装mysql
- 03 KEY BUZZ
- 股指IF,6月1日行情预测
- iOS 13上传ipa报错
- js导出excel数据,图片,身份证号码
- win10开机网络图标消失,可以联网重启资源管理器可以出来下次开机又不出现图标,是什么问题该怎么解决
热门文章
- 桌面计算机图标不删除,电脑小技巧:教你删除桌面无法删除的图标
- 联想服务器硬盘启动设置方法,教你联想台式机bios设定硬盘启动方法
- Labview关于波形图
- 网站优化快速排名软件大全,用不用随你不做建议
- 二进制转化成ascll_怎样将二进制转ascii码
- play framework自定义插件plugin
- 百度排名批量查询_白杨SEO:一文告诉你SEO站长综合查询工具5118功能使用大全!...
- 互联网广告表现形式有哪几种?
- PMI-ACP敏捷项目认证练习题(四)
- Android 图片自动放大/缩小循环执行