¿Cómo uso el tokenizer predeterminado de NLTK para obtener tramos en lugar de cadenas?

El tokenizer predeterminado de NLTK, nltk.word_tokenizer, encadena dos tokenizadores, un tokenizador de oraciones y luego un tokenizador de palabras que funciona con oraciones. Hace un buen trabajo fuera de la caja.

>>> nltk.word_tokenize("(Dr. Edwards is my friend.)") ['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')'] 

Me gustaría usar este mismo algoritmo, excepto para que devuelva tuplas de compensaciones a la cadena original en lugar de tokens de cadena.

Por desplazamiento me refiero a 2-ples que pueden servir como índices en la cadena original. Por ejemplo aquí tendría

 >>> s = "(Dr. Edwards is my friend.)" >>> s.token_spans() [(0,1), (1,4), (5,12), (13,15), (16,18), (19,25), (25,26), (26,27)] 

porque s [0: 1] es “(“, s [1: 4] es “Dr.” y así sucesivamente.

¿Hay una sola llamada NLTK que haga esto, o tengo que escribir mi propia aritmética de desplazamiento?

Sí, la mayoría de los Tokenizers en nltk tienen un método llamado span_tokenize pero desafortunadamente el Tokenizer que está usando no lo tiene.

De forma predeterminada, la función word_tokenize usa un TreebankWordTokenizer . La implementación de TreebankWordTokenizer tiene una implementación bastante robusta pero actualmente carece de una implementación para un método importante, span_tokenize .

No veo ninguna implementación de span_tokenize para un span_tokenize por lo que creo que necesitarás implementar el tuyo. Subclasificar TokenizerI puede hacer este proceso un poco menos complejo.

Es posible que el método span_tokenize de PunktWordTokenizer útil como punto de partida .

Espero que esta información ayude.