赞
踩
["人生", "该", "如何", "起头"]
# 每个词对应矩阵中的一个向量
[[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]]
["改变", "要", "如何", "起手"]
[[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编码劣势是很明显的,它完全割裂了词与词之间的联系,并且向量过长占据大量内存,在实际应用当中并不常用
Word2vec是一种流行的将词汇表示成向量的无监督训练方法, 该过程将构建神经网络模型, 将网络参数作为词汇的向量表示, 它包含CBOW和skipgram两种训练模式
给定一段用于训练的文本语料, 再选定某段长度(窗口)作为研究对象, 使用上下文词汇预测目标词汇
即为给出上下文,预测中间词,下图使用前后各4个词,预测中间的词,窗口长度为9
给定一段用于训练的文本语料, 再选定某段长度(窗口)作为研究对象, 使用目标词汇预测上下文词汇
即为给出目标词,使用目标词汇对前后四个词汇进行预测,下图使用目标词预测左右各四个词
我们将研究英语维基百科的部分网页信息, 它的大小在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
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")
在训练词向量过程中, 我们可以设定很多常用超参数来调节我们的模型效果
model = fasttext.train_unsupervised('../data/fil9', "cbow", dim=300, epoch=10, lr=0.1, thread=8)
检查单词向量质量的一种简单方法就是查看其邻近单词,通过我们主观来判断这些邻近单词是否与目标单词相关来粗略评定模型效果好坏
例如:
模型保存:
model.save_model("fil9.bin")
重加载与检验:
model2 = fasttext.load_model("fil9.bin")
model2.get_word_vector("the")
什么是word 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。