您的位置:

预训练词向量详解

一、预训练词向量可以用测试集吗

预训练词向量是通过对大规模语料进行训练,学习出每个单词的向量表示,使得语言模型在词汇相似度、情感分类、实体识别等任务上表现出更好的性能。一般情况下,预训练词向量是在训练集上进行训练得到的,但是也可以在测试集上用来评估模型的性能。当测试集与训练集的文本领域和主题差异较大时,使用预训练词向量可以提升模型的性能。

在实际应用中,我们可以使用预训练的词向量对测试集进行处理,将其转换为向量表示,然后和训练集中的向量进行比较。我们可以使用余弦相似度等方法来衡量两个向量之间的相似程度。

#使用预训练词向量对测试集进行处理
import torch
import torch.nn as nn
from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
text = '这是一篇测试文本'
input_ids = tokenizer(text, padding=True, truncation=True, return_tensors='pt')['input_ids']
with torch.no_grad():
  last_hidden_states = model(input_ids)[0]

二、训练词向量中文语料

在中文语料的训练中,我们需要先对文本进行分词处理,将文本转换为单词序列,然后使用word2vec、glove等算法对单词进行向量化表示。在中文语料处理中,需要注意一些特殊的问题,如中文文本中的词汇组成形式、词汇的歧义性、分词系统的选择等。因此需要进行一些特殊的处理,如使用jieba分词进行分词等。

在训练中,我们使用Skip-gram算法来学习词向量,首先随机初始化词向量,然后通过最大化所有单词与其上下文的余弦相似度来学习单词的向量表示。对于每个单词,我们会采样num_samples个“噪音”单词作为负面例子,同时使用优化方法进行模型更新。

#使用gensim库进行中文语料词向量训练
from gensim.models import Word2Vec
import jieba

# 假设已有训练语料corpus,每行为分词后文本
corpus = [['这是', '一只', '很', '可爱', '的', '猫'], ['这是', '一只', '很', '凶猛', '的', '狗']]

model = Word2Vec(sentences=corpus, size=100, window=5, min_count=1, workers=4, sg=1)
model.save('./chinese_word2vec.model')  # 保存模型
model = Word2Vec.load('./chinese_word2vec.model')  # 加载模型

三、预训练词向量在哪里下载

目前常用的预训练词向量包括GloVe、Word2vec等。这些词向量可以在官方网站或者开发者提供的预训练词向量库中进行下载和使用。以Word2vec为例,我们可以在以下链接中找到训练好的中文词向量:

https://github.com/Embedding/Chinese-Word-Vectors

#使用预训练的中文词向量进行词汇相似度计算
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('./sgns.zhihu.bigram', binary=False)

#计算两个词汇的相似度
word1 = '开心'
word2 = '高兴'
result = model.similarity(word1, word2)

四、训练词向量

对于某些特殊的数据集,我们可以自己训练词向量。通常使用的算法有word2vec、glove等。在训练中,我们需要指定一些参数,如词向量的维度、窗口大小、负采样的数量等。

#使用gensim库训练自己的词向量
from gensim.models import Word2Vec
import jieba

# 假设已有训练语料corpus,每行为分词后文本
corpus = [['这是', '一只', '很', '可爱', '的', '猫'], ['这是', '一只', '很', '凶猛', '的', '狗']]

model = Word2Vec(sentences=corpus, size=100, window=5, min_count=1, workers=4, sg=1)
model.save('./my_word2vec.model')  # 保存模型
model = Word2Vec.load('./my_word2vec.model')  # 加载模型

五、训练词向量的算法有哪些

训练词向量的算法主要包括CBOW和Skip-gram两种,其中Skip-gram算法是当前应用最广泛的一种。Skip-gram算法是一种将单词投射到低维空间中的方式,它会利用单词周围的上下文信息,学习出每个单词的向量表示,使单词向量之间的距离与含义之间的关系更加接近。

在Skip-gram算法中,每个单词都被表示为一个向量,其余单词都被表示为一个与其单词数量相同的向量。在训练时,我们需要随机抽样目标单词周围的一些单词,来预测目标单词。训练时使用的目标值是二进制,表示目标单词是否出现在其他单词的周围窗口中。Skip-gram算法通常涉及到两个矩阵,一个是输入向量,一个是输出向量。输入向量指的是一个单词的向量表达形式,输出向量指的是当这个单词出现在一个词对或者一个句子中的时候的向量表达形式。

#使用gensim库训练CBOW词向量
from gensim.models import Word2Vec
import jieba

# 假设已有训练语料corpus,每行为分词后文本
corpus = [['这是', '一只', '很', '可爱', '的', '猫'], ['这是', '一只', '很', '凶猛', '的', '狗']]

model = Word2Vec(sentences=corpus, size=100, window=5, min_count=1, workers=4, sg=0)
model.save('./cbow_word2vec.model')  # 保存模型
model = Word2Vec.load('./cbow_word2vec.model')  # 加载模型

六、自己训练的词向量与预训练的区别

自己训练的词向量与预训练的词向量在训练数据规模、词汇覆盖范围、数据集特征等方面有所不同。预训练的词向量往往基于大型通用语料库进行训练,旨在学习单词的通用语义和模式,涵盖更广泛的语言方言和语种,通常对于任务的适应性更强。自己训练的词向量往往基于任务相关和特定领域数据进行训练,旨在学习与特定领域相关的特征和模式,通常能够更好地适应于任务。

另外,在训练的超参数、算法选择方面也会对词向量在性能上产生更明显的区别。