PaddleNLP Embedding

PaddleNLP 提供多个开源的预训练词向量模型,使用非常便捷。接下来结合官方给出的详细文档总结下主要的内容。

https://paddlenlp.readthedocs.io/zh/latest/model_zoo/embeddings.html#id8

  1. 词向量模型介绍
  2. 词向量模型使用

1. 词向量模型介绍

我们加载的词向量模型的命名规则如下:

训练模型.语料.词向量类型.上下文类型.向量维度

词向量模型主要分为三类:

  1. Word2Vec – w2v
  2. skip-gramGloVe – glove
  3. FastText – fasttext

语料主要有:

  1. baidu Encyclopedia 百度百科 – baidu_encyclopedia
  2. Wikipedia_zh 中文维基百科 – wiki
  3. People’s Daily News 人民日报 – people_daily
  4. Sogou News 搜狗新闻 – sogou
  5. Financial News 金融新闻 – financial
  6. Zhihu_QA 知乎问答 – zhihu
  7. Weibo 微博 – weibo
  8. Literature 文学作品 – literature
  9. Complete Library in Four Sections 四库全书 – sikuquanshu
  10. Mixed-large 综合 – mixed-large

词向量类型主要有:

  1. target
  2. 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.dim300678.21 MB635965
w2v.baidu_encyclopedia.target.word-character.char1-1.dim300679.15 MB636038
w2v.baidu_encyclopedia.target.word-character.char1-2.dim300679.30 MB636038
w2v.baidu_encyclopedia.target.word-character.char1-4.dim300679.51 MB636038
w2v.baidu_encyclopedia.target.word-ngram.1-2.dim300679.48 MB635977
w2v.baidu_encyclopedia.target.word-ngram.1-3.dim300671.27 MB628669
w2v.baidu_encyclopedia.target.word-ngram.2-2.dim3007.28 GB6969069
w2v.baidu_encyclopedia.target.word-wordLR.dim300678.22 MB635958
w2v.baidu_encyclopedia.target.word-wordPosition.dim300679.32 MB636038
w2v.baidu_encyclopedia.target.bigram-char.dim300679.29 MB635976
w2v.baidu_encyclopedia.context.word-word.dim300677.74 MB635952
w2v.baidu_encyclopedia.context.word-character.char1-1.dim300678.65 MB636200
w2v.baidu_encyclopedia.context.word-character.char1-2.dim300844.23 MB792631
w2v.baidu_encyclopedia.context.word-character.char1-4.dim3001.16 GB1117461
w2v.baidu_encyclopedia.context.word-ngram.1-2.dim3007.25 GB6967598
w2v.baidu_encyclopedia.context.word-ngram.1-3.dim3005.21 GB5000001
w2v.baidu_encyclopedia.context.word-ngram.2-2.dim3007.26 GB6968998
w2v.baidu_encyclopedia.context.word-wordLR.dim3001.32 GB1271031
w2v.baidu_encyclopedia.context.word-wordPosition.dim3006.47 GB6293920
w2v.wiki.target.bigram-char.dim300375.98 MB352274
w2v.wiki.target.word-char.dim300375.52 MB352223
w2v.wiki.target.word-word.dim300374.95 MB352219
w2v.wiki.target.word-bigram.dim300375.72 MB352219
w2v.people_daily.target.bigram-char.dim300379.96 MB356055
w2v.people_daily.target.word-char.dim300379.45 MB355998
w2v.people_daily.target.word-word.dim300378.93 MB355989
w2v.people_daily.target.word-bigram.dim300379.68 MB355991
w2v.weibo.target.bigram-char.dim300208.24 MB195199
w2v.weibo.target.word-char.dim300208.03 MB195204
w2v.weibo.target.word-word.dim300207.94 MB195204
w2v.weibo.target.word-bigram.dim300208.19 MB195204
w2v.sogou.target.bigram-char.dim300389.81 MB365112
w2v.sogou.target.word-char.dim300389.89 MB365078
w2v.sogou.target.word-word.dim300388.66 MB364992
w2v.sogou.target.word-bigram.dim300388.66 MB364994
w2v.zhihu.target.bigram-char.dim300277.35 MB259755
w2v.zhihu.target.word-char.dim300277.40 MB259940
w2v.zhihu.target.word-word.dim300276.98 MB259871
w2v.zhihu.target.word-bigram.dim300277.53 MB259885
w2v.financial.target.bigram-char.dim300499.52 MB467163
w2v.financial.target.word-char.dim300499.17 MB467343
w2v.financial.target.word-word.dim300498.94 MB467324
w2v.financial.target.word-bigram.dim300499.54 MB467331
w2v.literature.target.bigram-char.dim300200.69 MB187975
w2v.literature.target.word-char.dim300200.44 MB187980
w2v.literature.target.word-word.dim300200.28 MB187961
w2v.literature.target.word-bigram.dim300200.59 MB187962
w2v.sikuquanshu.target.word-word.dim30020.70 MB19529
w2v.sikuquanshu.target.word-bigram.dim30020.77 MB19529
w2v.mixed-large.target.word-char.dim3001.35 GB1292552
w2v.mixed-large.target.word-word.dim3001.35 GB1292483
w2v.google_news.target.word-word.dim300.en1.61 GB3000000
glove.wiki2014-gigaword.target.word-word.dim50.en73.45 MB400002
glove.wiki2014-gigaword.target.word-word.dim100.en143.30 MB400002
glove.wiki2014-gigaword.target.word-word.dim200.en282.97 MB400002
glove.wiki2014-gigaword.target.word-word.dim300.en422.83 MB400002
glove.twitter.target.word-word.dim25.en116.92 MB1193516
glove.twitter.target.word-word.dim50.en221.64 MB1193516
glove.twitter.target.word-word.dim100.en431.08 MB1193516
glove.twitter.target.word-word.dim200.en848.56 MB1193516
fasttext.wiki-news.target.word-word.dim300.en541.63 MB999996
fasttext.crawl.target.word-word.dim300.en1.19 GB2000002

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()
未经允许不得转载:一亩三分地 » PaddleNLP Embedding
评论 (0)

3 + 2 =