Comment obtenir des mots de fréquence de manière efficace avec ruby?
D'entrée d'échantillon:
"I was 09809 home -- Yes! yes! You was"
et de sortie:
{ 'yes' => 2, 'was' => 2, 'i' => 1, 'home' => 1, 'you' => 1 }
Mon code qui ne fonctionne pas:
def get_words_f(myStr)
myStr=myStr.downcase.scan(/\w/).to_s;
h = Hash.new(0)
myStr.split.each do |w|
h[w] += 1
end
return h.to_a;
end
print get_words_f('I was 09809 home -- Yes! yes! You was');
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne, mais je suis un peu nouveau pour Ruby trop. Il y a peut être une meilleure solution.
Au lieu de
.split(' ')
, vous pouvez aussi faire.scan(/\w+/)
; cependant,.scan(/\w+/)
séparéesaren
ett
dans"aren't"
, tandis que.split(' ')
ne sera pas.De sortie de votre code d'exemple:
frequency[word.downcase]
n'existe pas?2.4+
a ajouté le support pour les non-ascii conversion de la casse. @アレックス c'est ce Que l'Hash.new(0)
: il est de spécifier une valeur par défaut de0
.Deuxième variante:
map_hash
àEnumerable
, qui cuit ensemblemap
etHash[]
.Ce code va vous demander pour l'entrée et ensuite trouver la fréquence de mots pour vous:
Cela fonctionne, et ignore les chiffres:
Vous pouvez regarder mon code qui divise le texte en mots. Le code de base se présente comme suit:
Vous devez être prudent si vous souhaitez travailler avec des langues autres que l'anglais, car en Ruby 1.9 le downcase ne fonctionne pas comme prévu pour les lettres telles que "Ł'.
met "j'ai été 09809 à la maison, Oui! oui! Vous avez été".fréquence