2012-02-05 14 views
5

Estoy tratando de encontrar colocaciones con NLTK en un texto usando el método incorporado.Python nltk: Encuentre colocaciones sin palabras separadas por puntos

Ahora estoy teniendo el siguiente texto de ejemplo (prueba y foo siguen unos a otros, pero no existe una frontera frase en el medio):

content_part = """test. foo 0 test. foo 1 test. 
       foo 2 test. foo 3 test. foo 4 test. foo 5""" 

resultado de tokenización y collocations() es el siguiente:

print nltk.word_tokenize(content_part) 
# ['test.', 'foo', 'my', 'test.', 'foo', '1', 'test.', 
# 'foo', '2', 'test.', 'foo', '3', 'test.', 'foo', '4', 'test.', 'foo', '5'] 

print nltk.Text(nltk.word_tokenize(content_part)).collocations() 
# test. foo 

Cómo se puede Evito NLTK de:

  1. Incluyendo el punto en mi tokenización
  2. no encuentran colocaciones() sobre las fronteras de oraciones?

Por lo tanto, en este ejemplo no debería imprimir ninguna colocación, pero supongo que puede imaginar textos más complicados donde también hay colocaciones dentro de las oraciones.

puedo adivinar que tengo que usar el Punkt frase segmentación de, pero luego no sé cómo ponerlos juntos de nuevo para encontrar colocaciones con NLTK (collocation() parece ser más poderosa que la materia apenas contando a mí mismo).

Respuesta

8

Puede usar WordPunctTokenizer para separar la puntuación de las palabras y luego filtrar los bigrams con signos de puntuación con apply_word_filter().

Lo mismo se puede utilizar para los trigramas para no encontrar colocaciones sobre los bordes de las oraciones.

from nltk import bigrams 
from nltk import collocations 
from nltk import FreqDist 
from nltk.collocations import * 
from nltk import WordPunctTokenizer 

content_part = """test. foo 0 test. foo 1 test. 
       foo 2 test. foo 3 test. foo 4 test, foo 4 test.""" 

tokens = WordPunctTokenizer().tokenize(content_part) 

bigram_measures = collocations.BigramAssocMeasures() 
word_fd = FreqDist(tokens) 
bigram_fd = FreqDist(bigrams(tokens)) 
finder = BigramCollocationFinder(word_fd, bigram_fd) 

finder.apply_word_filter(lambda w: w in ('.', ',')) 

scored = finder.score_ngrams(bigram_measures.raw_freq) 

print tokens 
print sorted(finder.nbest(bigram_measures.raw_freq,2),reverse=True) 

Salida:

['test', '.', 'foo', '0', 'test', '.', 'foo', '1', 'test', '.', 'foo', '2', 'test', '.', 'foo', '3', 'test', '.', 'foo', '4', 'test', ',', 'foo', '4', 'test', '.'] 
[('4', 'test'), ('foo', '4')] 
Cuestiones relacionadas