HuggingFace不同预训练Tokenizer中文句子分词差异及问题咨询
关于HuggingFace中文Tokenizer的两个疑问
测试代码与结果
我正在测试HuggingFace中多款预训练模型的Tokenizer对中文句子的处理功能,测试代码如下:
from transformers import BartTokenizer, BertTokenizer text_eng = 'I go to school by train.' text_can = '我乘搭火車上學。' text_chi = '我搭火車返學。' tokenizer_bartchinese = BertTokenizer.from_pretrained('fnlp/bart-base-chinese') tokenizer_bertchinese = BertTokenizer.from_pretrained('bert-base-chinese') tokenizer_fb = BartTokenizer.from_pretrained('facebook/bart-large') # BART Chinese print(tokenizer_bartchinese.tokenize(text_eng)) print(tokenizer_bartchinese.tokenize(text_can)) print(tokenizer_bartchinese.tokenize(text_chi)) # BERT Chinese print(tokenizer_bertchinese.tokenize(text_eng)) print(tokenizer_bertchinese.tokenize(text_can)) print(tokenizer_bertchinese.tokenize(text_chi)) # BART Large print(tokenizer_fb.tokenize(text_eng)) print(tokenizer_fb.tokenize(text_can)) print(tokenizer_fb.tokenize(text_chi))
运行后得到的分词结果:
['I', 'go', 'to', 'school', 'by', 'train', '.'] ['我', '乘', '搭', '火', '車', '上', '學', '。'] ['我', '搭', '火', '車', '返', '學', '。'] ['[UNK]', 'go', 'to', 'school', 'by', 't', '##rain', '.'] ['我', '乘', '搭', '火', '車', '上', '學', '。'] ['我', '搭', '火', '車', '返', '學', '。'] ['I', 'Ġgo', 'Ġto', 'Ġschool', 'Ġby', 'Ġtrain', '.'] ['æĪ', 'ij', 'ä¹', 'ĺ', 'æ', 'IJ', 'Ń', 'ç', 'ģ«', 'è»', 'Ĭ', 'ä¸Ĭ', 'åŃ', '¸', 'ãĢĤ'] ['æĪ', 'ij', 'æ', 'IJ', 'Ń', 'ç', 'ģ«', 'è»', 'Ĭ', 'è¿', 'Ķ', 'åŃ', '¸', 'ãĢĤ']
疑问解答
1. Tokenizer是否应识别中文词汇(如“火車”),按词汇而非单字符分词?
你使用的bert-base-chinese和fnlp/bart-base-chinese这类中文预训练模型的Tokenizer,本身就是基于单字符分词设计的。这类模型在预训练阶段采用字级切分策略,原因是中文词汇边界没有明确标准,字级切分通用性更强,还能避免未登录词的问题。
如果需要词级别的分词结果,得用专门针对中文词训练的Tokenizer,或者先通过jieba等工具做中文分词后再处理,但这种方式可能和预训练模型的输入格式不兼容,需要额外适配。你预期的['我', '乘搭', '火車', '上', '學', '。']属于词级分词,这类基础中文BERT/BART模型不会输出这类结果。
2. facebook/bart-large生成乱码字符是否属于正常现象?
这是正常现象。facebook/bart-large是纯英文预训练的模型,它的Tokenizer只针对英文文本优化,没有包含中文的字符编码和词表。中文文本对它来说是完全陌生的字符,编码时会被错误解析,最终输出乱码。处理中文必须使用专门的中文预训练BART模型,比如你用到的fnlp/bart-base-chinese。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

