Compter la fréquence des mots d'une liste et Trier par fréquence
j'utilise Python 3.3
je dois créer deux listes, une pour les mots uniques et l'autre pour les fréquences du mot.
je dois trier la liste de mots unique basée sur la liste des fréquences pour que le mot avec la plus haute fréquence soit le premier dans la liste.
j'ai le design en texte mais je ne sais pas comment l'implémenter en Python.
Les méthodes que j'ai trouvé jusqu'à présent utiliser Counter
ou les dictionnaires que nous n'avons pas savant. J'ai déjà créé la liste à partir du fichier contenant tous les mots, mais ne savez pas comment trouver la fréquence de chaque mot dans la liste. Je sais que j'aurai besoin d'une boucle pour le faire mais je ne peux pas le comprendre.
Voici le design de base:
original list = ["the", "car",....]
newlst = []
frequency = []
for word in the original list
if word not in newlst
newlst.append(word)
set frequency = 1
else
increase the frequency
sort newlst based on frequency list
11 réponses
utiliser ce
from collections import Counter
list1=['apple','egg','apple','banana','egg','apple']
counts = Counter(list1)
print(counts)
# Counter({'apple': 3, 'egg': 2, 'banana': 1})
Vous pouvez utiliser
from collections import Counter
il prend en charge Python 2.7 chantez lire plus d'informations ici
1.
>>>c = Counter('abracadabra')
>>>c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
utiliser dict
>>>d={1:'one', 2:'one', 3:'two'}
>>>c = Counter(d.values())
[('one', 2), ('two', 1)]
mais, il faut d'abord lire le fichier, puis le convertir en dict.
2. c'est l'exemple de python docs,utilisez re et Counter
# Find the ten most common words in Hamlet
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
words = file("test.txt", "r").read().split() #read the words into a list.
uniqWords = sorted(set(words)) #remove duplicate words and sort
for word in uniqWords:
print words.count(word), word
vous pouvez utiliser reduce() - une manière fonctionnelle.
words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})
renvoie:
{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}
Un autre moyen serait de faire une liste de listes, chaque sous-liste dans la nouvelle liste contenant un mot et d'un nombre:
list1 = [] #this is your original list of words
list2 = [] #this is a new list
for word in list1:
if word in list2:
list2.index(word)[1] += 1
else:
list2.append([word,0])
Ou, de manière plus efficace:
for word in list1:
try:
list2.index(word)[1] += 1
except:
list2.append([word,0])
ce serait moins efficace que d'utiliser un dictionnaire, mais il utilise des concepts plus basiques.
encore une autre solution avec un autre algorithme sans utiliser les collections:
def countWords(A):
dic={}
for x in A:
if not x in dic: #Python 2.7: if not dic.has_key(x):
dic[x] = A.count(x)
return dic
dic = countWords(['apple','egg','apple','banana','egg','apple'])
sorted_items=sorted(dic.items()) # if you want it sorted
L'idéal est d'utiliser un dictionnaire de cartes en un mot, c'est compter. Mais si vous ne pouvez pas utiliser cela, vous pourriez vouloir utiliser 2 listes - 1 stockant les mots, et l'autre stockant des nombres de mots. Notez que l'ordre des mots et compte les questions ici. La mise en œuvre de cette mesure serait difficile et peu efficace.
utiliser Counter serait le meilleur moyen, mais si vous ne voulez pas le faire, vous pouvez l'implémenter vous-même de cette façon.
# The list you already have
word_list = ['words', ..., 'other', 'words']
# Get a set of unique words from the list
word_set = set(word_list)
# create your frequency dictionary
freq = {}
# iterate through them, once per unique word.
for word in word_set:
freq[word] = word_list.count(word) / float(len(word_list))
freq finira avec la fréquence de chaque mot dans la liste que vous avez déjà.
Vous avez besoin d' float
là-dedans pour convertir un des entiers en un flotteur, donc la valeur résultante sera un flotteur.
Edit:
si vous ne pouvez pas utiliser un dict ou un set, voici un autre moyen moins efficace:
# The list you already have
word_list = ['words', ..., 'other', 'words']
unique_words = []
for word in word_list:
if word not in unique_words:
unique_words += [word]
word_frequencies = []
for word in unique_words:
word_frequencies += [float(word_list.count(word)) / len(word_list)]
for i in range(len(unique_words)):
print(unique_words[i] + ": " + word_frequencies[i])
le indicies de l' unique_words
et word_frequencies
match.
essaye ceci:
words = []
freqs = []
for line in sorted(original list): #takes all the lines in a text and sorts them
line = line.rstrip() #strips them of their spaces
if line not in words: #checks to see if line is in words
words.append(line) #if not it adds it to the end words
freqs.append(1) #and adds 1 to the end of freqs
else:
index = words.index(line) #if it is it will find where in words
freqs[index] += 1 #and use the to change add 1 to the matching index in freqs
voici le support de code de votre question is_char() case pour valider la chaîne de compter ces chaînes seul, Hashmap est dictionnaire en python
def is_word(word):
cnt =0
for c in word:
if 'a' <= c <='z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '$':
cnt +=1
if cnt==len(word):
return True
return False
def words_freq(s):
d={}
for i in s.split():
if is_word(i):
if i in d:
d[i] +=1
else:
d[i] = 1
return d
print(words_freq('the the sky$ is blue not green'))
la meilleure chose à faire c'est :
def wordListToFreqDict(wordlist):
wordfreq = [wordlist.count(p) for p in wordlist]
return dict(zip(wordlist, wordfreq))
alors essayez de :
wordListToFreqDict(originallist)