词嵌入(Word Embedding)是将离散的词语转换为连续的向量表示,以便模型可以处理这些向量。词嵌入的目的是将词语映射到一个低维的实数向量空间中,使得词与词之间的语义关系在这个空间中得到体现。
词嵌入的具体步骤
1. 准备词汇表
- 构建词汇表: 从训练数据中提取所有唯一的词汇,并为每个词汇分配一个唯一的索引。词汇表的大小决定了嵌入矩阵的行数。
2. 初始化嵌入矩阵
- 定义嵌入矩阵: 嵌入矩阵的大小为
(词汇表大小, 嵌入维度)
。例如,如果词汇表有 10,000 个词,嵌入维度设为 300,则嵌入矩阵的大小为(10,000, 300)
。 - 初始化: 嵌入矩阵可以用随机值初始化,或者使用预训练的词向量(如Word2Vec、GloVe)来初始化。
3. 训练词嵌入
- 训练模型: 使用神经网络模型(如Word2Vec、GloVe、BERT等)对嵌入矩阵进行训练,使其能够捕捉词语的语义关系。训练过程中,嵌入矩阵会根据上下文信息更新,以提高词向量的质量。
4. 查找词嵌入
- 映射词索引到词向量: 将文本中的每个词的索引用于查找嵌入矩阵,得到该词的词向量表示。
序列填充和嵌入表示
在处理文本数据时,通常需要将变长的文本序列填充到相同的长度,然后将这些填充后的序列转换为词嵌入表示。以下是具体步骤和示例:
1. 序列填充(Padding)
- 填充序列: 将所有文本序列填充或截断到相同的长度。通常,使用
<PAD>
标记填充到最大长度。 - 示例:
- 原始序列: ["I love programming", "Deep learning is fascinating"]
- 填充后序列(假设最大长度为 6):
- ["I", "love", "programming", "
", " ", " "] - ["Deep", "learning", "is", "fascinating", "
", " "]
- ["I", "love", "programming", "
2. 将填充后的序列转换为词嵌入
- 映射索引到词向量: 使用词汇表中的索引查找嵌入矩阵,得到每个词的词向量。
- 示例:
- 词汇表索引: {"I": 1, "love": 2, "programming": 3, "
": 0} - 嵌入矩阵(假设嵌入维度为 3):
嵌入矩阵 = [ [0.1, 0.2, 0.3], # <PAD> [0.4, 0.5, 0.6], # I [0.7, 0.8, 0.9], # love [1.0, 1.1, 1.2] # programming ]
- 填充后的序列转换为词嵌入表示:
- ["I", "love", "programming", "
", " ", " "] - 对应的词嵌入矩阵表示:
[ [0.4, 0.5, 0.6], # I [0.7, 0.8, 0.9], # love [1.0, 1.1, 1.2], # programming [0.1, 0.2, 0.3], # <PAD> [0.1, 0.2, 0.3], # <PAD> [0.1, 0.2, 0.3] # <PAD> ]
- ["I", "love", "programming", "
- 词汇表索引: {"I": 1, "love": 2, "programming": 3, "
示例代码
以下是 Python 中使用 Keras 来实现词嵌入和序列填充的示例代码:
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding
import numpy as np
# 示例文本数据
texts = ["I love programming.", "Deep learning is fascinating."]
# 1. 构建词汇表
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
word_index = tokenizer.word_index
# 2. 序列化文本
sequences = tokenizer.texts_to_sequences(texts)
# 3. 填充序列
max_length = 6
padded_sequences = pad_sequences(sequences, maxlen=max_length, padding='post')
# 4. 初始化词嵌入矩阵(随机初始化示例)
embedding_dim = 50
vocab_size = len(word_index) + 1
embedding_matrix = np.random.rand(vocab_size, embedding_dim)
# 5. 创建嵌入层
embedding_layer = Embedding(input_dim=vocab_size, output_dim=embedding_dim, weights=[embedding_matrix], trainable=False)
# 6. 获取词嵌入
word_embeddings = embedding_layer(padded_sequences)
print("词汇表:", word_index)
print("填充后的序列:", padded_sequences)
print("词嵌入:", word_embeddings.numpy())
总结
词嵌入将离散的词语映射到连续的向量空间中,以捕捉词语的语义关系。序列填充保证了输入序列的一致性和可处理性,而词嵌入将这些填充后的序列转换为模型可以理解的向量表示。通过这些步骤,文本数据可以有效地输入到深度学习模型中进行训练和推理。
标签:nlp,嵌入,填充,词汇表,矩阵,具体步骤,序列,向量 From: https://www.cnblogs.com/chentiao/p/18350372