PaddleNLP 提供多个开源的预训练词向量模型,使用非常便捷。接下来结合官方给出的详细文档总结下主要的内容。
https://paddlenlp.readthedocs.io/zh/latest/model_zoo/embeddings.html#id8
- 词向量模型介绍
- 词向量模型使用
1. 词向量模型介绍
我们加载的词向量模型的命名规则如下:
训练模型.语料.词向量类型.上下文类型.向量维度
词向量模型主要分为三类:
- Word2Vec – w2v
- skip-gramGloVe – glove
- FastText – fasttext
语料主要有:
- baidu Encyclopedia 百度百科 – baidu_encyclopedia
- Wikipedia_zh 中文维基百科 – wiki
- People’s Daily News 人民日报 – people_daily
- Sogou News 搜狗新闻 – sogou
- Financial News 金融新闻 – financial
- Zhihu_QA 知乎问答 – zhihu
- Weibo 微博 – weibo
- Literature 文学作品 – literature
- Complete Library in Four Sections 四库全书 – sikuquanshu
- Mixed-large 综合 – mixed-large
词向量类型主要有:
- target
- context
上下文类型主要有:
- word 表示训练时目标词预测的上下文是一个 word
- word + n-gram 表示训练时目标词预测的上下文是一个 word 或者 ngram,其中 bigram 表示 2-gram ngram.1-2 表示 1-gram 或者 2-gram
- word + character 表示训练时目标词预测的上下文是一个 word 或者 character,其中word-character.char1-2 表示上下文是 1 个或 2 个character
- word + character + ngram 表示训练时目标词预测的上下文是一个 word、character 或者 ngram,bigram-char 表示上下文是 2-gram 或者 1 个 character。
例如:w2v.baidu_encyclopedia.target.word-word.dim300 表示使用的是 wor2vec 模型、百度百科中文语料、目标词向量、预测的上下文是 word、词向量的维度是 300 维。
我们通过 PaddleNLP 中的方法可获得所有可用的词向量模型,示例代码如下:
from paddlenlp.embeddings import TokenEmbedding
from paddlenlp.embeddings import list_embedding_name
def test():
embedding_model_names = list_embedding_name()
print('\n'.join(embedding_model_names))
if __name__ == '__main__':
test()
程序输出部分结果:
w2v.baidu_encyclopedia.target.word-word.dim300 w2v.wiki.target.word-bigram.dim300 w2v.people_daily.target.word-char.dim300 w2v.weibo.target.word-bigram.dim300 w2v.sogou.target.bigram-char.dim300 w2v.zhihu.target.bigram-char.dim300 w2v.financial.target.bigram-char.dim300 w2v.literature.target.bigram-char.dim300 w2v.sikuquanshu.target.word-word.dim300 w2v.mixed-large.target.word-char.dim300 w2v.google_news.target.word-word.dim300.en glove.wiki2014-gigaword.target.word-word.dim50.en glove.wiki2014-gigaword.target.word-word.dim100.en glove.twitter.target.word-word.dim25.en glove.twitter.target.word-word.dim200.en fasttext.wiki-news.target.word-word.dim300.en fasttext.crawl.target.word-word.dim300.en
模型信息:
| 模型 | 文件大小 | 词表大小 |
|---|---|---|
| w2v.baidu_encyclopedia.target.word-word.dim300 | 678.21 MB | 635965 |
| w2v.baidu_encyclopedia.target.word-character.char1-1.dim300 | 679.15 MB | 636038 |
| w2v.baidu_encyclopedia.target.word-character.char1-2.dim300 | 679.30 MB | 636038 |
| w2v.baidu_encyclopedia.target.word-character.char1-4.dim300 | 679.51 MB | 636038 |
| w2v.baidu_encyclopedia.target.word-ngram.1-2.dim300 | 679.48 MB | 635977 |
| w2v.baidu_encyclopedia.target.word-ngram.1-3.dim300 | 671.27 MB | 628669 |
| w2v.baidu_encyclopedia.target.word-ngram.2-2.dim300 | 7.28 GB | 6969069 |
| w2v.baidu_encyclopedia.target.word-wordLR.dim300 | 678.22 MB | 635958 |
| w2v.baidu_encyclopedia.target.word-wordPosition.dim300 | 679.32 MB | 636038 |
| w2v.baidu_encyclopedia.target.bigram-char.dim300 | 679.29 MB | 635976 |
| w2v.baidu_encyclopedia.context.word-word.dim300 | 677.74 MB | 635952 |
| w2v.baidu_encyclopedia.context.word-character.char1-1.dim300 | 678.65 MB | 636200 |
| w2v.baidu_encyclopedia.context.word-character.char1-2.dim300 | 844.23 MB | 792631 |
| w2v.baidu_encyclopedia.context.word-character.char1-4.dim300 | 1.16 GB | 1117461 |
| w2v.baidu_encyclopedia.context.word-ngram.1-2.dim300 | 7.25 GB | 6967598 |
| w2v.baidu_encyclopedia.context.word-ngram.1-3.dim300 | 5.21 GB | 5000001 |
| w2v.baidu_encyclopedia.context.word-ngram.2-2.dim300 | 7.26 GB | 6968998 |
| w2v.baidu_encyclopedia.context.word-wordLR.dim300 | 1.32 GB | 1271031 |
| w2v.baidu_encyclopedia.context.word-wordPosition.dim300 | 6.47 GB | 6293920 |
| w2v.wiki.target.bigram-char.dim300 | 375.98 MB | 352274 |
| w2v.wiki.target.word-char.dim300 | 375.52 MB | 352223 |
| w2v.wiki.target.word-word.dim300 | 374.95 MB | 352219 |
| w2v.wiki.target.word-bigram.dim300 | 375.72 MB | 352219 |
| w2v.people_daily.target.bigram-char.dim300 | 379.96 MB | 356055 |
| w2v.people_daily.target.word-char.dim300 | 379.45 MB | 355998 |
| w2v.people_daily.target.word-word.dim300 | 378.93 MB | 355989 |
| w2v.people_daily.target.word-bigram.dim300 | 379.68 MB | 355991 |
| w2v.weibo.target.bigram-char.dim300 | 208.24 MB | 195199 |
| w2v.weibo.target.word-char.dim300 | 208.03 MB | 195204 |
| w2v.weibo.target.word-word.dim300 | 207.94 MB | 195204 |
| w2v.weibo.target.word-bigram.dim300 | 208.19 MB | 195204 |
| w2v.sogou.target.bigram-char.dim300 | 389.81 MB | 365112 |
| w2v.sogou.target.word-char.dim300 | 389.89 MB | 365078 |
| w2v.sogou.target.word-word.dim300 | 388.66 MB | 364992 |
| w2v.sogou.target.word-bigram.dim300 | 388.66 MB | 364994 |
| w2v.zhihu.target.bigram-char.dim300 | 277.35 MB | 259755 |
| w2v.zhihu.target.word-char.dim300 | 277.40 MB | 259940 |
| w2v.zhihu.target.word-word.dim300 | 276.98 MB | 259871 |
| w2v.zhihu.target.word-bigram.dim300 | 277.53 MB | 259885 |
| w2v.financial.target.bigram-char.dim300 | 499.52 MB | 467163 |
| w2v.financial.target.word-char.dim300 | 499.17 MB | 467343 |
| w2v.financial.target.word-word.dim300 | 498.94 MB | 467324 |
| w2v.financial.target.word-bigram.dim300 | 499.54 MB | 467331 |
| w2v.literature.target.bigram-char.dim300 | 200.69 MB | 187975 |
| w2v.literature.target.word-char.dim300 | 200.44 MB | 187980 |
| w2v.literature.target.word-word.dim300 | 200.28 MB | 187961 |
| w2v.literature.target.word-bigram.dim300 | 200.59 MB | 187962 |
| w2v.sikuquanshu.target.word-word.dim300 | 20.70 MB | 19529 |
| w2v.sikuquanshu.target.word-bigram.dim300 | 20.77 MB | 19529 |
| w2v.mixed-large.target.word-char.dim300 | 1.35 GB | 1292552 |
| w2v.mixed-large.target.word-word.dim300 | 1.35 GB | 1292483 |
| w2v.google_news.target.word-word.dim300.en | 1.61 GB | 3000000 |
| glove.wiki2014-gigaword.target.word-word.dim50.en | 73.45 MB | 400002 |
| glove.wiki2014-gigaword.target.word-word.dim100.en | 143.30 MB | 400002 |
| glove.wiki2014-gigaword.target.word-word.dim200.en | 282.97 MB | 400002 |
| glove.wiki2014-gigaword.target.word-word.dim300.en | 422.83 MB | 400002 |
| glove.twitter.target.word-word.dim25.en | 116.92 MB | 1193516 |
| glove.twitter.target.word-word.dim50.en | 221.64 MB | 1193516 |
| glove.twitter.target.word-word.dim100.en | 431.08 MB | 1193516 |
| glove.twitter.target.word-word.dim200.en | 848.56 MB | 1193516 |
| fasttext.wiki-news.target.word-word.dim300.en | 541.63 MB | 999996 |
| fasttext.crawl.target.word-word.dim300.en | 1.19 GB | 2000002 |
2. 词向量模型使用
这一部分内容主要介绍下如何加载词向量模型、如何获得词向量、如何计算词向量的相似度等等内容,示例代码如下:
from paddlenlp.embeddings import TokenEmbedding
from paddlenlp.data import JiebaTokenizer
# 1. 词向量模型加载
def test01():
# embedding_name 指定词向量模型,联网下载
# unknown_token_vector 对于 oov 词使用的默认表示向量
# trainable 是否继续训练
embedding_model = TokenEmbedding(embedding_name='w2v.baidu_encyclopedia.target.word-word.dim300',
trainable=False)
# Object type: TokenEmbedding(635965, 300, padding_idx=635964, sparse=False)
# Unknown index: 635963
# Unknown token: [UNK]
# Padding index: 635964
# Padding token: [PAD]
# Parameter containing: ... 省略
# print(embedding_model)
# 打印词表
print(embedding_model.vocab.token_to_idx)
# print(embedding_model.vocab.idx_to_token)
# 2. 获得输入词向量
def test02():
embedding_model = TokenEmbedding(embedding_name='w2v.baidu_encyclopedia.target.word-word.dim300',
unknown_token_vector=[6] * 300,
trainable=False)
# 71
print(embedding_model.get_idx_from_word('我'))
print(embedding_model.search('我'))
# 635963 [UNK]
print(embedding_model.get_idx_from_word('我票'))
# 使用 [6]*100 向量来表示 OOV 的向量
print(embedding_model.search('我票'))
# 3. 向量相似度计算
def test03():
embedding_model = TokenEmbedding(embedding_name='w2v.baidu_encyclopedia.target.word-word.dim300',
unknown_token_vector=[6] * 300,
trainable=False)
# 余弦相似度
similarity = embedding_model.cosine_sim('篮球', '足球')
# 0.7648844
print(similarity)
# 点积相似度
similarity = embedding_model.dot('篮球', '足球')
# 19.057632
print(similarity)
# 4. 根据词向量模型词表分词
def test04():
embedding_model = TokenEmbedding(embedding_name='w2v.baidu_encyclopedia.target.word-word.dim300',
unknown_token_vector=[6] * 300,
trainable=False)
# 初始化分词器
tokenizer = JiebaTokenizer(vocab=embedding_model.vocab)
inputs = '我爱北京故宫和天安门我票'
tokens = tokenizer.cut(inputs)
# ['我', '爱', '北京', '故宫', '和', '天安门', '我票']
print(tokens)
token_ids = tokenizer.encode(inputs)
# [71, 514, 296, 11719, 6, 19956, 635963]
# '我票' 使用 [UNK] 来编码
print(token_ids)
# (7, 300)
print(embedding_model.search(token_ids).shape)
if __name__ == '__main__':
test03()

冀公网安备13050302001966号