处理 HuggingFace 模型的令牌

数据挖掘 nlp 伯特 标记化 拥抱脸 巴特
2022-03-01 02:57:52

我有一些关于为不同的拥抱脸模型标记单词/字符/表情符号的问题。

据我了解,只有当输入句子的标记在模型的标记器训练的标记内时,模型才会在推理过程中表现最佳。

我的问题是:

  1. 有没有办法轻松找出特定单词/表情符号是否与模型兼容(包括在模型训练期间)?(在拥抱脸的情况下)

  2. 如果在模型训练期间没有包含这个词/表情符号,那么处理这些词/表情符号的最佳方法是什么,这样模型推断将在考虑将这些词/表情符号作为输入的情况下提供最佳输出。(对于 2. 如果可能的话,如果可以在下面我的拥抱脸设置的上下文中回答它会很好)

我目前的设置如下:

from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
pre_trained_model = 'facebook/bart-large-mnli'
task = 'zero-shot-classification'
candidate_labels = ['happy', 'sad', 'angry', 'confused']
tokenizer = AutoTokenizer.from_pretrained(pre_trained_model)
model = AutoModelForSequenceClassification.from_pretrained(pre_trained_model)
zero_shot_classifier = pipeline(model=model, tokenizer=tokenizer, task=task)

zero_shot_classifier('today is a good day 😃', candidate_labels=candidate_labels)

任何帮助表示赞赏😃

1个回答

对于您的第一个问题,您可以使用以下内容检查标记器是否涵盖某个字符串:

text = 'today is a good day 😃'
ids2string = lambda ids: tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(ids))
ids2string(tokenizer(text)['input_ids'])
> <s>today is a good day 😃</s>

如果 emoji 未包含在标记器创建中,则标记器将用未知的特殊标记替换它。您可以使用tokenizer.special_tokens_map['unk_token'].您可以删除或保留它们来访问它,这不会有太大的不同。

或者,如果您要进行微调,您可以使用tokenizer.add_special_tokens. 但是,在这种情况下,该令牌的嵌入将是随机的。你需要训练他们。