Comprensión de la puntuación de la asignación NLTK para bigrams y trigrams

Fondo:

Estoy tratando de comparar pares de palabras para ver qué par es “más probable que ocurra” en el inglés de EE. UU. Que en otro par. Mi plan es / era usar las instalaciones de colocación en NLTK para obtener pares de palabras, siendo el par de puntuación más alto el más probable.

Enfoque:

Codifiqué lo siguiente en Python usando NLTK (varios pasos e importaciones eliminados por brevedad):

bgm = nltk.collocations.BigramAssocMeasures() finder = BigramCollocationFinder.from_words(tokens) scored = finder.score_ngrams( bgm.likelihood_ratio ) print scored 

Resultados:

Luego examiné los resultados utilizando 2 pares de palabras, uno de los cuales debería ser muy probable que coexistiera, y un par que no debería (“anacardos tostados” y “anacardos de gasolina”). Me sorprendió ver estas puntuaciones de emparejamiento de manera idéntica:

 [(('roasted', 'cashews'), 5.545177444479562)] [(('gasoline', 'cashews'), 5.545177444479562)] 

Hubiera esperado que los anacardos tostados obtuvieran una puntuación más alta que los anacardos de gasolina en mi prueba.

Preguntas:

  1. ¿Estoy malinterpretando el uso de colocaciones?
  2. ¿Mi código es incorrecto?
  3. ¿Mi suposición de que los puntajes deberían ser diferentes es incorrecto y, de ser así, por qué?

Muchas gracias por cualquier información o ayuda!

El documento de colocaciones NLTK me parece bastante bueno. http://www.nltk.org/howto/collocations.html

Necesitas darle al anotador algún corpus de tamaño real para trabajar. Aquí hay un ejemplo de trabajo usando el corpus marrón integrado en NLTK. Se tarda unos 30 segundos en ejecutarse.

 import nltk.collocations import nltk.corpus import collections bgm = nltk.collocations.BigramAssocMeasures() finder = nltk.collocations.BigramCollocationFinder.from_words( nltk.corpus.brown.words()) scored = finder.score_ngrams( bgm.likelihood_ratio ) # Group bigrams by first word in bigram. prefix_keys = collections.defaultdict(list) for key, scores in scored: prefix_keys[key[0]].append((key[1], scores)) # Sort keyed bigrams by strongest association. for key in prefix_keys: prefix_keys[key].sort(key = lambda x: -x[1]) print 'doctor', prefix_keys['doctor'][:5] print 'baseball', prefix_keys['baseball'][:5] print 'happy', prefix_keys['happy'][:5] 

La salida parece razonable, funciona bien para el béisbol, menos para el médico y feliz.

 doctor [('bills', 35.061321987405748), (',', 22.963930079491501), ('annoys', 19.009636692022365), ('had', 16.730384189212423), ('retorted', 15.190847940499127)] baseball [('game', 32.110754519752291), ('cap', 27.81891372457088), ('park', 23.509042621473505), ('games', 23.105033513054011), ("player's", 16.227872863424668)] happy [("''", 20.296341424483998), ('Spahn', 13.915820697905589), ('family', 13.734352182441569), (',', 13.55077617193821), ('bodybuilder', 13.513265447290536)