# Text Classification
文本分类(Text Classification)是自然语言处理中的一个重要应用技术,根据文档的内容或主题,自动识别文档所属的预先定义的类别标签。文本分类是很多应用场景的基础,比如垃圾邮件识别,舆情分析,情感识别,新闻自动分类,智能客服机器人的知识库分类等等。本文分为两个部分:
- Part 1: 基于scikit-learn机器学习Python库,对比几个传统机器学习方法的文本分类。[Blog Post](https://lijqhs.github.io/2019/05/text-classification-scikit-learn/)
- Part 2: 基于预训练词向量模型,使用Keras工具进行文本分类,用到了CNN。[Blog Post](https://lijqhs.github.io/2019/05/text-classification-pretrained-keras-cnn/)
本文语料:[下载链接](https://pan.baidu.com/s/1Z4nMw-Eem0C71m8djI-OAA),密码:P9M4。更多新闻标注语料,[下载链接](http://www.sogou.com/labs/resource/list_news.php)。
预训练词向量模型来自[GitHub:Chinese Word Vectors 上百种预训练中文词向量](https://github.com/Embedding/Chinese-Word-Vectors),下载地址:[Sogou News 300d](https://pan.baidu.com/s/1tUghuTno5yOvOx4LXA9-wg)。
<!-- TOC -->
- [Text Classification](#text-classification)
- [Part 1: 基于scikit-learn机器学习的文本分类方法](#part-1-基于scikit-learn机器学习的文本分类方法)
- [1. 语料预处理](#1-语料预处理)
- [2. 生成训练集和测试集](#2-生成训练集和测试集)
- [生成数据集](#生成数据集)
- [3. 文本特征提取:TF-IDF](#3-文本特征提取tf-idf)
- [4. 构建分类器](#4-构建分类器)
- [Benchmark: 朴素贝叶斯分类器](#benchmark-朴素贝叶斯分类器)
- [对新文本应用分类](#对新文本应用分类)
- [5. 分类器的评估](#5-分类器的评估)
- [构建Logistic Regression分类器](#构建logistic-regression分类器)
- [构建SVM分类器](#构建svm分类器)
- [Part 2: 基于预训练模型的CNN文本分类方法-Keras](#part-2-基于预训练模型的cnn文本分类方法-keras)
- [1. 读取语料](#1-读取语料)
- [2. 加载预训练词向量模型](#2-加载预训练词向量模型)
- [3. 使用Keras对语料进行处理](#3-使用keras对语料进行处理)
- [4. 定义词嵌入矩阵](#4-定义词嵌入矩阵)
- [Embedding Layer](#embedding-layer)
- [5. 构建模型](#5-构建模型)
- [参考资料](#参考资料)
<!-- /TOC -->
## Part 1: 基于scikit-learn机器学习的文本分类方法
基于scikit-learn机器学习的中文文本分类主要分为以下步骤:
1. 语料预处理
2. 生成训练集和测试集
3. 文本特征提取:TF-IDF
4. 构建分类器
5. 分类器的评估
### 1. 语料预处理
定义搜狗新闻文本标签的名称,类似`C000008`这样的标签是语料的子目录,在网上搜到标签对应的新闻类别,为了便于理解,定义了这个映射词典,并保留原有编号信息。在网上搜索下载`搜狗分类新闻.20061127.zip`语料并解压至`CN_Corpus`目录下,解压之后目录结构为:
```
CN_Corpus
└─SogouC.reduced
└─Reduced
├─C000008
├─C000010
├─C000013
├─C000014
├─C000016
├─C000020
├─C000022
├─C000023
└─C000024
```
```python
category_labels = {
'C000008': '_08_Finance',
'C000010': '_10_IT',
'C000013': '_13_Health',
'C000014': '_14_Sports',
'C000016': '_16_Travel',
'C000020': '_20_Education',
'C000022': '_22_Recruit',
'C000023': '_23_Culture',
'C000024': '_24_Military'
}
```
下面进行语料的切分,将每个类别的前80%作为训练语料,后20%作为测试语料。切分完之后的语料目录如下:
```
data
├─test
│ ├─_08_Finance
│ ├─_10_IT
│ ├─_13_Health
│ ├─_14_Sports
│ ├─_16_Travel
│ ├─_20_Education
│ ├─_22_Recruit
│ ├─_23_Culture
│ └─_24_Military
└─train
├─_08_Finance
├─_10_IT
├─_13_Health
├─_14_Sports
├─_16_Travel
├─_20_Education
├─_22_Recruit
├─_23_Culture
└─_24_Military
```
### 2. 生成训练集和测试集
#### 生成数据集
从上面切分好的语料目录中读取文本并进行分词预处理,输出:训练语料数据(`X_train_data`)、训练语料标签(`y_train`)、测试语料数据(`X_test_data`)、测试语料标签(`y_test`)。
```python
X_train_data, y_train, X_test_data, y_test = load_datasets()
```
label: _08_Finance, len: 1500
label: _10_IT, len: 1500
label: _13_Health, len: 1500
label: _14_Sports, len: 1500
label: _16_Travel, len: 1500
label: _20_Education, len: 1500
label: _22_Recruit, len: 1500
label: _23_Culture, len: 1500
label: _24_Military, len: 1500
train corpus len: 13500
label: _08_Finance, len: 490
label: _10_IT, len: 490
label: _13_Health, len: 490
label: _14_Sports, len: 490
label: _16_Travel, len: 490
label: _20_Education, len: 490
label: _22_Recruit, len: 490
label: _23_Culture, len: 490
label: _24_Military, len: 490
test corpus len: 4410
数据集的形式如下:
```python
X_train_data[1000]
```
'新华网 上海 月 日电 记者 黄庭钧 继 日 人民币 兑 美元 中间价 突破 关口 创 历史 新高 后 日 人民币 兑 美元汇率 继续 攀升 中国外汇交易中心 日 公布 的 中间价 为 再刷 历史 新高 大有 逼近 和 突破 心理 关口 之势 据 兴业银行 资金 营运 中心 交易员 余屹 介绍 人民币 兑 美元汇率 日 走势 继续 表现 强劲 竞价 交易 以 开盘 后 最低 曾 回到 最高 则 触及 距 关口 仅 一步之遥 收报 而 询价 交易 亦 表现 不俗 以 开盘 后 曾经 走低 到 最高 仅触 到 截至 时 分 报收 虽然 全日 波幅 较窄 但 均 在 下方 有 跃跃欲试 关口 之 态势 完'
```python
y_train[1000]
```
'_08_Finance'
![wordcloud_example](img/wordcloud_example.png)
### 3. 文本特征提取:TF-IDF
这个步骤将文档信息,也即每篇新闻被分好词之后的词集合,转为为基于词频-你文档词频(TF-IDF)的向量,向量的每个元素都是对应于某个词在这个文档中的TF-IDF值,在不同文档中,同一词的TF-IDF是不一样的。所有文档的TF-IDF向量堆放在一起就组成了一个TF-IDF矩阵。注意到这里应该包含了除停用词之外的所有词的TF-IDF值,词的个数构成了向量的维度。
用`TfidfVectorizer`将文档集合转为`TF-IDF`矩阵。注意到前面我们将文本做了分词并用空格隔开。如果是英文,本身就是空格隔开的,而英文的分词(Tokenizing)是包含在特征提取器中的,不需要分词这一步骤。下面我们在得到了分类器之后,使用新文本进行分类预测时,也是需要先做一下中文分词的。
```python
stopwords = open('dict/stop_words.txt', encoding='utf-8').read().split()
# TF-IDF feature extraction
tfidf_vectorizer = TfidfVectorizer(stop_words=stopwords)
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train_data)
words = tfidf_vectorizer.get_feature_names()
```
```python
X_train_tfidf.shape
```
(13500, 223094)
```python
len(words)
```
223094
### 4. 构建分类器
#### Benchmark: 朴素贝叶斯分类器
得到了训练样本的文本特征,现在可以训练出一个分类器,以用来对新的新闻文本进行分类。`scikit-learn`中提供了多种分类器,其中[朴素贝叶斯](https://scikit-learn.org/stable/modules/naive_bayes.html#naive-bayes)是一个很好的基准,有多个版本的朴素贝叶斯分类器,其中[`MultinomialNB`](https://scikit-learn.org/stable/modules/naive_bayes.html#mul
中文文本分类实践,基于搜狗新闻语料库,采用传统机器学习方法以及预训练模型等方法.zip
版权申诉
86 浏览量
2024-02-15
12:28:30
上传
评论
收藏 207KB ZIP 举报
博士僧小星
- 粉丝: 1931
- 资源: 5897
最新资源
- 基于ARM的指令调度和延迟分支
- 基于Vue和TypeScript的极简聊天应用设计源码 - HasChat
- 基于Vue2全家桶和Zcool数据的图片收集网站设计源码 - cool-picture
- 基于C和C++的二维绘制工具设计源码 - DrawPro
- Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip
- 整卷预览.mhtml
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- 基于Javascript的结婚请帖设计源码 - Invitation
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