Ich habe mit Mecab gespielt und es gefunden, als ich dachte, es sei okay, also mach dir eine Notiz.
Es kann Text oder CSV sein, aber ich denke, es ist selten, dass Sie Code schreiben möchten, der die Häufigkeit des Auftretens jedes Elements in einer Liste mit Duplikaten zählt. Wenn Sie es gehorsam mit einem Wörterbuch implementieren
data = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']
word_and_counts = {}
for word in data:
if word_and_counts.has_key(word):
word_and_counts[word] += 1
else:
word_and_counts[word] = 1
for w, c in sorted(word_and_counts.iteritems(), key=lambda x: x[1], reverse=True):
print w, c # =>
# aaa 2
# bbb 1
# ccc 1
# ddd 1
Ich denke es wird so sein.
In einem solchen Fall ist das Sammlungsmodul praktisch. Implementieren Sie es also mithilfe von Sammlungen erneut.
from collections import Counter
data = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']
counter = Counter(data)
for word, cnt in counter.most_common():
print word, cnt # =>
# aaa 2
# bbb 1
# ccc 1
# ddd 1
Ich konnte es präzise umsetzen. Darüber hinaus scheint es früh zu sein, weil es eingebaut ist. Außerdem hat Counter verschiedene andere Operatoren und bequeme Methoden.
from collections import Counter
dataA = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']
dataB = ['aaa', 'bbb', 'bbb', 'bbb', 'abc']
counterA = Counter(dataA)
counterB = Counter(dataB)
counter = counterA + counterB #Die Frequenz kann hinzugefügt werden
counterA.subtract(counterB) #Nehmen Sie den Unterschied zwischen Elementen (destruktive Methode)
counter.most_common(3) #Holen Sie sich die Top 3 Elemente (wie im obigen Beispiel, wenn Sie das Weglassen des Arguments n weglassen, erhalten Sie alle Elemente in absteigender Reihenfolge)
#Einige andere
Jedes Objekt, das gehasht werden kann, ist in Ordnung. Vielleicht gibt es also andere gute Verwendungszwecke?
Außerdem hat das Sammlungsmodul einige nützliche Klassen, die gut aussehen, daher denke ich, dass es manchmal nützlich ist, es einmal zu lesen.
Mit Counter sieht der Code, den ich Mecab im Tweet-Verlauf des heruntergeladenen Twitter ausprobiert habe, wie folgt aus.
# -*- coding: utf-8 -*-
from collections import Counter
import codecs
import json
import MeCab
#Ich habe ein schlechtes Know-how, möchte aber das Ausgabeergebnis umleiten
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
#Codecs geben Unicode zurück
#In der ersten Zeile befindet sich eine zusätzliche Beschreibung. Es handelt sich um einen langwierigen Testcode, der problematisch ist. Löschen Sie ihn daher im Voraus
_tweetfile = codecs.open('./data/js/tweets/2013_09.js', 'r', 'sjis')
tweets = json.load(_tweetfile)
#Mecab akzeptiert nur den Typ str, also codieren
texts = (tw['text'].encode('utf-8') for tw in tweets)
tagger = MeCab.Tagger('-Ochasen')
counter = Counter()
for text in texts:
nodes = tagger.parseToNode(text)
while nodes:
if nodes.feature.split(',')[0] == 'Substantiv':
word = nodes.surface.decode('utf-8')
counter[word] += 1
nodes = nodes.next
for word, cnt in counter.most_common():
print word, cnt
Der Teil, der unterscheidet, ob es sich um eine Nomenklatur handelt, ist langweilig oder das Symbol wird eingefügt, hat aber vorerst gut funktioniert. Ich bin glücklich.
Ich habe diese Tricks zusammengestellt. Wenn es Ihnen nichts ausmacht, bitte (Häufige Redewendungen, die den Python-Code ein wenig sauberer machen, wenn Sie sich nur daran erinnern)