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
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})
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)]
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 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}
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.
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
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.
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.
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)
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'))
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