【问题标题】:BART Tokenizer tokenises same word differently?BART Tokenizer 对同一个词进行不同的标记?
【发布时间】:2022-08-23 21:50:17
【问题描述】:

我注意到,如果我对包含许多句子的全文进行标记,有时会得到不同数量的标记,而不是单独标记每个句子并将标记加起来。我已经做了一些调试,并有这个可重现的小例子来说明问题

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(\'facebook/bart-large-cnn\')

print(tokenizer.tokenize(\"Thames is a river\"))
print(tokenizer.tokenize(\"We are in London. Thames is a river\"))

我得到以下输出

[\'Th\', \'ames\', \'Ġis\', \'Ġa\', \'Ġriver\']
[\'We\', \'Ġare\', \'Ġin\', \'ĠLondon\', \'.\', \'ĠThames\', \'Ġis\', \'Ġa\', \'Ġriver\']

我想了解为什么 Thames 这个词在序列的开头被分成两个标记,而如果它不在序列的开头,它就是一个单词。我注意到这种行为非常频繁,假设它不是错误,我想了解为什么 BART 标记器会这样。

非常感谢

    标签: nlp huggingface-transformers bert-language-model huggingface-tokenizers bart


    【解决方案1】:

    根据https://github.com/huggingface/transformers/blob/main/src/transformers/models/bart/tokenization_bart.py

    这个分词器已经过训练,可以将空格视为分词的一部分(有点像句子),因此无论是否在句子的开头(没有空格),单词都会被不同地编码。您可以通过在实例化此标记器或在某些文本上调用它时传递 add_prefix_space=True 来绕过该行为,但由于模型没有以这种方式进行预训练,因此可能会导致性能下降。

    from transformers import AutoTokenizer
    tokenizer = AutoTokenizer.from_pretrained('facebook/bart-large-cnn', add_prefix_space=True)
    
    print(tokenizer.tokenize("Thames is a river"))
    print(tokenizer.tokenize("We are in London. Thames is a river"))
    

    对我产生“正确”的结果。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2021-11-28
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多