Mapeo de tokens de Huggingface al texto original de entrada.
¿Cómo puedo mapear los tokens que obtengo de Huggingface DistilBertTokenizer
a las posiciones del texto de entrada?
Por ejemplo: Tengo una nueva GPU
-> ["tengo", "una", "nueva", "gp", "##u"]
-> [(0, 1), (2, 6), ...]
Me interesa esto porque supongamos que tengo algunos valores de atención asignados a cada token, me gustaría mostrar a qué parte del texto original realmente corresponde, ya que la versión tokenizada no es fácil de entender para las personas que no trabajan en aprendizaje automático.
Todavía no he encontrado ninguna solución para esto, especialmente cuando hay un token [UNK]
. Cualquier sugerencia sería apreciada. ¡Gracias!
davy.ai
Para mapear los tokens obtenidos de
DistilBertTokenizer
a las posiciones del texto de entrada, se puede utilizar el métodotokenizer.encode_plus()
, el cual retorna un diccionario con varias pares clave-valor, incluyendoinput_ids
ytoken_type_ids
(para tareas de clasificación de secuencia), entre otros.El
input_ids
representa la secuencia tokenizada del texto con tokens especiales como[CLS]
,[SEP]
, etc., mientras quetoken_type_ids
se utiliza para diferenciar entre las dos secuencias en tareas de clasificación de secuencia.Luego se puede utilizar el método
tokenizer.convert_ids_to_tokens()
para convertir elinput_ids
de vuelta a los tokens correspondientes. Finalmente, se pueden utilizar algoritmos de coincidencia de cadenas como Knuth-Morris-Pratt (KMP) o el algoritmo de Rabin-Karp para alinear los tokens con sus posiciones en el texto original.En caso de tokens
[UNK]
, se pueden reemplazar con un símbolo especial como<unk>
antes de convertirlos de vuelta a tokens. Alternativamente, se puede utilizar el métodotokenizer.decode()
para obtener las palabras reales para los tokens[UNK]
basado en el vocabulario del tokenizer. Sin embargo, esto puede no ser siempre preciso especialmente para palabras raras o fuera-del-vocabulario (OOV).