たとえば、テキストファイルで最も一般的な10個の単語を見つけたいと思います。まず、ソリューションはキーストローク(つまり、私の時間)に対して最適化する必要があります。第二に、パフォーマンスのために。これが私がトップ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を使用することもできますが、キーストロークを最適化します。
誤検知はありますか?もっと良い方法はありますか?
承認された回答:
sort
がないことを除けば、これが「N個の最も一般的なもの」を見つける最も一般的な方法です。 、そしてあなたは無償のcat
を持っています :
tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head -10
sort
を入力しない場合 uniq -c
の前 おそらく、誤ったシングルトンの単語がたくさん出てくるでしょう。 uniq
全体的な一意性ではなく、一意のラインの実行のみを実行します。
編集: 「ストップワード」というトリックを忘れてしまいました。英語のテキスト(ここでは申し訳ありませんが、単一言語の北米)を見る場合、「of」、「and」、「the」などの単語は、ほとんどの場合、上位2〜3位になります。あなたはおそらくそれらを排除したいと思うでしょう。 GNU Groffディストリビューションには、eign
という名前のファイルがあります。 その中にストップワードのかなりまともなリストが含まれています。私のArchディストリビューションには/usr/share/groff/current/eign
があります 、でも/usr/share/dict/eign
も見たことがあると思います または/usr/dict/eign
古いUnixでは。
次のようなストップワードを使用できます:
tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10
私の推測では、ほとんどの人間の言語では、意味のある単語の頻度カウントから同様の「ストップワード」を削除する必要がありますが、他の言語のストップワードリストを取得することを提案する場所がわかりません。
編集: fgrep
-w
を使用する必要があります コマンド。単語全体の照合を有効にします。これにより、「a」や「i」などの短期間の作業のみを含む単語の誤検知を回避できます。