我使用以下代码来计算有多少%的单词被编码为未知标记。
paragraph_chinese = '...' # It is a long paragraph from a text file.
from transformers import AutoTokenizer, BertTokenizer
tokenizer_bart = BertTokenizer.from_pretrained("fnlp/bart-base-chinese")
encoded_chinese_bart = tokenizer_bart.encode(paragraph_chinese)
unk_token_id_bart = tokenizer_bart.convert_tokens_to_ids(["[UNK]"])
len_paragraph_chinese = len(paragraph_chinese)
unk_token_cnt_chinese_bart = encoded_chinese_bart.count(unk_token_id_bart[0])
print("BART Unknown Token count in Chinese Paragraph:", unk_token_cnt_chinese_bart, "(" + str(unk_token_cnt_chinese_bart * 100 / len_paragraph_chinese) + "%)")
print(type(tokenizer_bart))
打印:
BART Unknown Token count in Chinese Paragraph: 1 (0.015938795027095953%)
<class 'transformers.models.bert.tokenization_bert.BertTokenizer'>
我的问题是:我注意到有一个未知的令牌。我怎样才能知道哪个单词导致了这个未知的标记?
附注我尝试了
print(encoded_chinese_bart)
,但它是一个令牌ID列表。
使用
transformers 4.28.1
当您使用 BertTokenizerFast 而不是“慢速”版本时,您将获得一个 BatchEncoding 对象,该对象使您可以访问几种方便的方法,这些方法允许您将令牌映射回原始字符串。
以下代码使用了 token_to_chars 方法:
from transformers import BertTokenizerFast
# just an example
paragraph_chinese = '马云 Kočka 祖籍浙江省嵊县 现嵊州市'
tokenizer_bart = BertTokenizerFast.from_pretrained("fnlp/bart-base-chinese")
encoded_chinese_bart = tokenizer_bart(paragraph_chinese)
unk_token_id_bart = tokenizer_bart.unk_token_id
len_paragraph_chinese = len(paragraph_chinese)
unk_token_cnt_chinese_bart = encoded_chinese_bart.input_ids.count(unk_token_id_bart)
print(f'BART Unknown Token count in Chinese Paragraph: {unk_token_cnt_chinese_bart} ({unk_token_cnt_chinese_bart * 100 / len_paragraph_chinese}%)')
print(encoded_chinese_bart.input_ids.index(unk_token_id_bart))
print(encoded_chinese_bart.token_to_chars(3))
print(paragraph_chinese[3:8])
原文:
3
CharSpan(start=3, end=8)
Kočka