文本分类是自然语言处理(NLP)领域中一项重要任务,其主要目的是通过训练一个模型来识别输入文本的类别,从而使该模型具备一定的泛化能力,能够对新文本进行有效的分类。这项技术被广泛应用在多个领域,如垃圾邮件过滤、舆情分析和新闻分类等。
目前,文本分类模型种类繁多,既有传统的机器学习模型如朴素贝叶斯和支持向量机(SVM),也有深度学习模型如卷积神经网络(CNN)、循环神经网络(RNN)及其变种,例如CNN-LSTM和带有注意力机制的模型。
本文将以kashgari-tf为例,介绍如何利用这一工具实现文本分类任务。kashgari-tf支持多种文本分类模型,包括BiLSTM、CNN_LSTM和AVCNN等,同时也对预训练模型如BERT提供了良好的支持,使得用户可以方便地进行文本分类。
为了展示如何使用kashgari-tf进行文本分类,我们选取了THUCNews数据集作为示例。THUCNews数据集由2005年至2011年间新浪新闻的数据筛选整理而成,包含74万篇新闻文档,总大小约2.19GB。我们在原始的新浪新闻分类体系基础上,选择了10个类别:体育、娱乐、家居、房产、教育、时尚、时政、游戏、科技和财经。数据集共包含6.5万条记录,其中训练集5万条,验证集0.5万条,测试集1万条,每个类别的样本数相同。
接下来,我们将使用kashgari-tf中的CNN-LSTM模型进行训练。完整的Python代码如下所示:
```python
from kashgari.tasks.classification import CNNLSTMModel
def loaddata(datatype): with open(f'./data/cnews.{datatype}.txt', '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
trainx, trainy = loaddata('train') validx, validy = loaddata('val') testx, testy = load_data('test')
model = CNNLSTMModel() model.fit(trainx, trainy, validx, validy, batch_size=16, epochs=5)
model.evaluate(testx, testy)
model.save('textclassificationmodel') ```
模型训练完成后,在训练集和验证集上的表现如下:
| 数据集 | 准确率 | 损失 | |--------|-------|------| | 训练集 | 0.9661 | 0.1184 | | 验证集 | 0.9204 | 0.2567 |
在测试集上的表现如下:
| 类别 | 精准率 | 召回率 | F1分数 | 样本数 | |--------|-------|-------|-------|-------| | 体育 | 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 | 1000 | | 总体 | 0.9533 | 0.9533 | 0.9531 | 10000 |
总体来看,上述模型在测试集上的表现相当不错。接下来,我们将使用已经训练好的模型对新数据进行预测,代码如下:
```python
import kashgari
loadedmodel = kashgari.utils.loadmodel('textclassificationmodel')
text = '华夏幸福成立于 1998 年,前身为廊坊市华夏房地产开发有限公司,初始注册资本 200 万元,其中王文学出资 160 万元,廊坊市融通物资贸易有限公司出资 40 万元,后经多次股权转让和增资,公司于 2007 年全体改制为股份制公司,2011 年完成借壳上市。' x = [[_ for _ in text]] label = loaded_model.predict(x) print('预测分类:', label) ```
测试结果如下:
| 原文 | 分类结果 | |------|----------| | 华夏幸福成立于 1998 年,前身为廊坊市华夏房地产开发有限公司,初始注册资本 200 万元,其中王文学出资 160 万元,廊坊市融通物资贸易有限公司出资 40 万元,后经多次股权转让和增资,公司于 2007 年全体改制为股份制公司,2011 年完成借壳上市。 | 财经 | | 现今常见的短袖衬衫大致上可以分为:夏威夷衬衫、古巴衬衫、保龄球衫,三者之间虽有些微分别,但其实有些时候,一件衬衫也能够包含了多种样式的特征。而‘古巴(领)衬衫’最不言而喻的特点在于‘领口’,通常会设计为V领,且呈现悄然的外翻,也因此短少衬衫领口常见的‘第一颗钮扣’,衣服到领子的剪裁为一体成形,整体较宽松舒适。 | 时尚 | | 周琦2014年加盟新疆广汇篮球俱乐部,当年就代表俱乐部青年队接连拿下全国篮球青年联赛冠军和全国俱乐部青年联赛冠军。升入一队后,周琦2016年随队出战第25届亚冠杯,获得冠军。2016-2017赛季,周琦为新疆广汇队夺得队史首座总冠军奖杯立下汗马功劳,他在总决赛中带伤出战,更是传为佳话。 | 体育 | | 周杰伦[微博]监制赛车电影《叱咤风云》13日释出花絮导演篇,不仅真实赛车竞速画面大量曝光,几十辆百万赛车在国际专业赛道、山路飙速,场面宏大震撼,更揭开不少现场拍摄的幕后画面。监制周杰伦在现场与导演讨论剧本、范逸臣[微博]与高英轩大打出手、甚至有眼尖网友发现在花絮中闪过“男神”李玉玺[微博]的画面。 | 娱乐 | | 北京时间8月13日上午消息,据《韩国先驱报》网站报道,近日美国知识产权所有人协会(Intellectual Property Owners Association)发布的一份报告显示,在获得的美国专利数量方面,IBM、微软和通用电气等美国企业遥遥领先,排在后面的韩国科技巨头三星、LG与之竞争激烈。 | 科技 |
尽管测试结果显示模型在大多数情况下表现良好,但仍然存在一些分类错误的情况。本文介绍了如何利用kashgari-tf快速搭建文本分类系统,其实并没有想象中那么复杂。