【シェルと遊ぼう】manの高頻出単語を調べる

概要

僕は英語が苦手なので、英語のmanを読むのに時間がかかる。

日本語版を読めば良いのだけれども、苦手な英語に少しでも慣れたいとは思っている。

まずは何と言っても単語力をどうにかせねば。

よし、manに出てくる回数が多い単語をリストアップして、優先的に覚えるぞー。

つくるもの

ここでは、4つの短いスクリプトを作っていく。

  1. manのリストを作る
  2. manに出てくる単語を行に分けて出力する
  3. 英単語っぽい行のみに絞る
  4. 出現回数を数えてソートする

コード

1. manのリストを作る

まずは単語を収集するマニュアルのリストを作る。
下記方針で作成してみる。

  • 引数(デフォルト/usr/share/man/)のxxxx.番号.gzが対象のマニュアル
  • 別名へのリンクになっているものは除く(実体側のみ)
  • 出力フォーマットはセクション番号 ページ名(コマンド名など)

実行結果

> ./listman  
1 [  
1 addr2line  
1 alias  
1 alloc  
1 apply  
1 apropos  
  .  
  .  
  .  

wc -lした結果では、今回の対象ディレクトリ配下だけでも、10690個のマニュアルがあるらしい。
マニュアルを書く人も、和訳する人も、いつもありがとうございます。

ちなみにセクションごとのマニュアル数の内訳は下記の通り。
(左列がマニュアル数、右列がセクション番号)

 579 1  
 363 2  
5874 3  
 846 4  
 183 5  
  12 6  
  49 7  
 529 8  
2255 9  

2. manに出てくる単語を行に分けて出力する

次に、先程のコマンドで作成したリストの各マニュアルの内容から単語を取り出す。
下記手順。

  1. xargs + manでマニュアルを開く
  2. colmanの制御文字を削除。TABはスペースに置き換え
  3. sedで単語を囲んでそうな記号を空白に置き換え
  4. trですべて小文字にへ変換
  5. 空行を削除

実行結果

数字も記号もまだ混じっているが、元ネタはできてそうだ。

> ./listman | ./listword
test  
1  
freebsd  
general  
commands  
manual  
test  
1  
name  
test  
[
  .  
  .  
  .  

この処理の途中、なぜか下記のようなエラーが出た。

<standard input>:2: can't open `man3/ibnd_discover_fabric.3': そのようなファイルまたはディレクトリ はありません  
<standard input>:2: can't open `man3/ibnd_discover_fabric.3': そのようなファイルまたはディレクトリ はありません  
<standard input>:2: can't open `man3/ibnd_find_node_guid.3': そのようなファイルまたはディレクトリはありません  
<standard input>:2: can't open `man3/ibnd_iter_nodes.3': そのようなファイルまたはディレクトリはありません  
<standard input>:2: can't open `man3/ibnd_discover_fabric.3': そのようなファイルまたはディレクトリ はありません  

単体なら開けるのだけれども、そもそもエラーのファイル名が変だ。
うーん、理由が良くわかない。

しかし、このファイル数なら今回の目的には影響は小さいだろうということにして、止まらず先に進もう。

3. 英単語っぽい行のみに絞る

下記の単純なルールに合致した行を英単語ということにする。

  • 数字・記号を含まない2文字以上の文字列

結果、ハイフンから始まるオプションなども省くことになる。

実行結果

> ./listman | ./listword | ./eitango
aa  
aa  
aa  
aa  
aa  
  .  
  .  
  .  

なんだ、aaって。
こんなよく分からない行もたくさん混じっているけど、それら各々の出現回数はそんなに多くはなさそうだ。
全体で集計すれば、それなりの結果が出るんじゃないかな。

4. 出現回数を数えてソートする

出現回数を数えるのには、uniq -cが大変便利。

実行結果

下記が実行結果。
左列が出現回数、右列が該当単語。

一番出てくる単語は、theの模様。

> ./listman | ./listword | ./eitango | ./cntword 
859520 the  
285809 to  
231607 is  
217532 of  
180255 and  
132970 in  
121622 be  
119305 int  
107438 for  
102961 if  
  .  
  .  
  .  

結果を眺めてちょっと思ったのは、freebsdとか、項目名のdescriptionなどは、除外してもいいかもなー、と。
マニュアル数分は絶対回数出てくるし。

また、三人称単数、現在進行形、過去形などは分かる範囲で元の単語に置き換えてもいいかも。(*ying -> *y みたいな)
ちょくちょく被ってる。
だいたい、何でこんな複雑に各単語が変化するルールになったのだろうか。。。

まぁ、気になる人はやってみてねと。

最頻出単語 TOP2000

上記結果のTOP2000を抜粋。

いずれも前述の通り、以下の点には留意されたし。

  • コマンド名や固有名詞も含まれている
  • 項目名のdescriptionみたいに、必ず出てくる単語も出現回数はそのまま計上
  • 三人称単数、現在進行形、過去形などもそのまま
  • オプション名に使われている単語は含んでいない

それにしても、分からない単語あったら結局自分で調べるのは嫌だな。
次はこれを元に和訳くっつける方法を探してみるかな。。。

今日はこんなとこ。

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS 12.0-RELEASE-p5

おしまい。