文本分类是NLP中的常见的重要任务之一,它的主要功能就是将输入的文本以及文本的类别训练出一个模型,使之具有一定的泛化能力,能够对新文本进行较好地预测。它的应用很广泛,在很多领域发挥着重要作用,例如垃圾邮件过滤、舆情分析以及新闻分类等。

现阶段的文本分类模型频出,既有机器学习中的朴素贝叶斯模型、SVM等,也有深度学习中的各种模型,比如经典的CNN, RNN,以及它们的变形,如CNN-LSTM,还有各种高大上的Attention模型。

本文以kashgari-tf为例,它能够支持各种文本分类模型,比如BiLSTM,CNN_LSTM,AVCNN等,且对预训练模型,比如BERT的支持较好,它能让我们轻松地完成文本分类任务。

项目

首先,我们需要找一份数据作为例子。我们选择THUCNews,THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。我们在原始新浪新闻分类体系的基础上,从中选择10个候选分类类别:体育、娱乐、家居、房产、教育、时尚、时政、游戏、科技、财经。

数据总量一共为6.5万条,其中训练集数据5万条,每个类别5000条,验证集数据0.5万条,每个类别500条,测试集数据1万条,每个类别1000条。笔者已将数据放在Github上,读者可以在最后的总结中找到。

项目结构,如下图:

文本分类项目结构

接着,我们尝试着利用kashgari-tf来训练一个文本分类模型,其中模型我们采用CNN-LSTM,完整的Python代码(text_classification_model_train.py)如下:

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容# -*- coding: utf-8 -*-
# time: 2019-08-13 11:16
# place: Pudong Shanghai
from kashgari.tasks.classification import CNN_LSTM_Model
# 获取数据集
def load_data(data_type):with open('./data/cnews.%s.txt' % data_type, 'r', encoding='utf-8') as f:content = [_.strip() for _ in f.readlines() if _.strip()]x, y = [], []for line in content:label, text = line.split(maxsplit=1)y.append(label)x.append([_ for _ in text])return x, y
# 获取数据
train_x, train_y = load_data('train')
valid_x, valid_y = load_data('val')
test_x, test_y = load_data('test')
# 训练模型
model = CNN_LSTM_Model()
model.fit(train_x, train_y, valid_x, valid_y, batch_size=16, epochs=5)
# 评估模型
model.evaluate(test_x, test_y)
# 保存模型
model.save('text_classification_model')

输出的模型结果如下:

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 2544) 0
_________________________________________________________________
layer_embedding (Embedding) (None, 2544, 100) 553200
_________________________________________________________________
conv1d (Conv1D) (None, 2544, 32) 9632
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 1272, 32) 0
_________________________________________________________________
cu_dnnlstm (CuDNNLSTM) (None, 100) 53600
_________________________________________________________________
dense (Dense) (None, 10) 1010
=================================================================
Total params: 617,442
Trainable params: 617,442
Non-trainable params: 0

设定模型训练次数为5个epoch,batch_size为16。模型训练完后,在训练集、验证集上的结果如下:

数据集accuracyloss训练集0.96610.1184验证集0.92040.2567

在测试集上的结果如下:

 precision recall f1-score support体育 0.9852 0.9970 0.9911 1000娱乐 0.9938 0.9690 0.9813 1000家居 0.9384 0.8830 0.9098 1000房产 0.9490 0.9680 0.9584 1000教育 0.9650 0.8820 0.9216 1000时尚 0.9418 0.9710 0.9562 1000时政 0.9732 0.9450 0.9589 1000游戏 0.9454 0.9700 0.9576 1000科技 0.8910 0.9560 0.9223 1000财经 0.9566 0.9920 0.9740 1000accuracy 0.9533 10000macro avg 0.9539 0.9533 0.9531 10000
weighted avg 0.9539 0.9533 0.9531 10000

总的来说,上述模型训练的效果还是很不错的。接下来,是考验模型的预测能力的时刻了,看看它是否具体文本分类的泛化能力。

测试

