Pytorch nn.Embedding|gensim

class torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)
  1. num_embeddings (int) – 嵌入字典的大小
  2. embedding_dim (int) – 每个嵌入向量的大小
  3. padding_idx (int, optional) – 如果提供的话,输出遇到此下标时用零填充
  4. max_norm (float, optional) – 如果提供的话,会重新归一化词嵌入,使它们的范数小于提供的值
  5. norm_type (float, optional) – 对于max_norm选项计算p范数时的p
  6. scale_grad_by_freq (boolean, optional) – 如果提供的话,会根据字典中单词频率缩放梯度
  7. weight weight (Tensor) -形状为(num_embeddings, embedding_dim)的模块中可学习的权值
  8. 输入: LongTensor (N, W), N = mini-batch, W = 每个mini-batch中提取的下标数
  9. 输出: (N, W, embedding_dim)

语料准备

test_sentence = """数学	是	利用	符号语言	研究	数量	 	结构	 	变化	以及	空间	等	概念	的	一门	学科	 	从	某种	角度看	属于	形式	科学	的	一种	 	数学	透过	抽象化	和	逻辑推理	的	使用	 	由	计数	 	计算	 	量度	和	对	物体	形状	及	运动	的	观察	而	产生	 	数学家	们	拓展	这些	概念	 	为了	公式化	新	的	猜想	以及	从	选定	的	公理	及	定义	中	建立	起	严谨	推导	出	的	定理	 	
	基础	数学	的	知识	与	运用	总是	个人	与	团体	生活	中	不可或缺	的	一环	 	对	数学	基本概念	的	完善	 	早	在	古埃及	 	美索不达米亚	及	古印度	内	的	古代	数学	文本	便	可观	见	 	而	在	古希腊	那里	有	更为	严谨	的	处理	 	从	那时	开始	 	数学	的	发展	便	持续	不断	地	小幅	进展	 	至	16	世纪	的	文艺复兴	时期	 	因为	新	的	科学	发现	和	数学	革新	两者	的	交互	 	致使	数学	的	加速	发展	 	直至	今日	 	数学	并	成为	许多	国家	及	地区	的	教育	范畴	中	的	一部分	 	
	今日	 	数学	使用	在	不同	的	领域	中	 	包括	科学	 	工程	 	医学	 	经济学	和	金融学	等	 	数学	对	这些	领域	的	应用	通常	被	称为	应用	数学	 	有时	亦	会	激起	新	的	数学	发现	 	并	导致	全新	学科	的	发展	 	例如	物理学	的	实质性	发展	中	建立	的	某些	理论	激发	数学家	对于	某些	问题	的	不同	角度	的	思考	 	数学家	也	研究	纯数学	 	就是	数学	本身	的	实质性	内容	 	而	不以	任何	实际	应用	为	目标	 	虽然	许多	研究	以	纯数学	开始	 	但	其	过程	中	也	发现	许多	应用	之	处	 	
	西方	语言	中	 	数学	 	一	词源	自于	古希腊	语	的	 	其有	 	学习	 	学问	 	科学	 	以及	另外	还有	个	较	狭义	且	技术性	的	意思	-	「	数学	研究	」	 	即使	在	其	语源	内	 	其	形容词	 	意思	为	 	和	学习	有关	的	 	或	 	用功	的	 	亦	会	被	用来	指	 	数学	的	 	其	在	英语	中	表面	上	的	复数	形式	 	及	在	法语	中	的	表面	复数	形式	 	可溯	至	拉丁文	的	中性	复数	 	由	西塞罗	译自	希腊文	复数	 	此一	希腊语	被	亚里士多德	拿来	指	「	万物	皆	数	」	的	概念	 	
""".split()
# 给每个单词编码,也就是用数字来表示每个单词,这样才能够传入word embeding得到词向量。
vocab = set(test_sentence) # 通过set将重复的单词去掉
word_to_idx = {word: i+1 for i, word in enumerate(vocab)}
# 定义了一个unknown的词,也就是说没有出现在训练集里的词,我们都叫做unknown,词向量就定义为0。
word_to_idx['<unk>'] = 0
idx_to_word = {i+1: word for i, word in enumerate(vocab)}
idx_to_word[0] = '<unk>'

加载预训练模型

self.embed = nn.Embedding(vocab_size, embedding_dim)
self.embed.weight.data.copy_(torch.from_numpy(pretrained_embeddings))

#==============================================
embed = nn.Embedding.from_pretrained(feat)

加载预训练词向量

'''转换向量过程'''
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors

# 预训练好的词向量
pre_file = datapath('test_glove.txt')

# =========glove需要转化为word2vec格式后文件的位置===========#

#tmp_file = get_tmpfile("test_word2vec.txt")
#from gensim.scripts.glove2word2vec import glove2word2vec
#glove2word2vec(pre_file, tmp_file)


#============ 使用gensim载入word2vec词向量============#
# w2v词向量直接加载
wvmodel = KeyedVectors.load_word2vec_format(tmp_file)


vocab_size = len(vocab) + 1
embed_size = 300 #维度需要和预训练词向量维度统一
weight = torch.zeros(vocab_size+1, embed_size)

for i in range(len(wvmodel.index2word)):
    try:
        index = word_to_idx[wvmodel.index2word[i]]
    except:
        continue
    weight[index, :] = torch.from_numpy(wvmodel.get_vector(
        idx_to_word[word_to_idx[wvmodel.index2word[i]]]))



#embed
embedding = nn.Embedding.from_pretrained(weight)

    原文作者:evellin
    原文地址: https://zhuanlan.zhihu.com/p/69898755
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