2016-03-22 9 views
4

Ich habe geteilt Text nachfolgende Worte ngrams mit diesem Python-Skript:Zählfrequenz von ngrams

from nltk.util import ngrams 

sentence = open('text.txt', "r") 
n = 2 
sixgrams = ngrams(sentence.read().split(), n) 

for grams in sixgrams: 
     print (grams) 

Jetzt bin ich mit folgenden zwei Problemen konfrontiert.

. Mein Ergebnis sieht wie folgt aus

('\xd1\x8e\xd0\xbc', '\xd0\xb1\xd0\xb0\xd0\xb9\xd0\xb3\xd0\xb0\xd0\xb0\xd0\xbd') 

Es ist vielleicht, weil text.txt Datei russische kyrillische Zeichen hat und in UTF-8 codiert. Gibt es eine Möglichkeit, mein Ergebnis in einem für Menschen lesbaren Format in Python anzuzeigen?

. Ich habe versucht, Collections.Counter zu verwenden, um die Anzahl der Häufigkeit der folgenden Wörter Kombinationen zu erhalten, und alle Ngrams zu drucken, die mehr als 2 Mal (sortiert nach Wert) angezeigt werden. Ich habe es stundenlang versucht, es nicht so zeigen zu lassen, wie ich es möchte.

Eingabebeispiel:

Diddle diddle dumpling my son Diddle diddle my son 

Ausgabe Beispiel:

Diddle diddle 2 
diddle dumpling 2 
dumpling my 1 
my son 2 
son Diddle 1 
Diddle my 1 
my son 1 

Ausgabebeispiel mit Grenze von 2:

Diddle diddle 2 
diddle dumpling 2 
my son 2 
+0

verwenden Sie Python 2.7? – Saleem

+0

Es ist vorzuziehen, Python 3 für NLP-Aufgaben wegen der überlegenen Textfähigkeiten von Python 3 zu verwenden:/ –

+0

In Python 3 hätten Sie 'юм байгаан' schon gesehen –

Antwort

3

Zum ersten Teil Ihrer Frage, wie weit ich kann Sie lesen aus einer UTF-8 kodierten Datei. Sie können decode('utf8') auf den resultierenden Daten aufrufen, um es zu dekodieren. Um das Ergebnis zu drucken, verwenden Sie, vorausgesetzt Ihr Terminal kann es verarbeiten, erneut encode('utf8'), um es in eine lesbare Zeichenfolge umzuwandeln.

Wie für Teil 2 Ihrer Frage, ich habe den Code erweitert und umfasste eine Counter:

from nltk.util import ngrams 
import collections 

with open("text.txt", "rU") as f: 
    sixgrams = ngrams(f.read().decode('utf8').split(), 2) 

result = collections.Counter(sixgrams) 
print result 
with open("output.txt", "w") as f: 
    for item, count in sorted(result.iteritems()): 
     if count >= 2: 
      text = "{} {}".format(" ".join(item).encode('utf8'), count) 
      print text 
      print >>f, text 

Für Ihren Beispieltext der Ausgabe lautet wie folgt Datei:

Counter({('Diddle', 'diddle'): 2, ('my', 'son'): 2, ('dumpling', 'my'): 1, ('son', 'Diddle'): 1, ('diddle', 'dumpling'): 1, ('diddle', 'my'): 1}) 
Diddle diddle 2 
my son 2 

Dies funktioniert auch mit einer Datei, die Umlaute enthält:

Counter({(u'D\xf6ddle', u'diddle'): 2, (u'my', u'son'): 2, (u'dumpling',u'my'): 1, (u'diddle', u'dumpling'): 1, (u'son', u'D\xf6ddle'): 1, (u'diddle', u'my'): 1}) 
Döddle diddle 2 
my son 2 

EDIT: Ich habe Code hinzugefügt, um die Ausgabe in die Datei output.txt zu speichern.

+0

soweit ich sehen kann die "am häufigsten" -Funktion hat andere Regeln, um zu entscheiden, was in der Ausgabe enthalten. Als seine Anforderung ist alles, was in sortierter Reihenfolge mehr als einmal auftaucht. Ich denke, das ist die Lösung. Was würdest du ändern? – hochl

+0

Ach ja, ich habe nicht bemerkt, dass die Werte sortiert wurden. –

+0

Es funktioniert wie ein Zauber. Ich danke dir sehr. Eine letzte Sache, wie speichern Sie das Ergebnis in eine TXT-Datei? Ich habe folgenden Code am Ende hinzugefügt, aber nicht funktioniert output = open ("output.txt", "w") output.write (result) output.close() –

Verwandte Themen