NLPer大好きN-gramをシェルで。
データ
余談だがUNIX系のマシンを使ってる人は次のコマンドを実行してみて。
head /usr/share/dict/words
謎の単語リストファイルだった。
A
A's
AMD
AMD's
AOL
AOL's
AWS
AWS's
Aachen
Aachen's
早速AWSとかあるので太古のファイルではなさそう(メンテはされてそう)
軽く調べたところスペルチェックファイルとかに使うみたい。
今日はこれをデータとして、頻出Trigramをシェルで求めます。
ファイルない人は適当に改行区切りのテキストデータ用意して。
コマンド
cat /usr/share/dict/words | tr [A-Z] [a-z] \
| awk -v x=3 '{for (i=1; i<=length-x+1; i++) {print substr($0, i, x)}}' \
| sort | uniq -c | sort -k1,2rn | head
N-gramにしたいときは、awkの引数x=3の部分をNに変えよう。
解説
tr [A-Z] [a-z]
大文字小文字変換
awk -v x=3 '{for (i=1; i<=length-x+1; i++) {print substr($0, i, x)}}'
1文字ずつずらしてTrigramを生成
awk自体は良いのだがシェル芸的な範囲でfor文を使ってしまうとやや負けた感がある。
sort | uniq -c | sort -k1,2rn
いつものカウントソート
答え
8496 ing
4674 e's
4305 ion
3908 n's
3605 ati
3543 tio
3095 ter
3072 ess
2927 r's
2847 ent
まぁ違和感はない。
0 件のコメント:
コメントを投稿