GNU/Linux >> Linux の 問題 >  >> Linux

ファイル内で最も頻繁に使用されるN個の単語を検索しますか?

たとえば、テキストファイルで最も一般的な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」などの短期間の作業のみを含む単語の誤検知を回避できます。


Linux
  1. テキストファイルで一致しない角かっこを見つける方法は?

  2. 入力行3でパッチを適用するファイルが見つかりませんか?

  3. Firefoxのログファイルを見つけますか?

  1. 各行の重複を無視して、.csvファイルで最も頻繁に使用される単語を見つける方法は?

  2. _roffを使用して単語に下線を付けますか?

  3. lsof :最も一般的に使用される例

  1. Linux のディレクトリにある最新のファイルを取得する

  2. ファイルを見つけて、Linux でそのディレクトリに cd します

  3. Unixで人間が読めるファイルを見つける