2016-09-25 4 views
0

Ich versuche, eine Wortgruppe aus einer Textdatei zu bekommen, aber bis jetzt kann ich nur eine Wortanzahl erhalten (siehe unten). Ich muss diese Logik erweitern, um zu zählen, wie oft eine Zwei-Wort-Phrase in der Textdatei erscheint.Zählen von Phrasen in Python mit NLTK

Phrasen können definiert/gruppiert werden, indem Logik von NLTK aus meinem Verständnis verwendet wird. Ich glaube, die Collections-Funktion ist das, was ich brauche, um das gewünschte Ergebnis zu erhalten, aber ich bin mir nicht sicher, wie ich es aus dem Lesen der NLTK-Dokumentation implementieren soll. Irgendwelche Tipps/Hilfe würden sehr geschätzt werden.

import re 
import string 
frequency = {} 
document_text = open('Words.txt', 'r') 
text_string = document_text.read().lower() 
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string) 

for word in match_pattern: 
    count = frequency.get(word,0) 
    frequency[word] = count + 1 

frequency_list = frequency.keys() 

for words in frequency_list: 
    print (words, frequency[words]) 
+0

Suchen Sie für zwei bestimmte Wörter? Oder nur zwei beliebige Wortgruppen, die zusammen erscheinen? – accraze

+0

Zwei Wörter, die zusammen erscheinen – bkubs557

+1

Suchen Sie nach [nltk.bigrams()] (http://www.nltk.org/api/nltk.html#nltk.util.bigrams)? – alexis

Antwort

0

Sie können alle zwei Wortphrasen mit dem collocations Modul erhalten. Dieses Tool identifiziert Wörter, die häufig hintereinander in Korpora angezeigt werden.

Um die zwei Wortphrasen zu finden, müssen zuerst die Häufigkeiten von Wörtern und deren Auftreten im Zusammenhang mit anderen Wörtern berechnet werden. NLTK hat eine BigramCollocationFinder Klasse, die dies tun kann. Hier ist, wie wir die Bigramm Collocations finden:

import re 
import string 
import nltk 
from nltk.tokenize import word_tokenize, sent_tokenize 
from nltk.collocations import BigramCollocationFinder, BigramAssocMeasures 

frequency = {} 
document_text = open('Words.txt', 'r') 
text_string = document_text.read().lower() 
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string) 

finder = BigramCollocationFinder.from_words(match_pattern) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
print(finder.nbest(bigram_measures.pmi, 2)) 

NLTK Collocations Docs: http://www.nltk.org/api/nltk.html?highlight=collocation#module-nltk.collocations

+0

Danke! Wenn ich versuche, meine TXT-Datei in die Finder-Funktion zu übertragen, druckt sie einfach "[('W', 'o'), ('d', 's')]" aus. Gibt es etwas, was ich tun muss, bevor ich es in den Finder übergebe? Aus der Dokumentation war nicht klar. – bkubs557

+0

Ich habe den Code in meiner Antwort aktualisiert, ich glaube, dass Sie 'match_pattern' stattdessen an den Finder übergeben müssen – accraze

0

nltk.brigrams gibt ein Wortpaar und deren Häufigkeit in einem bestimmten Text. Versuchen Sie folgendes:

import nltk 
from nltk import bigrams 

document_text = open('Words.txt', 'r') 
text_string = document_text.read().lower() 
tokens = word_tokenize(text_string) 
result = bigrams(tokens) 

Ausgang:

[(('w1', 'w2'), 6), (('w3', 'w4'), 3), (('w5', 'w6'), 3), (('w7', 'w8'), 3)...]