中文NLP的第二步:分词转词表ID,基于 PaddleHub 实现(学习心得) 您所在的位置:网站首页 犁田是一个词吗为什么 中文NLP的第二步:分词转词表ID,基于 PaddleHub 实现(学习心得)

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

2024-06-03 13:22| 来源: 网络整理| 查看: 265

上一步我们做了分词: 中文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 转化完成!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有