文章目录
1. One-hot编码
这一部分,之前已在 01-Embedding层是什么?怎么理解?简单的评论情感分类实验 这篇文章中详细解释过。
2. 用独一无二的数字编码每个单词
我们可能尝试的第二种方法是使用独一无二的数字对每个单词进行编码。继续上面的例子,您可以将1赋给“cat”,2赋给“mat”,以此类推。然后,你可以将“猫坐在垫子上”这句话编码为密集向量,如[5,1,4,3,5,2]。 这种方法是有效的。现在有了一个稠密的向量(所有元素都是满的),而不是一个稀疏的向量。
然而,这种方法也有两个缺点:
- 整数编码是任意的(它不捕获单词之间的任何关系)。
- 对于模型来说,解释整数编码是一项挑战。例如,线性分类器学习每个特征的单个权重。因为任何两个单词的相似度与其编码的相似度之间没有关系,所以这种特征-权重组合是没有意义的。
3. 词嵌入
单词嵌入为我们提供了一种高效、密集的表示方式,其中相似的单词具有相似的编码。 重要的是,您不必手工指定这种编码。一个嵌入是一个密集的浮点值向量(向量的长度是你指定的参数)。不用手动指定嵌入的值,它们是可训练的参数(模型在训练过程中学习到的权值,与模型学习密集层的权值的方式相同)。通常可以看到8维(用于小型数据集)的单词嵌入,在处理大型数据集时可以达到1024维。更高维度的嵌入可以捕捉单词之间的细粒度关系,但需要更多的数据来学习。
上面是一个单词嵌入图。每个单词都表示为一个4维的浮点值向量。另一种理解嵌入的方法是“查找表”。在掌握了这些权重之后,您可以通过查找表中它对应的密集向量来对每个单词进行编码。
4. 代码示例
4.1 数据准备
导入所需要的包:
import io
import os
import re # 规则表达式(Regular Expression, RE),在Python中使用正则表达式,需要导入re模块。
import shutil
import string
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
from tensorflow.keras.layers import TextVectorization
我们将在本教程中使用大型电影评论数据集。在此数据集上训练情感分类器模型,并在此过程中从头开始学习嵌入。使用 Keras 文件实用程序下载数据集并查看目录。
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
dataset = tf.keras.utils.get_file("aclImdb_v1.tar.gz", url,
untar=True, cache_dir='.',
cache_subdir='')
dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb') # /public/home/zhaiyuxin/mycode/classnote/tensorflow_zyx/aclImdb
print(os.listdir(dataset_dir)) # ['imdbEr.txt', 'train', 'imdb.vocab', 'test', 'README']
其格式如下所示:
看一下 train/
目录。它有 pos
和 neg
文件夹,电影评论分别标记为正面和负面。我们将使用来自 pos
和 neg
文件夹的评论来训练二元分类模式。
train_dir = os.path.join(dataset_dir, 'train')
print(os.listdir(train_dir)) # ['urls_neg.txt', 'pos', 'labeledBow.feat', 'urls_pos.txt', 'unsup', 'neg', 'unsupBow.feat', 'urls_unsup.txt']
train
目录还有其他文件夹,在创建训练数据集之前应将其删除。
remove_dir = os.path.join(train_dir, 'unsup') # 删除该目录中多余的unsup文件夹
shutil.rmtree(remove_dir) # shutil.rmtree() 递归删除一个目录以及目录内的所有内容
print(os.listdir(train_dir)) # ['urls_neg.txt', 'pos', 'labeledBow.feat', 'u