Quiero encontrar, digamos, las 10 palabras más comunes en un archivo de texto. En primer lugar, la solución debe optimizarse para las pulsaciones de teclas (en otras palabras, mi tiempo). En segundo lugar, por el rendimiento. Esto es lo que tengo hasta ahora para llegar al 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
Podría hacer un programa java, python, etc. donde almacenar (palabra, número de ocurrencias) en un diccionario y ordenar el valor o podría usar MapReduce, pero optimizo las pulsaciones de teclas.
¿Hay falsos positivos? ¿Hay una mejor manera?
Respuesta aceptada:
Esa es prácticamente la forma más común de encontrar "N cosas más comunes", excepto que te falta un sort
, y tienes un cat
gratis :
tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head -10
Si no pones un sort
antes de uniq -c
probablemente obtendrá muchas palabras únicas falsas. uniq
solo hace series únicas de líneas, no unicidad general.
EDITAR: Olvidé un truco, "palabras de parada". Si estás viendo texto en inglés (lo siento, monolingüe norteamericano aquí), palabras como "de", "y", "el" casi siempre ocupan los dos o tres primeros lugares. Probablemente quieras eliminarlos. La distribución GNU Groff tiene un archivo llamado eign
en él que contiene una lista bastante decente de palabras vacías. Mi distribución Arch tiene /usr/share/groff/current/eign
, pero creo que también he visto /usr/share/dict/eign
o /usr/dict/eign
en Unixes antiguos.
Puede usar palabras vacías como esta:
tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10
Supongo que la mayoría de los idiomas humanos necesitan que se eliminen "palabras vacías" similares de los recuentos de frecuencia de palabras significativas, pero no sé dónde sugerir que se obtengan listas de palabras vacías en otros idiomas.
EDITAR: fgrep
debe usar -w
comando, que permite la coincidencia de palabras completas. Esto evita falsos positivos en palabras que simplemente contienen palabras breves, como "a" o "i".