2016-07-27 37 views
1

In NLTK, können Sie leicht die Zählungen für die Wörter in einem Text, sagen wir, berechnen, indemNLTK FreqDist, plot die normalisierten counts?

tun
from nltk.probability import FreqDist 
fd = FreqDist([word for word in text.split()]) 

wo Text eine Zeichenfolge ist. Nun können Sie die Verteilung als

fd.plot() 

plotten und das gibt Ihnen eine schöne Liniendiagramm mit den Zählungen für jedes Wort. In der docs wird kein Weg erwähnt, stattdessen die tatsächlichen Frequenzen zu plotten, was in fd.freq(x) zu sehen ist.

Jeder einfache Weg, um die normalisierten Zählungen zu plotten, ohne die Daten in andere Datenstrukturen zu übernehmen, normalisieren und getrennt plotten?

Antwort

1

Sie können fd aktualisieren [Wort] mit fd [Wort]/Gesamt

from nltk.probability import FreqDist 

text = "This is an example . This is test . example is for freq dist ." 
fd = FreqDist([word for word in text.split()]) 

total = fd.N() 
for word in fd: 
    fd[word] /= float(total) 

fd.plot() 

Hinweis: Sie werden original FreqDist Werte verlieren.

0

Verzeihung der Mangel an Dokumentation. In nltk, FreqDist liefert Ihnen die rohe Anzahl (d. H. Häufigkeiten von Wörtern) im Text, aber ProbDist liefert Ihnen die Wahrscheinlichkeiten eines Wortes bei einem gegebenen Text.

Für weitere Informationen, Sie haben einige Code-Lese zu tun: https://github.com/nltk/nltk/blob/develop/nltk/probability.py

Die spezifischen Linien, die die Normalisierung tun kommt Form https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L598

So eine normalisierte ProbDist zu erhalten, können Sie folgendes tun:

>>> from nltk.corpus import brown 
>>> from nltk.probability import FreqDist 
>>> from nltk.probability import DictionaryProbDist 
>>> brown_freqdist = FreqDist(brown.words()) 
# Cast the frequency distribution into probabilities 
>>> brown_probdist = DictionaryProbDist(brown_freqdist) 
# Something strange in NLTK to note though 
# When asking for probabilities in a ProbDist without 
# normalization, it looks it returns the count instead... 
>>> brown_freqdist['said'] 
1943 
>>> brown_probdist.prob('said') 
1943 
>>> brown_probdist.logprob('said') 
10.924070185585345 
>>> brown_probdist = DictionaryProbDist(brown_freqdist, normalize=True) 
>>> brown_probdist.logprob('said') 
-9.223104921442907 
>>> brown_probdist.prob('said') 
0.0016732805599763002 
+0

Danke. Schade, dass es keine plot() -Methode gibt, um ein Diagramm als FreqDist zu zeigen. Außerdem hat FreqDist bereits eine 'freq'-Methode, die normalisiert, aber das löst nicht mein Problem, direkt vom Objekt zu plotten. –

+0

Es könnte wenig Sinn ergeben, Wahrscheinlichkeiten zu plotten, was ist in diesem Fall Ihre x- und y-Achse? – alvas

+0

Statt der Anzahl möchte ich die Häufigkeit des Auftretens, das ist alles. Macht Sinn, ich möchte wissen, was der Anteil eines Wortes in einem Korpus ist. Ich verstehe, dass das Wort "Häufigkeit" in der Linguistik verwendet wird, um zu zählen, aber ich würde das Verhältnis mögen. –