我们已经有了训练好的模型text_classification_model,接着让我们利用该模型来对新的数据进行预测,预测的代码(model_predict.py)如下:

# -*- coding: utf-8 -*-
# time: 2019-08-14 00:21
# place: Pudong Shanghai
import kashgari
# 加载模型
loaded_model = kashgari.utils.load_model('text_classification_model')
text = '华夏幸福成立于 1998 年,前身为廊坊市华夏房地产开发有限公司,初始注册资本 200 万元,其中王文学出资 160 万元,廊坊市融通物资贸易有限公司出资 40 万元,后经多次股权转让和增资,公司于 2007 年整体改制为股份制公司,2011 年完成借壳上市。'
x = [[_ for _ in text]]
label = loaded_model.predict(x)
print('预测分类:%s' % label)

以下是测试结果:

原文1: 华夏幸福成立于 1998 年,前身为廊坊市华夏房地产开发有限公司,初始注册资本 200 万元,其中王文学出资 160 万元,廊坊市融通物资贸易有限公司出资 40 万元,后经多次股权转让和增资,公司于 2007 年整体改制为股份制公司,2011 年完成借壳上市。分类结果:预测分类:[‘财经’]原文2: 现今常见的短袖衬衫大致上可以分为:夏威夷衬衫、古巴衬衫、保龄球衫,三者之间虽有些微分别,但其实有些时候,一件衬衫也可能包含了多种款式的特色。而‘古巴(领)衬衫’最显而易见的特点在于‘领口’,通常会设计为V领,且呈现微微的外翻,也因此缺少衬衫领口常见的‘第一颗钮扣’,衣服到领子的剪裁为一体成形,整体较宽松舒适。分类结果:预测分类:[‘时尚’]原文3:周琦2014年加盟新疆广汇篮球俱乐部,当年就代表俱乐部青年队接连拿下全国篮球青年联赛冠军和全国俱乐部青年联赛冠军。升入一队后,周琦2016年随队出战第25届亚冠杯,获得冠军。2016-2017赛季,周琦为新疆广汇队夺得队史首座总冠军奖杯立下汗马功劳,他在总决赛中带伤出战,更是传为佳话。分类结果:预测分类:[‘体育’]原文4: 周杰伦[微博]监制赛车电影《叱咤风云》13日释出花絮导演篇,不仅真实赛车竞速画面大量曝光,几十辆百万赛车在国际专业赛道、山路飙速,场面浩大震撼,更揭开不少现场拍摄的幕后画面。监制周杰伦在现场与导演讨论剧本、范逸臣[微博]与高英轩大打出手、甚至有眼尖网友发现在花絮中闪过“男神”李玉玺[微博]的画面。分类结果:预测分类:[‘娱乐’]原文5: 北京时间8月13日上午消息,据《韩国先驱报》网站报道,近日美国知识产权所有者协会( Intellectual Property Owners Association)发布的一份报告显示,在获得的美国专利数量方面,IBM、微软和通用电气等美国企业名列前茅,排在后面的韩国科技巨头三星、LG与之竞争激烈。分类结果:预测分类:[‘科技’]

总结

虽然我们上述测试的文本分类效果还不错,但也存在着一些分类错误的情况。

