Estoy tokenizing un texto usando nltk.word_tokenize y me gustaría también obtener el índice en el texto original sin procesar al primer carácter de cada token, es decir
import nltk x = 'hello world' tokens = nltk.word_tokenize(x) >>> ['hello', 'world']
¿Cómo puedo obtener la matriz [0, 7]
correspondiente a los índices en bruto de los tokens?
Creo que lo que estás buscando es el método span_tokenize()
. Al parecer, esto no es compatible con el tokenizador predeterminado. Aquí hay un ejemplo de código con otro tokenizador.
from nltk.tokenize import WhitespaceTokenizer s = "Good muffins cost $3.88\nin New York." span_generator = WhitespaceTokenizer().span_tokenize(s) spans = [span for span in span_generator] print(spans)
Lo que da:
[(0, 4), (5, 12), (13, 17), (18, 23), (24, 26), (27, 30), (31, 36)]
acaba de obtener las compensaciones:
offsets = [span[0] for span in spans] [0, 5, 13, 18, 24, 27, 31]
Para obtener más información (sobre los distintos tokenizadores disponibles), consulte la tokenize api docs
También puedes hacer esto:
def spans(txt): tokens=nltk.word_tokenize(txt) offset = 0 for token in tokens: offset = txt.find(token, offset) yield token, offset, offset+len(token) offset += len(token) s = "And now for something completely different and." for token in spans(s): print token assert token[0]==s[token[1]:token[2]]
Y obten:
('And', 0, 3) ('now', 4, 7) ('for', 8, 11) ('something', 12, 21) ('completely', 22, 32) ('different', 33, 42) ('.', 42, 43)