HuggingFace系列 P3 BertTokenizer分词不可逆问题
上节课我们用一个中文句子,给大家演示了 Bert 预训练模型的基本用法。但有些场景下,文本内容可能是中英文混杂的。但目前还没有支持多语言的预训练模型,直接用中文模型进行编码,英文部分会变成[UNK]标记,进而导致BertTokenizer分词不可逆问题。
下面介绍一个 offset_mapping 的方法,从原始文本中找对应关系,来解决这个问题。同时,这个方案在接下来的「CasRel关系抽取项目」里就会用到。所以,提前把这一块,从项目里面剥离出来,用一个简单的例子,帮助大家更轻松的理解这个知识点。
代码示例
1、编码不可逆
from transformers import BertTokenizer text = '张国荣Forever专辑' tokenizer = BertTokenizer.from_pretrained('./huggingface/bert-base-chinese') print(tokenizer.tokenize(text)) tokened = tokenizer(text) input_ids = tokened['input_ids'] print(input_ids) # subject 实体 sub_pos = [1, 3] # 张国荣 sub_ids = [id for k,id in enumerate(input_ids) if k>=sub_pos[0] and k<=sub_pos[1]] print(sub_ids) sub_text = tokenizer.decode(sub_ids).replace(' ', '') print(sub_text) # object 实体 obj_pos = [4, 4] # Forever obj_ids = [id for k,id in enumerate(input_ids) if k>=obj_pos[0] and k<=obj_pos[1]] print(obj_ids) obj_text = tokenizer.decode(obj_ids).replace(' ', '') print(obj_text)
2、从原始文本中找实体
from transformers import BertTokenizerFast tokenizer = BertTokenizerFast.from_pretrained('./huggingface/bert-base-chinese') text = '张国荣Forever专辑' tokened = tokenizer(text, return_offsets_mapping=True) print(tokened) offset_mapping = tokened['offset_mapping'] head, tail = offset_mapping[4] print(text[head:tail])
在开篇就交代过,这个课程是为项目做铺垫的,不是单纯的介绍 HuggingFace 的基础课程,所以到这里,先告一段落,其他项目里面需要用到预训练模型,会再回来做相应的补充。
本文链接:http://www.ichenhua.cn/edu/note/513
版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!