bert相关问题总结

1 tokenizer

bert使用的时候可使用的tokenizer,主要是两种使用方法

  • new_seq = tokenizer.tokenize(seq) # 分词 seq 必须为字符串
    input_ids = tokenizer.convert_tokens_to_ids(new_seq) # 转换为ID
  • input_ids = tokenizer.encode(seq, add_special_tokens=True) # 直接转换为ID seq可以是字符串也可以是字符串列表,但是输入字符串列表和直接输入字符串得到的input_ids不一定完全相同。当出现错误拼写的词的时候尤其如此

其中由于最近编写代码的原因,主要对于第一种方法,即使用两步得到ID的方法的一些问题进行总结
new_seq = tokenizer.tokenize(seq) seq必须为字符串,tokenizer.tokenize()作用是将seq 进行分词,当出现词表中没有的词的时候有特殊的处理方法,
例如:“I liek apple” 分词结果[‘I’, ‘lie’, ‘##k’, ‘apple’]
通过new_seq = tokenizer.tokenize(seq) 我们可以得到分词后的句子,然后通过tokenizer.encode(seq, add_special_tokens=True) 将分词后的句子转化为bert模型可接受的ID序列

这时候我突然想到了一个问题,如果分词后的句子我们更改了,那么tokenizer.encode(seq, add_special_tokens=True)还能正常运行吗?

经过尝试后发现是可正常运行的 ,例如随便输入
tokenizer.convert_tokens_to_ids([‘##oe’]) —>[7745]
tokenizer.convert_tokens_to_ids([‘##e’])------>[1162]
发现如果输入的是##*,都是可以正常识别的,bert词表中应该是类似的表述,但是如果输入
tokenizer.convert_tokens_to_ids([‘#oo’])------->[100]
tokenizer.convert_tokens_to_ids([‘#o#o’])------->[100]
会统一输出100,即UNK

你可能感兴趣的:(pytorch,python,bert,人工智能,深度学习)