# text-classification-cnn
使用卷积神经网络(CNN)处理自然语言处理(NLP)中的文本分类问题。本文将结合TensorFlow代码介绍:
- 词嵌入
- **填充**
- **Embedding**
- 卷积层
- **卷积(tf.nn.conv1d)**
- 池化(pooling)
- 全连接层
- dropout
- 输出层
- softmax
**文件测试**
![](https://www.writebug.com/myres/static/uploads/2022/2/28/4045ee4af32ae66bcc1167f477082506.writebug)
**键盘输入测试**
![](https://www.writebug.com/myres/static/uploads/2022/2/28/d83f35c3342f34cf0b56f5e639a51b66.writebug)
#### 网络结构与解释
网络的主体结构如下如所示:
![](https://www.writebug.com/myres/static/uploads/2022/2/28/d75f67d821ba78d7fd97b5db3f7e72c9.writebug)
代码的详细流程图为:
![](https://www.writebug.com/myres/static/uploads/2022/2/28/57ff35812e3ae96c9c6ba40be85c078d.writebug)
##### **1. word embedding 词向量转换**
这也是NLP文本分类任务中最重要的一步,因为当我们知道如何用计算机能理解的**词向量**(word vector)**表示**自然语言的句子(sequence)时,文本分类问题就退化成了一个简单的数据分类问题,和MNIST分类本质上没有区别。
在解决这个问题之前,我们先回顾一下语言是如何表示的。
##### **如何表示一个词语的意思**
先来看看如何定义“意思”的意思,英文中meaning代表人或文字想要表达的idea。这是个递归的定义,估计查询idea词典会用meaning去解释它。
1. 用单词、短语等表示的想法
2. 人们想要通过单词、符号等表达的想法
3. 用写作,绘画的作品表达出来的想法
但是,目前在计算机系统处理语言上无法应用这种表示方法。
##### **计算机如何处理词语的意思**
最初的词向量是one-hot形式的向量,即只有单词所在的那一维是1,其他维都是0,向量长度和词汇表(vocab)大小一样。如下表所示:
| 文本 | 词向量 |
| :--- | :------------------------------------ |
| 一 | [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0] |
| 个 | [0,0,0,0,0,0,1,0,0,……,0,0,0,0,0,0,0] |
| 小 | [0,0,0,0,0,1,0,0,0,……,0,0,0,0,0,0,0] |
| 可 | [0,0,1,0,0,0,0,0,0,……,0,0,0,0,0,0,0] |
| 爱 | [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0] |
这种表示方法的缺点显而易见:
1.**容易造成维度灾难**。假设我们要表示5000个常用字,需要用5000维的词向量。如果表示词语或者成语则需要更大的词向量。
2.**对词语之间的语义关系起不到任何表达作用**。任何两个词语之间的距离都是相同的,无法使意思相近的词语距离也相近。
能不能把词向量的维度变小呢?
Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。
也就是**用神经网络来训练表示本身**。
理想状态下,我们可以将词语训练成如下图的表示方法。但是,其实实际操作中我们只需要指定词向量维度的大小,在训练时**不知道每一维具体表示什么含义**。
![](https://www.writebug.com/myres/static/uploads/2022/2/28/b02e3b3e5e0a9fdbc52ec3da2819bc35.writebug)
我们将king这个词从一个可能非常稀疏的向量坐在的空间,映射到现在这个四维向量所在的空间,必须满足以下性质:
(1) 这个映射是单设;
(2) 映射之后的向量不会丢失之前的那种向量所含的信息。
这个过程称为word embedding(词嵌入),即将高维词向量嵌入到一个低维空间。
![](https://www.writebug.com/myres/static/uploads/2022/2/28/961f144be8a06236c6775d891b922e27.writebug)
经过我们一系列的降维神操作,有了用Dristributed representation表示的较短的词向量,我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到2维,有一个有趣的研究表明,用下图的词向量表示我们的词时,我们可以发现:
$$
\overrightarrow{K i n g}-\overrightarrow{M a n}+\overrightarrow{W o m a n}=\overrightarrow{Q u e e n}
$$
是不是机器学习的学习能力也不错!
![](https://www.writebug.com/myres/static/uploads/2022/2/28/4849a1c272f3ac15fee44c5f7f5ee950.writebug)
##### **本文如何处理词语的意思**
**中文文本**的表示方式与英文有所不同,因为英文单词可以很容易地由空格区别,而中文通常需要先进行[**分词**](https://blog.csdn.net/qq_34243930/article/details/88903499)操作,然后对分词后的**词语**编码。不事先进行分词,直接对汉字编码的称为**字符级**编码。
本文先使用one-hot对文本进行**字符级**编码,然后通过神经网络训练出高维到低维的映射方式。详细的步骤为:
1.建立一个词汇表(vocab),该词汇表是包含输入**所有可能出现的字母、数字、符号及汉字的集合**(本文使用的vocab大小为5000)。vocab的形式如下表:
| id | 词汇 |
| :--- | :----- |
| … | … |
| 15 | 兰 |
| 16 | 布 |
| 17 | 柏 |
| 18 | 蒂 |
| 19 | 艺 |
| 20 | 的 |
| 21 | 吗 |
| 22 | 克 |
| 23 | (空格) |
| … | … |
2.用词汇表(vocab)将输入的文本转换成id列表的形式,代码为:
```python
with open_file(vocab_dir) as fp: # 打开vocab文件
words = [_.strip() for _ in fp.readlines()] # 按行读取词汇,并转成列表的形式
word_to_id = dict(zip(words, range(len(words)))) # 将词汇与id组合,并转成字典(dict)的形式
# word_to_id = {'兰':15, '布':16, '柏':17 ...}
```
假设有一段文本输入为:
```
'兰柏蒂克 布艺床 1.8米 双人床 软床 婚床'
```
使用上面的词汇表(vocab)转成id形式后为:
```
[15, 17, 18, 22, 23, 16, ...]
```
one-hot编码矩阵为:
```text
[ 0, 0, 0, 0, 0, 0, ...]
...
[ 1, 0, 0, 0, 0, 0, ...] # 下标15
[ 0, 0, 0, 0, 0, 1, ...]
[ 0, 1, 0, 0, 0, 0, ...]
[ 0, 0, 1, 0, 0, 0, ...]
[ 0, 0, 0, 0, 0, 0, ...]
[ 0, 0, 0, 0, 0, 0, ...] # 下标20
[ 0, 0, 0, 0, 0, 0, ...]
[ 0, 0, 0, 1, 0, 0, ...]
[ 0, 0, 0, 0, 1, 0, ...]
...
```
3.将文本pad为固定长度
```python
x_pad = kr.preprocessing.sequence.pad_sequences(data_id, max_length)
```
这里max_length设为100,代表文本的最大长度不能超过max_length,转成id形式的列表经过填充后变成**固定长度**的列表。填充(pad)的方式为在**前面填充若干个0**:
```text
[0, 0, 0, 0, 0, ...... ,15, 17, 18, 22, 23, 16, ...] # 填充0后长度为 max_length
```
4.词嵌入(embedding)
```python
embedding = tf.get_variable('embedding', [vocab_size, embedding_dim]) #5000×64
embedding_inputs = tf.nn.embedding_lookup(embedding, input_x)
```
上面的代码将5000维one-hot编码的输入文本转为较低维度(embedding_dim维)的用**实数**表示的词向量。在项目代码中embedding_dim设为64,为了简化问题,学习tf.nn.embedding_lookup的用法,**下面假设:**
```python
embedding_dim = 2 # 假设词向量仅用2维实数编码
input_x = [[0, 0, 0, 0, 0, ...... ,15, 17, 18, 22, 23, 16, ...]] # 这里有两层列表,外层列表表示输入的语句,因为只有一个语句所以长度为1
embedding = [[0,0], .....(下标为15)[0.1,1.5], [1.0,0.1], [0.2,0.1], [1.0,0.3], [0.5,0.1], (下标为20)[0.3,1.5
```
embe
没有合适的资源?快使用搜索试试~ 我知道了~
自然语言处理(NLP) 使用卷积神经网络(CNN)处理中的文本分类问题完整代码+数据可直接运行
共11个文件
py:5个
png:2个
txt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 127 浏览量
2023-02-06
21:05:06
上传
评论 1
收藏 820KB ZIP 举报
温馨提示
使用卷积神经网络(CNN)处理自然语言处理(NLP)中的文本分类问题。本文将结合TensorFlow代码介绍: 词嵌入 填充 Embedding 卷积层 卷积(tf.nn.conv1d) 池化(pooling) 全连接层 dropout 输出层 softmax 文件测试
资源推荐
资源详情
资源评论
收起资源包目录
使用卷积神经网络(CNN)处理自然语言处理(NLP)中的文本分类问题。.zip (11个子文件)
text-classification
data
vocab.txt 19KB
LICENSE 1KB
file_reader.py 4KB
model.py 2KB
.gitignore 1KB
images
result2.png 189KB
result1.png 611KB
train.py 5KB
test.py 4KB
README.md 11KB
config.py 1KB
共 11 条
- 1
甜辣uu
- 粉丝: 8383
- 资源: 1103
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页