GNU/Linux >> Tutoriels Linux >  >> Linux

Trouver N mots les plus fréquents dans un fichier ?

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".


Linux
  1. Comment trouver des parenthèses sans correspondance dans un fichier texte ?

  2. Impossible de trouver le fichier à patcher sur la ligne d'entrée 3 ?

  3. Trouver N mots les plus fréquents dans un fichier avec une liste de mots vides à partir de la ligne de commande ?

  4. Utiliser _roff pour souligner des mots ?

  5. Obtenir le fichier le plus récent dans un répertoire sous Linux

Comment trouver une chaîne dans un fichier sous Linux

Retrouver les fichiers perdus avec Scalpel

Autorisations Linux - Comment trouver les autorisations d'un fichier

quelle est la commande la plus fiable pour trouver la taille réelle d'un fichier linux

Pourquoi est-il si difficile de trouver un fichier dans Ubuntu ?

Trouver des mots répétés dans un texte