2015-02-23 9 views
12

Il tokenizer predefinito di NLTK, nltk.word_tokenizer, concatena due tokenizer, un tokenizer di frase e quindi un tokenizzatore di parole che opera sulle frasi. Fa un buon lavoro fuori dalla scatola.Come utilizzare il tokenizer predefinito di NLTK per ottenere span invece di stringhe?

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

Mi piacerebbe usare questo stesso algoritmo, tranne per averlo tornare tuple di compensazioni nella stringa originale invece di gettoni di stringa.

Per offset, intendo 2-ples che possono servire come indici nella stringa originale. Per esempio qui avrei

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

perché s [0: 1] è "(", s [1: 4] è "Dr." e così via

C'è una sola NLTK. chiamare che fa questo, o devo scrivere il mio compensare l'aritmetica?

+0

Cosa intendi per "offset". Forse l'indice delle stringhe sulla lista? cioè: "Dr." è indice 1 .. – felipsmartins

+0

Modificato per chiarire cosa intendo per offset. –

risposta

7

Sì, la maggior parte delle tokenizers in NLTK hanno un metodo chiamato span_tokenize ma purtroppo l'Tokenizer che si sta utilizzando non lo fa.

di default il word_tokenize funzione uses a TreebankWordTokenizer. L'impianto TreebankWordTokenizer ementation ha un robusto implementation ma attualmente manca un'implementazione per un metodo importante, span_tokenize.

Non vedo alcuna implementazione di span_tokenize per un TreebankWordTokenizer quindi credo che sarà necessario implementare il proprio. La sottoclasse TokenizerI può rendere questo processo un po 'meno complesso.

È possibile trovare il metodo di PunktWordTokenizer come starting point.

Spero che questa informazione aiuti.

+1

Ho montato una versione di tre secondi di una: https://gist.github.com/ckoppelman/c93e4192d9f189fba590e095258f8f33. Qualsiasi aiuto o consiglio è apprezzato – Charles

Problemi correlati