ファイル内の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

おすすめ記事