首页 > 解决方案 > 就像 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。

标签: pythonnlptokenizebert-language-modelhuggingface-transformers

解决方案


token_to_chars()使用评论中提出的@cronoik 方法解决了该问题。它为我提供了任何标记(甚至是 UNK)的确切位置(它是通用的,不像我之前使用的取决于拆分方式的单词)。


推荐阅读