sid*_*491 10 bert-language-model huggingface-tokenizers sentencepiece
我想构建一个多类分类模型,将会话数据作为 BERT 模型的输入(使用 bert-base-uncased)。
提问:我想问一个问题。
答:当然可以,问吧。
询问:今天天气怎么样?
答:天气很好,阳光明媚。
问题:好的,很高兴知道。
回答:您还想了解其他信息吗?
除此之外,我还有两个输入。
我想知道是否应该在对话中添加特殊标记,以使其对 BERT 模型更有意义,例如:
[CLS]QUERY:我想问一个问题。[EOT]
答案:当然可以,问吧。[EOT]
查询:今天天气怎么样?[EOT]
答案:天气很好,阳光明媚。[EOT]
查询:好的,很高兴知道。[EOT]
解答:您还想了解其他信息吗?[九月]
但我无法添加新的 [EOT] 特殊令牌。
或者我应该为此使用 [SEP] 令牌?
编辑:重现步骤
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
print(tokenizer.all_special_tokens) # --> ['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']
print(tokenizer.all_special_ids) # --> [100, 102, 0, 101, 103]
num_added_toks = tokenizer.add_tokens(['[EOT]'])
model.resize_token_embeddings(len(tokenizer)) # --> Embedding(30523, 768)
tokenizer.convert_tokens_to_ids('[EOT]') # --> 30522
text_to_encode = '''QUERY: I want to ask a question. [EOT]
ANSWER: Sure, ask away. [EOT]
QUERY: How is the weather today? [EOT]
ANSWER: It is nice and sunny. [EOT]
QUERY: Okay, nice to know. [EOT]
ANSWER: Would you like to know anything else?'''
enc = tokenizer.encode_plus(
text_to_encode,
max_length=128,
add_special_tokens=True,
return_token_type_ids=False,
return_attention_mask=False,
)['input_ids']
print(tokenizer.convert_ids_to_tokens(enc))
Run Code Online (Sandbox Code Playgroud)
结果:
['[CLS]', '查询', ':', '我', '想要', '到', '询问', 'a', '问题', '.', '[', 'e' , '##ot', ']', '回答', ':', '确定', ',', '询问', '离开', '.', '[', 'e', '## ot', ']', '查询', ':', '如何', '是', '这个', '天气', '今天', '?', '[', 'e', '## ot', ']', '答案', ':', '它', '是', '很好', '和', '晴朗', '.', '[', 'e', '## ot', ']', '查询', ':', '好的', ',', '很好', '到', '知道', '.', '[', 'e', '## ot'、']'、'回答'、':'、'愿意'、'你'、'喜欢'、'要'、'知道'、'任何事情'、'其他'、'?'、'[SEP ]']
Ash*_*'Sa 13
由于令牌的目的[SEP]是充当两个句子之间的分隔符,因此它符合您使用[SEP]令牌来分隔 QUERY 和 ANSWER 序列的目标。
您还尝试添加不同的标记来标记 QUERY 或 ANSWER 的开始和结束,<BOQ>并<EOQ>标记 QUERY 的开始和结束。同样,<BOA>并<EOA>标记 ANSWER 的开始和结束。
有时,使用现有标记比向词汇表中添加新标记要好得多,因为它需要大量的训练迭代以及数据来学习新的标记嵌入。
但是,如果您想添加新令牌(如果您的应用程序需要),则可以按如下方式添加:
num_added_toks = tokenizer.add_tokens(['[EOT]'], special_tokens=True) ##This line is updated
model.resize_token_embeddings(len(tokenizer))
###The tokenizer has to be saved if it has to be reused
tokenizer.save_pretrained(<output_dir>)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19816 次 |
| 最近记录: |