テキストファイルで最も一般的な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
答え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