シェルでN-gram

火曜日, 2月 23, 2021

UNIX

t f B! P L

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

まぁ違和感はない。

QooQ