上节课我们用一个中文句子,给大家演示了 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.chenhuax.com/read/435