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()