2015-07-28 15 views
5

Sto creazione di token di un testo utilizzando nltk.word_tokenize e mi piacerebbe ottenere anche l'indice nel testo grezzo originale per il primo carattere di ogni modo, vale a direottenere indici di testo originale da NLTK word_tokenize

import nltk 
x = 'hello world' 
tokens = nltk.word_tokenize(x) 
>>> ['hello', 'world'] 

Come posso ottenere anche l'array [0, 7] corrispondente agli indici raw dei token?

risposta

8

Penso che stiate cercando il metodo span_tokenize(). Apparently questo non è supportato dal tokenizer predefinito. Ecco un esempio di codice con un altro tokenizer.

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) 

Che dà:

[(0, 4), (5, 12), (13, 17), (18, 23), (24, 26), (27, 30), (31, 36)] 

solo ottenere gli offset:

offsets = [span[0] for span in spans] 
[0, 5, 13, 18, 24, 27, 31] 

Per ulteriori informazioni (sui diversi tokenizers disponibili) vedere l'API tokenize docs

+0

ho aggiunto uno span_tokenizer alla TreebankWordTokenizer qui: https://gist.github.com/ckoppelman/c93e4192d9f189fba590e095258f8f33. Qualsiasi aiuto o consiglio è apprezzato. – Charles

9

Puoi fare anche questo:

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]] 

E ottenere:

('And', 0, 3) 
('now', 4, 7) 
('for', 8, 11) 
('something', 12, 21) 
('completely', 22, 32) 
('different', 33, 42) 
('.', 42, 43) 
Problemi correlati