Python自然语言处理:轻松上手文本分类相关推荐

  1. Python 自然语言处理:轻松上手文本分类

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! 背景介绍 文本分类是NLP中的常见的重要任务之一,它的主要功能就是将输入的文本以及文本的类别训练出一个模型, ...

  2. Python 自然语言处理:轻松上手文本分类!

    背景介绍 文本分类是NLP中的常见的重要任务之一,它的主要功能就是将输入的文本以及文本的类别训练出一个模型,使之具有一定的泛化能力,能够对新文本进行较好地预测.它的应用很广泛,在很多领域发挥着重要作用 ...

  3. NLP(十六)轻松上手文本分类

    背景介绍   文本分类是NLP中的常见的重要任务之一,它的主要功能就是将输入的文本以及文本的类别训练出一个模型,使之具有一定的泛化能力,能够对新文本进行较好地预测.它的应用很广泛,在很多领域发挥着重要 ...

  4. 使用python和pyqt5轻松上手人脸识别系统(含代码)

    使用python和pyqt5轻松上手人脸识别系统(含代码) 一. 环境配置 1.1 python环境配置 1.1.1 安装 anaconda 1.1.2 安装pycharm 1.1.3 配置pip源 ...

  5. python朴素贝叶斯的文本分类_自给自足,完全手写一个朴素贝叶斯分类器,完成文本分类...

    Part 1: 本文解决的问题: 我在有这样的一个数据集,里面存放了人们对近期播放电影的评价,当然评价也就分成两部分,好评和差评.我们想利用这些数据训练一个模型,然后可以自动的对影评做出判断,到底是好 ...

  6. 基于Python的新浪新闻文本分类

    资源下载地址:https://download.csdn.net/download/sheziqiong/85736113 语料库构建 本项目的语料来源新浪新闻网,通过 spider.py 爬虫模块获 ...

  7. 人工智能NLP自然语言之基础篇文本分类pytorch-transformers实现BERT文本分类bert

    一.数据集介绍 中文文本分类数据集 数据来源: 今日头条客户端 数据格式: 6554695793956094477_!_110_!_news_military_!_「欧洲第一陆军」法兰西帝国的欧陆霸权 ...

  8. 使用python语言编写常见的文本分类算法

    自然语言处理中一个很常见的操作就是文本分类,比如一组新闻文本,通过分类模型,将新闻文本分为政治.体育.军事.娱乐.财经等等几大类.那么分类第一步就是文本向量化,前一篇博客讲了一些,本文可以说是前文的实 ...

  9. 自然语言处理-应用场景-文本分类:基于LSTM模型的情感分析【IMDB电影评论数据集】--(重点技术:自定义分词、文本序列化、输入数据批次化、词向量迁移使用)

    文本情感分类 1. 案例介绍 现在我们有一个经典的数据集IMDB数据集,地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的 ...

最新文章

  1. Vue---自定义组件
  2. 来自星星的你,我要代表月亮消灭你一
  3. Analyzer普通用户登录不了[从网络访问此计算机]
  4. 数据库 日期格式操作
  5. Sleuth则是用来共方便的集成Zipkin。
  6. html 长文本 截断 jquery 扩展脚本
  7. nfc加密卡pm3和pm5区别_小米手环4/5 NFC添加加密门禁
  8. 第5次基金申请终于中了!这个血泪教训一定要避免
  9. 如何查看Laravel版本号的三种方法
  10. 奔腾双核linux服务器,Dell推出双核心奔腾服务器
  11. ethtool -g rx_魔兽怀旧服:黑G团避坑指南
  12. Flink 端到端一致性
  13. GetModuleFileNameA函数与GetCurrentDirectoryA函数
  14. 关于top.html和bottom.html文件制作和调用的一点说明
  15. 微软逆转互联网战局,错过了智能手机却君临游戏帝国
  16. html注册新浪邮箱代码,新浪博客美化代码:邮箱快速登录
  17. 论文笔记:FILLING THE G AP S: MULTIVARIATE TIME SERIES IMPUTATION BY GRAPH NEURAL NETWORKS
  18. word怎么删除红色波浪线
  19. rar,zip文件加密判断
  20. 如何优化你的Google Play商店应用详情页面

热门文章

  1. 几款常见的视频格式转换器 1
  2. 英国《金融时报》:北京房奴VS纽约房奴
  3. [翻译]拒绝服务***详解之基础篇
  4. 8.学习Camera之——Android开机流程
  5. 前端知识每日小拷问 001
  6. 2003沈阳航空学院计算机分数线,沈阳航空航天大学
  7. kiwi浏览器下载及介绍
  8. python能否实现邮件合并_Python 基于Python实现邮件发送
  9. 学习型红外遥控器硬件结构说明
  10. MDK5.25 Jlink提示无器件解决方法