2013-09-27 3 views
1

J'utilise NLTK pour faire une analyse d'un certain nombre de documents distincts. Le contenu de ces documents signifie qu'ils ont tous tendance à se terminer et à commencer par les mêmes jetons.Puis-je obtenir BigRamRollocationFinder (nltk) pour respecter les limites des documents?

Je marque les documents dans une liste de listes, puis j'utilise BigRobCollocationFinder.from_documents pour créer le finder. Lorsque je note les ngrammes par fréquence brute, je remarque que l'occurrence la plus courante est le caractère de fin/caractère de départ. Cela suggérerait que tous les documents sont réunis en un et que l'on trouve des ngrammes sur tout le lot dont je ne veux pas.

Un échantillon du code:

line_tokenizer = nltk.RegexpTokenizer('\{|\}|[^,"}]+') 
seqs = ["{B,C}", "{B,A}", "{A,B,C}"] 
documents = [line_tokenizer.tokenize(s) for s in seqs] 
finder = BigramCollocationFinder.from_documents(documents) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
print(finder.score_ngrams(bigram_measures.raw_freq)) 

Il en résulte la sortie suivante:

[(('B', 'C'), 0.15384615384615385), 
(('C', '}'), 0.15384615384615385), 
(('{', 'B'), 0.15384615384615385), 
(('}', '{'), 0.15384615384615385), 
(('A', 'B'), 0.07692307692307693), 
(('A', '}'), 0.07692307692307693), 
(('B', 'A'), 0.07692307692307693), 
(('{', 'A'), 0.07692307692307693)] 

Le ngram} {apparaît dans la liste qui ne devrait pas} {jamais apparaître à côté de l'autre.

Existe-t-il une autre façon d'aborder ce problème pour éviter} {apparaître dans la liste?

+0

cela semble fou, mais je pense que vous pouvez pirater votre chemin de cela, me donner une minute, alors que je code le hack =) – alvas

Répondre

1

Je crois que vous voulez garder bigrams comme {A et C} parce que parfois il est bon de savoir que certains mots se produisent toujours à la fin ou au début de la phrase. Et ainsi le hack:

Enlevez le bigram }{ du bigram_measure, puis recalculez la probabilité d'autres bigrams avec 1-prob('}{').

import nltk 
line_tokenizer = nltk.RegexpTokenizer('\{|\}|[^,"}]+') 
seqs = ["{B,C}", "{B,A}", "{A,B,C}"] 
documents = [line_tokenizer.tokenize(s) for s in seqs] 
finder = nltk.collocations.BigramCollocationFinder.from_documents(documents) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
# Put bigram measures into a dict for easy access 
x = dict(finder.score_ngrams(bigram_measures.raw_freq)) 

# Re-adjust such that the score of 
# each bigram is divided by 1-prob('}{') 
newmax = 1- x[('}','{')] 

# Remove "}{" from bigrams. 
del x[('}','{')] 

# Recalcuate prob for each bigram with newmax 
y =[(i,j/float(newmax)) for i,j in x.iteritems()] 
print y 

[(('B', 'C'), 0.18181818181818182), (('C', '}'), 0.18181818181818182), (('B', 'A'), 0.09090909090909091), (('{', 'A'), 0.09090909090909091), (('{', 'B'), 0.18181818181818182), (('A', 'B'), 0.09090909090909091), (('A', '}'), 0.09090909090909091)] 
Questions connexes