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

上一步我们做了分词:
中文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]))

运行结果:

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]

OK,词语的 ID 转化完成!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值