当前位置:   article > 正文

中文NLP的第二步:分词转词表ID,基于 PaddleHub 实现(学习心得)_paddlehub lac中文分词原理

paddlehub lac中文分词原理

上一步我们做了分词:
中文NLP的第一步:分词,基于 PaddleHub 实现,绝对小白友好(学习心得)

第二步是把分词结果,对照词表转化成 ID

词表是什么呢?

首先我们要知道,中文字符是没办法直接计算的,更不要说进一步的操作了,所以我们需要的是词嵌入,获得 word embedding,详见:
为什么NLP中需要词嵌入 word embeddings(学习心得)

而词语要转化为 word embedding 之前,先要根据词表转化为对应的序号 ID,这样转化程序才知道你转化的是哪个词

所以这里面是 2 重对应关系:

对应到
对应到
词语
词语的ID
词语的向量表示

这里我们直接使用 PaddleHub 提供的 word2vec_skipgram 模型

Word2vec 是常用的词嵌入(word embedding)模型。该PaddleHub Module基于Skip-gram模型,在海量百度搜索数据集下预训练得到中文单词预训练词嵌入。其支持Fine-tune。Word2vec的预训练数据集的词汇表大小为1700249,word embedding维度为128。

模型介绍:
word2vec_skipgram

模型论文:
Efficient Estimation of Word Representations in
Vector Space

程序实现:

import paddlehub as hub
from paddlehub.reader.tokenization import load_vocab

raw_data = [
    ["你觉得明天是个晴天吗","我看还是下雨的可能性大"],
    ["中国哪家公司的人工智能最牛呢"],
    ["我在山上看见爱因斯坦"],
    ["我把车把一把把住了"]
]

lac = hub.Module(name="lac")

tokens = []
for texts in raw_data:
    results = lac.lexical_analysis(texts=texts, use_gpu=False, batch_size=1)
    for result in results: # 取得结果列表中的一个元素
        print(result)
        tokens.append(result['word'])

# 这是把 中文词语 转化为 词表 中对应 ID 的函数
def convert_tokens_to_ids(vocab, tokens): # 输入为词表,和要转化的 text
    wids = [] # 初始化一个空的集合,用于存放输出
    #tokens = text.split(" ") # 将传入的 text 用 空格 做分割,变成 词语字符串 的列表
    for token in tokens: # 每次从列表里取出一个 词语
        wid = vocab.get(token, None)
        if not wid:
            wid = vocab["unknown"]
        wids.append(wid)
    return wids

module = hub.Module(name="word2vec_skipgram") # 实例化 word2vec_skipgram 模型

vocab = load_vocab(module.get_vocab_path()) # 获得 词表 字典

# 我们要获取词表,直接利用 paddlehub.reader.tokenization 中的 load_vocab 函数即可
# load_vocab 函数的输入是具体的词表文件,这里我们用 word2vec_skipgram 附带的词表
# 模块的实例化对象 module 下,用 get_vocab_path() 方法
# 该方法可以在指定的 Module 中(这里就是word2vec_skipgram)查找 assets 文件夹下面有没有 vocab.txt 文件
# 如果找到,则返回该文件的 具体文件路径
# load_vocab 函数的返回值是一个 字典,里面 key 为 词语,value 是词语对应的 ID

tokens_ids = []
for item in tokens:
    item_ids = convert_tokens_to_ids(vocab, item) # 获得组成句子的 词语 的 ID 列表
    tokens_ids.append(item_ids)

for i in range(len(tokens)):
    print("token: %s; id: %s" % (tokens[i], tokens_ids[i]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

运行结果:

token: ['你', '觉得', '明天', '是', '个', '晴天', '吗']; id: [42, 1405, 3867, 10, 132, 15549, 19]
token: ['我', '看', '还是', '下雨', '的', '可能性', '大']; id: [28, 104, 155, 9785, 4, 15268, 76]
token: ['中国', '哪家', '公司', '的', '人工智能', '最', '牛', '呢']; id: [38, 586, 99, 4, 3258, 115, 1721, 286]
token: ['我', '在', '山上', '看见', '爱因斯坦']; id: [28, 21, 19869, 4500, 18837]
token: ['我', '把', '车', '把', '一把把', '住', '了']; id: [28, 166, 244, 166, 400305, 1827, 17]
  • 1
  • 2
  • 3
  • 4
  • 5

OK,词语的 ID 转化完成!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/366257
推荐阅读
相关标签
  

闽ICP备14008679号