如何知道 HuggingFace BertTokenizer 中哪些单词是用未知标记编码的?

问题描述 投票:0回答:1

我使用以下代码来计算有多少%的单词被编码为未知标记。

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

huggingface-transformers huggingface-tokenizers
1个回答
0
投票

当您使用 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
© www.soinside.com 2019 - 2024. All rights reserved.