自然语言处理(三):文本预处理之文本张量表示方法

自然语言处理笔记总目录


一、什么是文本张量表示

["人生", "该", "如何", "起头"]

# 每个词对应矩阵中的一个向量
[[1.32, 4,32, 0,32, 5.2],
[3.1, 5.43, 0.34, 3.2],
[3.21, 5.32, 2, 4.32],
[2.54, 7.32, 5.12, 9.54]]

二、文本张量表示的方法

2.1 one-hot编码

["改变", "要", "如何", "起手"]
 
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]]

代码实现:

# 导入用户对象保存和加载的包
import joblib
# 导入kears中的词汇映射器Tokenizer
from keras.preprocessing.text import Tokenizer

# 初始化一个词汇表
vocab = {"ZJL", "CYX", "WLH", "LZS", "WYF", "LH"}

# 实例化一个词汇映射器
t = Tokenizer(num_words=None, char_level=False)

# 在映射器上拟合现有的词汇表
t.fit_on_texts(vocab)

# 循环遍历词汇表,将每一个单词映射为独热编码
for i in vocab:
    zero_list = [0] * len(vocab)
    token_index = t.texts_to_sequences([i])[0][0] - 1
    zero_list[token_index] = 1
    print("{:5s}: {}".format(i, zero_list))

tokenizer_path = "./Tokenizer"
joblib.dump(t, tokenizer_path)

运行结果:
在这里插入图片描述
onehot编码器的使用:

import joblib

t = joblib.load("./Tokenizer")

token = "LZS"

token_index = t.texts_to_sequences([token])[0][0] - 1

zero_list = [0] * 6
zero_list[token_index] = 1
print(token, "的one-hot编码为:", zero_list)

运行结果:
在这里插入图片描述

one-hot编码劣势是很明显的,它完全割裂了词与词之间的联系,并且向量过长占据大量内存,在实际应用当中并不常用

2.2 Word2vec

Word2vec是一种流行的将词汇表示成向量的无监督训练方法, 该过程将构建神经网络模型, 将网络参数作为词汇的向量表示, 它包含CBOWskipgram两种训练模式

2.2.1 CBOW(Continuous bag of words)模式

给定一段用于训练的文本语料, 再选定某段长度(窗口)作为研究对象, 使用上下文词汇预测目标词汇
即为给出上下文,预测中间词,下图使用前后各4个词,预测中间的词,窗口长度为9

在这里插入图片描述

2.2.2 skipgram模式

给定一段用于训练的文本语料, 再选定某段长度(窗口)作为研究对象, 使用目标词汇预测上下文词汇
即为给出目标词,使用目标词汇对前后四个词汇进行预测,下图使用目标词预测左右各四个词

在这里插入图片描述

2.2.3 使用fasttext工具实现word2vec的训练和使用

  • 第一步: 获取训练数据
  • 第二步: 训练词向量
  • 第三步: 模型超参数设定
  • 第四步: 模型效果检验
  • 第五步: 模型的保存与重加载
2.2.3.1 第一步: 获取训练数据

我们将研究英语维基百科的部分网页信息, 它的大小在300M左右

可以使用命令行下载,进不去网站的可以点击这里进行下载

mkdir data
# 使用wget下载数据的zip压缩包, 它将存储在data目录中
wget -c http://mattmahoney.net/dc/enwik9.zip -P data

unzip data/enwik9.zip -d data
# 查看前十行
head -10 data/enwik9

原始数据将输出很多包含XML/HTML格式的内容, 这些内容并不是我们需要的,要去除

使用wikifil.pl文件去除这些格式,同时查看前80个字符

perl wikifil.pl data/enwik9 > data/fil9

head -c 80 data/fil9

输出结果为由空格分割的单词

anarchism originated as a term of abuse first used against early working class
2.2.3.2 第二步: 训练词向量
import fasttext

model = fasttext.train_unsupervised('data/fil9')
Read 124M words
Number of words: 218316
Number of labels: 0
Progress: 100.0% words/sec/thread:   48425 lr:  0.000000 avg.loss:  0.644253 ETA:   0h 0m 0s

通过get_word_vector方法来获得指定词汇的词向量

model.get_word_vector("the")

在这里插入图片描述

2.2.3.3 第三步: 模型超参数设定

在训练词向量过程中, 我们可以设定很多常用超参数来调节我们的模型效果

  • 无监督训练模式:‘skipgram’ 或者 ‘cbow’,默认为’skipgram’,在实践中,skipgram模
    式在利用子词方面比cbow更好.
  • 词嵌入维度dim:默认为100,但随着语料库的增大,词嵌入的维度往往也要更大
  • 数据循环次数epoch:默认为5, 但当数据集足够大时,可能不需要那么多次
  • 学习率lr:默认为0.05,根据经验,建议选择 [0.01, 1] 范围内
  • 使用的线程数thread:默认为12个线程, 一般建议和cpu核数相同
model = fasttext.train_unsupervised('../data/fil9', "cbow", dim=300, epoch=10, lr=0.1, thread=8)
2.2.3.4 第四步: 模型效果检验

检查单词向量质量的一种简单方法就是查看其邻近单词,通过我们主观来判断这些邻近单词是否与目标单词相关来粗略评定模型效果好坏

例如:
在这里插入图片描述

2.2.3.5 模型的保存与重加载

模型保存:

model.save_model("fil9.bin")

重加载与检验:

model2 = fasttext.load_model("fil9.bin")
model2.get_word_vector("the")

2.3Word Embedding

什么是word embedding(词嵌入):

  • 通过一定的方式将词汇映射到指定维度(一般是更高维度)的空间.
  • 广义的word embedding包括所有密集词汇向量的表示方法,如之前学习的word2vec,即可认为是word embedding的一种
  • 狭义的word embedding是指在神经网络中加入的embedding层,对整个网络进行训练的同时产生的embedding矩阵(embedding层的参数),这个embedding矩阵就是训练过程中所有输入词汇的向量表示组成的矩阵

例子:

import fileinput
import torch
import json
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter()

embedded = torch.randn(100, 50)

meta = list(map(lambda x: x.strip(), fileinput.FileInput("./vocab100.csv")))
writer.add_embedding(embedded, metadata=meta)
writer.close()

可以看见,在当前文件夹下生成了runs文件

tensorboard --logdir=runs

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeniusAng丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值