当前位置:   article > 正文

Embedding和Word2Vec用法

word2vector加载与使用embedding词典

Embedding

Embedding 层的输入是一个二维整数张量, 形状为(samples,sequence_length),即(样本数,序列长度)

较短的序列应该用 0 填充,较长的序列应该被截断,保证输入的序列长度是相同的

Embedding 层输出是(samples,sequence_length,embedding_dimensionality) 的三维浮点数张量。

  • 首先,我们需要对文本进行分词处理,然后对分词结果进行序列化
  • 再统一输入的序列长度,最后把统一长度的序列化结果输入到 Embedding 层中

整个过程可以用下面的图描述:

从样本的角度看,我们可以用下面的图描述这个过程:

gensim库提供了一个word2vec的实现,我们使用几个API就可以方便地完成word2vec

gensim实现Word2Vec

示意代码如下:

  1. from torch import nn
  2. from gensim.models import Word2Vec
  3. # w2v模型位置
  4. w2v_path = "model/w2v_all.model"
  5. class Preprocess():
  6. def __init__(self,sentences,sen_len,w2v_path=w2v_path):
  7. self.w2v_path = w2v_path
  8. self.sentences = sentences
  9. self.sen_len = sen_len
  10. self.idx2word = []
  11. self.word2idx = {}
  12. self.embedding_matrix = []
  13. def get_w2v_model(self):
  14. # 把之前保存的w2v模型加载进来
  15. self.embedding = Word2Vec.load(self.w2v_path)
  16. self.embedding_dim = self.embedding.vector_size
  17. def add_embedding(self,word):
  18. # 把word加进embedding 并赋值一个随机向量
  19. vector = torch.empty(1,self.embedding_dim) #return a tensor filled with uninitialed dada. shape is (1*embedding_dim)
  20. #从均匀分布U(a,b)中生成值,填充参数vector,默认a=0,b=1
  21. torch.nn.init.uniform_(vector)
  22. self.word2idx[word] = len(self.word2idx) #为word2idx字典填充后,word2idx长度会加1
  23. self.idx2word.append(word)
  24. print("word:",word)
  25. # torch.cat是将两个张量(tensor)拼接在一起 按维数0拼接(竖着拼)
  26. self.embedding_matrix = torch.cat([self.embedding_matrix,vector],0)
  27. print("embedding_matrix.shape",self.embedding_matrix.shape)
  28. def make_embedding(self,load=True):
  29. print("get embedding..")
  30. #加载embedding模型
  31. if load:
  32. print("加载word to vec模型")
  33. self.get_w2v_model()
  34. else:
  35. raise NotImplementedError
  36. # 制作一个word2idx的字典
  37. # 制作一个idx2word的list
  38. # 制作一个word2vector的list
  39. for i,word in enumerate(self.embedding.wv.key_to_index ):
  40. print('get words #{}'.format(i+1), end='\r')
  41. # 例:self.word2idx['李']=1
  42. # self.idx2word[1]='李'
  43. # self.vector[1]='李'
  44. self.word2idx[word]=len(self.word2idx)
  45. self.idx2word.append(word)
  46. self.embedding_matrix.append(self.embedding.wv[word])
  47. # 将embedding_matrix转为tensor类型
  48. self.embedding_matrix = torch.tensor(self.embedding_matrix)
  49. # 将PAD和UNK加入embedding中
  50. self.add_embedding("<PAD>")
  51. self.add_embedding("<UNK>")
  52. print("total words: {}".format(len(self.embedding_matrix)))
  53. return self.embedding_matrix
  54. def pad_sequence(self,sentence):
  55. # 将每个句子变成统一的长度
  56. if len(sentence)>self.sen_len:
  57. sentence = sentence[:self.sen_len] #截断
  58. else:
  59. pad_len = self.sen_len-len(sentence)
  60. for _ in range(pad_len):
  61. sentence.append(self.word2idx["<PAD>"])
  62. assert len(sentence)==self.sen_len
  63. return sentence
  64. def sentence_word2idx(self):
  65. # 把句子里面的字转成对应的index
  66. sentence_list = []
  67. for i,sen in enumerate(self.sentences):
  68. print('sentence count #{}'.format(i+1), end='\r')
  69. sentence_idx = []
  70. for word in sen:
  71. if(word in self.word2idx.keys()):
  72. sentence_idx.append(self.word2idx[word])
  73. else:
  74. sentence_idx.append(self.word2idx["<UNK>"])
  75. # 把每个句子长度统一
  76. sentence_idx = self.pad_sequence(sentence_idx)
  77. sentence_list.append(sentence_idx)
  78. return torch.LongTensor(sentence_list)
  79. def labels_to_tensor(self,y):
  80. #把标签label也转为tensor
  81. y = [int(label) for label in y]
  82. return torch.LongTensor(y)
  1. def train_word2vec(x):
  2. # 训练word embedding
  3. """
  4. Embedding 层的输入是一个二维整数张量, 形状为(samples,sequence_length),即(样本数,序列长度)
  5. Embedding 层输出是(samples,sequence_length,embedding_dimensionality) 的三维浮点数张量。
  6. """
  7. model = word2vec.Word2Vec(x,vector_size=250,window=5,min_count=5,workers=12,epochs=10,sg=1) #iter is epochs
  8. return model
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/751179
推荐阅读
相关标签
  

闽ICP备14008679号