上节课我们用一个中文句子,给大家演示了 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://edu.ichenhua.cn/edu/note/513

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!