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