Je veux trouver, disons, 10 mots les plus courants dans un fichier texte. Premièrement, la solution doit être optimisée pour les frappes (en d'autres termes - mon temps). Deuxièmement, pour la performance. Voici ce que j'ai jusqu'à présent pour obtenir le top 10 :
cat test.txt | tr -c '[:alnum:]' '[n*]' | uniq -c | sort -nr | head -10
6 k
2 g
2 e
2 a
1 r
1 k22
1 k
1 f
1 eeeeeeeeeeeeeeeeeeeee
1 d
Je pourrais créer un programme java, python, etc. où je stocke (mot, nombre d'occurrences) dans un dictionnaire et trie la valeur ou je peux utiliser MapReduce, mais j'optimise pour les frappes.
Existe-t-il des faux positifs ? Existe-t-il un meilleur moyen ?
Réponse acceptée :
C'est à peu près la façon la plus courante de trouver "N choses les plus courantes", sauf qu'il vous manque un sort
, et vous avez un cat
gratuit :
tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head -10
Si vous ne mettez pas de sort
avant le uniq -c
vous obtiendrez probablement beaucoup de faux mots singleton. uniq
ne fait que des séries de lignes uniques, pas l'unicité globale.
MODIF : J'ai oublié une astuce, les "mots vides". Si vous regardez un texte en anglais (désolé, monolingue nord-américain ici), des mots comme "de", "et", "le" occupent presque toujours les deux ou trois premières places. Vous voulez probablement les éliminer. La distribution GNU Groff a un fichier nommé eign
qui contient une liste assez décente de mots vides. Ma distribution Arch a /usr/share/groff/current/eign
, mais je pense avoir aussi vu /usr/share/dict/eign
ou /usr/dict/eign
dans les anciens Unix.
Vous pouvez utiliser des mots vides comme ceci :
tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10
Je suppose que la plupart des langues humaines ont besoin de "mots vides" similaires retirés du nombre de mots significatifs, mais je ne sais pas où suggérer d'obtenir des listes de mots vides dans d'autres langues.
MODIF : fgrep
devrait utiliser le -w
commande, qui active la correspondance de mots entiers. Cela évite les faux positifs sur les mots qui contiennent simplement des arrêts courts, comme "a" ou "i".