Embedding和Word2Vec⽤法Embedding
Embedding 层的输⼊是⼀个⼆维整数张量, 形状为(samples,quence_length),即(样本数,序列长度)较短的序列应该⽤ 0 填充,较长的序列应该被截断,保证输⼊的序列长度是相同的
Embedding 层输出是(samples,quence_length,embedding_dimensionality) 的三维浮点数张量。
⾸先,我们需要对⽂本进⾏分词处理,然后对分词结果进⾏序列化
再统⼀输⼊的序列长度,最后把统⼀长度的序列化结果输⼊到 Embedding 层中
整个过程可以⽤下⾯的图描述:
学位英语考试网从样本的⾓度看,我们可以⽤下⾯的图描述这个过程:
gensim库提供了⼀个word2vec的实现,我们使⽤⼏个API就可以⽅便地完成word2vec
gensim实现Word2Vec
北大青鸟电脑培训
⽰意代码如下:
from torch import nn
dels import Word2Vec
# w2v模型位置
w2v_path = "model/del"
class Preprocess():
def __init__(lf,ntences,n_len,w2v_path=w2v_path):
lf.w2v_path = w2v_path
lf.n_len = n_len
lf.idx2word = []
lf.word2idx = {}
lesspressurebetterlife
def get_w2v_model(lf):
# 把之前保存的w2v模型加载进来
def add_embedding(lf,word):
# 把word加进embedding 并赋值⼀个随机向量
vector = pty(bedding_dim) #return a tensor filled with uninitialed dada. shape is (1*embedding_dim) #从均匀分布U(a,b)中⽣成值,填充参数vector,默认a=0,b=1
lf.word2idx[word] = len(lf.word2idx) #为word2idx字典填充后,word2idx长度会加1
lf.idx2word.append(word)
print("word:",word)
# torch.cat是将两个张量(tensor)拼接在⼀起按维数0拼接(竖着拼)
print("embedding_matrix.shape",lf.embedding_matrix.shape)
def make_embedding(lf,load=True):
print("get embedding..")
#加载embedding模型
if load:
print("加载word to vec模型")
<_w2v_model()
el:
rai NotImplementedError
# 制作⼀个word2idx的字典
# 制作⼀个idx2word的list
# 制作⼀个word2vector的list
for i,word in bedding.wv.key_to_index ):
print('get words #{}'.format(i+1), end='\r')
# 例:lf.word2idx['李']=1
# lf.idx2word[1]='李'
休息的意思# lf.vector[1]='李'
lf.word2idx[word]=len(lf.word2idx)
lf.idx2word.append(word)
autopatch
# 将embedding_matrix转为tensor类型
# 将PAD和UNK加⼊embedding中
lf.add_embedding("<PAD>")
lf.add_embedding("<UNK>")
print("total words: {}".format(bedding_matrix)))
bedding_matrix
def pad_quence(lf,ntence):
# 将每个句⼦变成统⼀的长度winsys
日语 培训if len(ntence)>lf.n_len:
no church in the wild
ntence = ntence[:lf.n_len] #截断
el:
el:
pad_len = lf.n_len-len(ntence)
for _ in range(pad_len):
ntence.append(lf.word2idx["<PAD>"])
asrt len(ntence)==lf.n_len
return ntence
def ntence_word2idx(lf):
# 把句⼦⾥⾯的字转成对应的index
ntence_list = []
for i,n in s):
print('ntence count #{}'.format(i+1), end='\r')
ntence_idx = []
for word in n:
if(word in lf.word2idx.keys()):
ntence_idx.append(lf.word2idx[word])
el:
ntence_idx.append(lf.word2idx["<UNK>"])
# 把每个句⼦长度统⼀焦虑烦躁
ntence_idx = lf.pad_quence(ntence_idx)
ntence_list.append(ntence_idx)
return torch.LongTensor(ntence_list)
def labels_to_tensor(lf,y):
#把标签label也转为tensor
y = [int(label) for label in y]
return torch.LongTensor(y)
def train_word2vec(x):
# 训练word embedding
"""
Embedding 层的输⼊是⼀个⼆维整数张量,形状为(samples,quence_length),即(样本数,序列长度)
Embedding 层输出是(samples,quence_length,embedding_dimensionality) 的三维浮点数张量。
"""
model = word2vec.Word2Vec(x,vector_size=250,window=5,min_count=5,workers=12,epochs=10,sg=1) #iter is epochs return model
凳子的英文