Collocations NLTK pour des mots spécifiques

je sais comment obtenir des collocations bigram et trigram en utilisant NLTK et je les applique à mes propres corps. Le code est ci-dessous.

Je ne suis pas sûr cependant sur (1) Comment obtenir les collocations pour un mot particulier? (2) est-ce que NLTK a une mesure de collocation basée sur le rapport Log-vraisemblance?

import nltk
from nltk.collocations import *
from nltk.tokenize import word_tokenize

text = "this is a foo bar bar black sheep  foo bar bar black sheep foo bar bar black  sheep shep bar bar black sentence"

trigram_measures = nltk.collocations.TrigramAssocMeasures()
finder = TrigramCollocationFinder.from_words(word_tokenize(text))

for i in finder.score_ngrams(trigram_measures.pmi):
    print i
10
demandé sur Sabba 2014-01-16 19:18:35

3 réponses

Essayez ce code:

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()
trigram_measures = nltk.collocations.TrigramAssocMeasures()

# Ngrams with 'creature' as a member
creature_filter = lambda *w: 'creature' not in w


## Bigrams
finder = BigramCollocationFinder.from_words(
   nltk.corpus.genesis.words('english-web.txt'))
# only bigrams that appear 3+ times
finder.apply_freq_filter(3)
# only bigrams that contain 'creature'
finder.apply_ngram_filter(creature_filter)
# return the 10 n-grams with the highest PMI
print finder.nbest(bigram_measures.likelihood_ratio, 10)


## Trigrams
finder = TrigramCollocationFinder.from_words(
   nltk.corpus.genesis.words('english-web.txt'))
# only trigrams that appear 3+ times
finder.apply_freq_filter(3)
# only trigrams that contain 'creature'
finder.apply_ngram_filter(creature_filter)
# return the 10 n-grams with the highest PMI
print finder.nbest(trigram_measures.likelihood_ratio, 10)

il utilise la mesure de vraisemblance et filtre aussi les Ngrams qui ne contiennent pas le mot 'créature'

11
répondu bogs 2014-01-17 11:54:31

Question 1-Try:

target_word = "electronic" # your choice of word
finder.apply_ngram_filter(lambda w1, w2, w3: target_word not in (w1, w2, w3))
for i in finder.score_ngrams(trigram_measures.likelihood_ratio):
print i

L'idée est de filtrer ce que vous ne voulez pas. Cette méthode est normalement utilisée pour filtrer les mots dans des parties spécifiques du ngram, et vous pouvez ajuster cela au contenu de votre cœur.

2
répondu dmvianna 2014-01-17 04:22:01

pour ce qui est de la question 2, Oui! NLTK a le rapport de vraisemblance dans sa mesure d'association. La première question reste sans réponse!

http://nltk.org/api/nltk.metrics.html?highlight=likelihood_ratio#nltk.metrics.association.NgramAssocMeasures.likelihood_ratio

0
répondu Sabba 2014-01-17 03:57:58