J'ai joué avec Mecab et je l'ai trouvé quand je pensais que ça allait, alors prenez une note.
Cela peut être du texte ou CSV, mais je pense qu'il est rare que vous souhaitiez écrire du code qui compte la fréquence d'occurrence de chaque élément dans une liste qui a des doublons. Si vous l'implémentez docilement à l'aide d'un dictionnaire
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
Je pense que ce sera comme ça.
Dans un tel cas, le module collections est pratique. Réimplémentez-le donc à l'aide de collections.Counter.
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
J'ai pu le mettre en œuvre de manière concise. De plus, il semble être tôt car il est intégré. En outre, Counter a divers autres opérateurs et méthodes pratiques.
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 #La fréquence peut être ajoutée
counterA.subtract(counterB) #Faire la différence entre les éléments (méthode destructive)
counter.most_common(3) #Obtenez les 3 premiers éléments (comme dans l'exemple ci-dessus, si vous omettez l'omission de l'argument n, vous obtenez tous les éléments dans l'ordre décroissant)
#Quelques autres
Tout objet qui peut être haché est bien, alors peut-être y a-t-il d'autres bonnes utilisations?
En outre, le module collections a quelques classes utiles qui semblent bonnes, donc je pense qu'il est parfois utile de le lire une fois.
Enfin, en utilisant Counter, le code que j'ai essayé Mecab dans l'historique des tweets du Twitter téléchargé ressemble à ce qui suit.
# -*- coding: utf-8 -*-
from collections import Counter
import codecs
import json
import MeCab
#J'ai le sentiment d'un mauvais savoir-faire, mais je souhaite rediriger le résultat de sortie
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
#codecs renvoie unicode
#Il y a une description supplémentaire sur la première ligne et c'est un code de test fastidieux et c'est gênant alors supprimons-le à l'avance
_tweetfile = codecs.open('./data/js/tweets/2013_09.js', 'r', 'sjis')
tweets = json.load(_tweetfile)
#Mecab n'accepte que le type str, donc encodez
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] == 'nom':
word = nodes.surface.decode('utf-8')
counter[word] += 1
nodes = nodes.next
for word, cnt in counter.most_common():
print word, cnt
La partie qui distingue s'il s'agit d'une nomenclature est terne, ou le symbole est inséré, mais il est passé à un bon sentiment pour le moment. Je suis heureux.
J'ai rassemblé ces astuces, donc si cela ne vous dérange pas, s'il vous plaît (Idiomes fréquents qui rendent le code Python un peu plus propre juste en s'en souvenant)
Recommended Posts