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 
44
demandé sur jwpfox 2013-12-11 08:50:47

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})
98
répondu Ashif Abdulrahman 2017-12-07 08:33:52

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)]
34
répondu tdolydong 2018-07-10 14:25:36
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
14
répondu kyle k 2013-12-11 05:00:45

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}
3
répondu Gadi 2016-02-23 18:11:08

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.

2
répondu Milo P 2013-12-11 05:11:51

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
2
répondu Reza Abtin 2015-12-20 08:40:20

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.

1
répondu Karan Goel 2017-12-07 08:17:58

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.

0
répondu johannestaas 2013-12-11 05:06:35

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
0
répondu Paige Goulding 2016-10-05 23:37:44

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'))
0
répondu skay 2018-08-13 14:08:43

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)

-2
répondu M7hegazy 2016-11-06 11:37:34