一. 自然语言处理概述
自然语言处理(Nature language Processing, NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言,例如:汉语、英语、法语等,该类型的数据不像我们前面接触的过的结构化数据、或者图像数据可以很方便的进行数值化。
二. 词嵌入层
词嵌入层的作用就是将文本转换为向量。
语料分词, 构建词与索引的映射词表
nn.Embedding构建词嵌入矩阵
原理
词嵌入层首先会根据输入的词的数量构建一个词向量矩阵[词个数, 词向量(多少列表示一个词)] => [word_count, 词向量维度],例如: 我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为: 100*128,输入的每个词都对应了一个该矩阵中的一个向量。
API及代码
API
在 PyTorch 中,使用 nn.Embedding 词嵌入层来实现输入词的向量化。
nn.Embedding(num_embeddings=10, embedding_dim=4) """ nn.Embedding 对象构建时,最主要有两个参数: num_embeddings 表示词的数量 embedding_dim 表示用多少维的向量来表示每个词 """
词转词向量步骤
-
先将语料进行分词,构建词与索引的映射,我们可以把这个映射叫做
词表Vocab
,词表中每个词都对应了一个唯一的索引 -
然后使用 nn.Embedding 构建词嵌入矩阵,词索引对应的向量即为该词对应的数值化后的向量表示。
例如,文本数据为: "北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。",
代码
import jieba import torch.nn as nn import torch if __name__ == '__main__': # 读取文本 txt = '北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。' # jieba分词 words = jieba.lcut(txt) print('文本分词: \n', words) # 去重 unique_words = list(set(words)) print('去重后分词: \n', unique_words) # 构建词嵌入层 embedding = nn.Embedding(num_embeddings=len(unique_words), embedding_dim=4) print('词嵌入层: \n', embedding) # 词语的词向量表示 # enumerate: 获取索引和元素 for i, word in enumerate(unique_words): # print(torch.tensor(i), word) # 将第i个词转为tensor, 并通过词嵌入层进行转换 print(word, embedding(torch.tensor(i)))
三. 循环网络RNN
原理
基本介绍
文本数据是具有序列特性的
例如: "我爱你", 这串文本就是具有序列关系的,"爱" 需要在 "我" 之后,"你" 需要在 "爱" 之后, 如果颠倒了顺序,那么可能就会表达不同的意思。
为了表示出数据的序列关系,需要使用循环神经网络(Recurrent Nearal Networks, RNN) 来对数据进行建模,RNN 是一个作用于处理带有序列特点的样本数据。
计算过程
h 表示隐藏状态,
每一次的输入都会包含两个值: 上一个时间步的隐藏状态、当前状态的输入值,输出当前时间步的隐藏状态和当前时间步的预测结果。
上述内容画了 3 个神经元, 但是实际上只有一个神经元,"我爱你" 三个字是重复输入到同一个神经元中。
首先初始化出第一个隐藏状态h0,一般都是全0的一个