08-词嵌入(Word embeddings)

本文介绍了文本分类中从One-hot编码到词嵌入的转变,包括整数编码的局限性和词嵌入的优势。通过一个电影评论情感分类的实例,展示了如何使用Keras进行数据预处理、创建包含Embedding层的模型,以及训练过程。最后,模型在验证集上取得了约79%的准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. One-hot编码

这一部分,之前已在 01-Embedding层是什么?怎么理解?简单的评论情感分类实验 这篇文章中详细解释过。
在这里插入图片描述

2. 用独一无二的数字编码每个单词

我们可能尝试的第二种方法是使用独一无二的数字对每个单词进行编码。继续上面的例子,您可以将1赋给“cat”,2赋给“mat”,以此类推。然后,你可以将“猫坐在垫子上”这句话编码为密集向量,如[5,1,4,3,5,2]。 这种方法是有效的。现在有了一个稠密的向量(所有元素都是满的),而不是一个稀疏的向量。

然而,这种方法也有两个缺点:

  1. 整数编码是任意的(它不捕获单词之间的任何关系)。
  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/ 目录。它有 posneg 文件夹,电影评论分别标记为正面和负面。我们将使用来自 posneg 文件夹的评论来训练二元分类模式。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值