web-dev-qa-db-fra.com

Compter la fréquence des mots dans une liste et trier par fréquence

J'utilise Python 3.3

J'ai besoin de 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 en fonction de la liste de fréquences afin que le mot avec la fréquence la plus élevée soit en tête de la liste. 

J'ai la conception dans le texte mais je ne sais pas comment l'implémenter en Python. 

Les méthodes que j'ai trouvées jusqu'à présent utilisent soit Counter, soit des dictionnaires que nous n'avons pas appris. J'ai déjà créé la liste à partir du fichier contenant tous les mots mais je ne sais pas comment trouver la fréquence de chaque mot de la liste. Je sais que j'aurai besoin d'une boucle pour le faire, mais je ne peux pas le comprendre.

Voici la conception 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 
55
user3088605

utilisez ceci

from collections import Counter
list1=['Apple','Egg','Apple','banana','Egg','Apple']
counts = Counter(list1)
print(counts)
# Counter({'Apple': 3, 'Egg': 2, 'banana': 1})
112
Ashif Abdulrahman

Vous pouvez utiliser 

from collections import Counter

Il supporte Python 2.7 , 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, vous devez d'abord lire le fichier et le convertir en dict.

2 . C'est l'exemple de la documentation python, 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)]
35
tdolydong
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
16
kyle k

Vous pouvez utiliser reduction () - de 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(), {})

résultats:

{'strawberry': 1, 'lemon': 1, 'Apple': 2, 'banana': 2}
3
Gadi

Une solution consiste à créer une liste de listes, chaque sous-liste de la nouvelle liste contenant un mot et 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, plus efficacement:

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 plus de concepts de base.

2
Milo P

Encore une autre solution avec un autre algorithme sans utiliser de 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
Reza Abtin

La méthode idéale consiste à utiliser un dictionnaire qui associe un mot à son compte. Mais si vous ne pouvez pas l'utiliser, vous voudrez peut-être utiliser 2 listes - une stockant les mots et l'autre stockant le nombre de mots. Notez que l'ordre des mots et compte compte ici. La mise en œuvre serait difficile et peu efficace.

1
Karan Goel

Utiliser Counter serait la meilleure solution, mais si vous ne le souhaitez pas, vous pouvez le mettre en œuvre vous-même.

# 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 se retrouvera avec la fréquence de chaque mot de la liste que vous avez déjà.

Vous avez besoin de float pour convertir l’un des entiers en float. La valeur résultante sera donc un float.

Modifier:

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])

Les indications de unique_words et Word_frequencies seront identiques.

1
johannestaas

Les pandas répondent:

import pandas as pd
original_list = ["the", "car", "is", "red", "red", "red", "yes", "it", "is", "is", "is"]
pd.Series(original_list).value_counts()

Si vous le vouliez par ordre croissant, c'est aussi simple que:

pd.Series(original_list).value_counts().sort_values(ascending=True)
0
Michaelpanicci

Voici le support du code pour votre question. 

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
skay

Essaye ça:

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
Paige Goulding