python - 就像 BERT Tokenizer 那样按单词拆分句子?
问题描述
我正在尝试在我的文本中本地化 BERT 标记器的所有 [UNK] 标记。一旦我有了 UNK 标记的位置,我需要确定它属于哪个词。为此,我尝试使用 words_ids() 或 token_to_words() 方法(我认为结果相同)来获取单词的位置,这给了我这个标记的 id 单词。
问题是,对于大文本,有很多方法可以按单词分割文本,而我尝试的方法与我从 token_to_words 方法获得的位置不匹配。如何以与 Bert tokenizer 相同的方式拆分文本?
我看到 BERT 使用 WordPiece 对子词进行标记,但对完整词没有任何作用。
我在这一点上:
tokenized_text = tokenizer.tokenize(texto) # Tokens
encoding_text = tokenizer(texto) # Esto es de tipo batchEncoding, como una instancia del tokenizer
tpos = [i for i, element in enumerate(tokenized_text) if element == "[UNK]"] # Posicion en la lista de tokens
word_list = texto.split(" ")
for x in tpos:
wpos = encoding_text.token_to_word(x) # Posicion en la lista de palabras
print("La palabra: ", word_list[wpos], " contiene un token desconocido: ", tokenizer.tokenize(word_list[wpos]))
但它失败了,因为索引“wpos”不适合我的 word_list。
解决方案
token_to_chars()
使用评论中提出的@cronoik 方法解决了该问题。它为我提供了任何标记(甚至是 UNK)的确切位置(它是通用的,不像我之前使用的取决于拆分方式的单词)。
推荐阅读
- python - Scipy 线性回归不包括`intercept_stderr` 属性
- oracle - 如何在一次查询中获取所有者的名称、他们的对象名称和该对象的大小?
- php - 在带有数组的 IN 语句之后,在 WHERE 语句中使用更多占位符
- javascript - 使用 localstorage 设置变量
- python - 在 Python 中忽略来自 Chromedriver 和 Selenium 的 UnexpectedAlertPresentException
- oracle - 在 oracle apex 中创建触发器时引发错误
- python - self 不应该添加多对多字段
- matlab - Matlab将矩阵元素复制到向量
- javascript - Vue JavaScript Mutiselect选项值不起作用
- regex - 正则表达式命令匹配组合,但不仅是大写字母