テキストファイルで最も一般的な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
私の考えでは、ほとんどの人間の言語は意味のある単語の頻度から同様の「不用な単語」を削除する必要があると思いますが、他の言語の不用な単語のリストをどこにインポートすることを提案するのかわかりません。
-w
on フラグはfgrep
フルワードマッチングを有効にします。これにより、短い中に含まれている単語(「a」や「i」など)の誤った肯定を防ぐことができます。このフラグは、単語を比較するとオンになり、大文字と-i
小文字uniq
を無視します。fgrep