ファイル内のn個の最も一般的な単語を見つける

ファイル内のn個の最も一般的な単語を見つける

テキストファイルで最も一般的な10の単語を見つけたいです。まず、ソリューションはキー入力(つまり私の時間)に合わせて最適化する必要があります。第二に、パフォーマンスのためです。これまで私が選んだ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

(word、numberOfOccurences)を辞書に保存して値をソートするJava、Pythonなどのプログラムを作成することも、MapReduceを使用することもできますが、キーストロークに合わせて最適化します。

偽の肯定はありますか?もっと良い方法がありますか?

答え1

これは、「最も一般的なN項目」を見つける最も一般的な方法です。ただし、aが欠けており、sort無料で1つありますcat

tr -c '[:alnum:]' '[\n*]' < test.txt | sort | uniq -ci | sort -nr | head  -10

sort前にaを追加しないと、uniq -ci 誤ったシングルトン単語がたくさん出る可能性があります。 uniq全体的なユニークさではなく、ラインだけがユニークです。

「単語を止める」というトリックを使いたいかもしれません。英語のテキスト(申し訳ありませんが、ここでは北米の単一言語)を見ると、「of」、「and」、「the」などの単語はほぼ常に最初の2〜3桁です。これを削除したいかもしれません。 GNU Groffディストリビューションにはeignかなり良い不用語のリストを含むファイルがあります。私のArchディストリビューションにはこのエントリがありますが、私も見たようですが、以前のUnixでも/usr/share/groff/current/eign見たようです。/usr/share/dict/eign/usr/dict/eign

次のように不用語を使用できます。

tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f -i /usr/share/groff/current/eign |
sort | uniq -ci | sort -nr | head  -10

私の考えでは、ほとんどの人間の言語は意味のある単語の頻度から同様の「不用な単語」を削除する必要があると思いますが、他の言語の不用な単語のリストをどこにインポートすることを提案するのかわかりません。

-won フラグはfgrepフルワードマッチングを有効にします。これにより、短い中に含まれている単語(「a」や「i」など)の誤った肯定を防ぐことができます。このフラグは、単語を比較するとオンになり、大文字と-i小文字uniqを無視します。fgrep

答え2

これはutf-8でよりうまく機能します。

$ sed -e 's/\s/\n/g' < test.txt | sort | uniq -c | sort -nr | head  -10

答え3

AWKを使ってみよう!

この関数は、指定されたファイル内の各単語の発生頻度を降順に一覧表示します。

function wordfrequency() {
  awk '
     BEGIN { FS="[^a-zA-Z]+" } {
         for (i=1; i<=NF; i++) {
             word = tolower($i)
             words[word]++
         }
     }
     END {
         for (w in words)
              printf("%3d %s\n", words[w], w)
     } ' | sort -rn
}

次のようにファイルから呼び出すことができます。

$ cat your_file.txt | wordfrequency

最初の10語の場合:

$ cat your_file.txt | wordfrequency | head -10

源泉:AWKイルルビー

答え4

Haskellを使ってみよう!

ますます言語戦争になっているのではないでしょうか?

import Data.List
import Data.Ord

main = interact $ (=<<) (\x -> show (length x) ++ " - " ++ head x ++ "\n")
                . sortBy (flip $ comparing length)
                . group . sort
                . words

使用法:

cat input | wordfreq

または:

cat input | wordfreq | head -10

関連情報