この記事は、PHP Advent Calendar 2014の5日目の記事です。
PHPに限らず、英語の技術情報が読めると、かなり世界が広がるのですが、苦手意識があるのか英語情報を避ける人が結構多く見受けられます。
本記事は、英語が役に立つのはわかっているけど、イマイチ踏み出せていないPHPerに送ります。
とりあえず、PHPマニュアル英語版の単語を分析して、どれくらいの語彙力があれば読みこなせるのかを解析してみましょう。
PHPerなので、もちろん実装はPHPですね。
1. 英単語集計仕様
集計仕様です。
- ダウンロード用のPHPマニュアルのsingle HTML fileが元ネタ
- HTMLファイルのテキストを1行ずつ評価する
- 行両端の空白文字トリム => HTMLタグの除去 => 文字列を小文字へ => 文中のカンマ・括弧は半角スペースに変換
- スペース区切りで文字列を単語に分割する。単語末の「!?.」は除去。
- a-z、アポストロフィ、ハイフン、ピリオドで構成される3文字以上の文字列を英単語としてカウント
動詞の過去形とか、名詞の複数形とかは考慮にいれませんでした。(面倒だったから・・・)
2. 実装(PHP)
今回の英単語集計プログラムのソースです。 標準入力でデータを受け取るようにしてます。
ざっくりと説明すると、単語を乱暴に配列に突っ込んで array_count_valuesで重複を数えて集計。
array_sumで単語の合計数を集計して、後はカバレッジを計算しつつ出力するだけです。 いやぁ、PHPの配列関数便利だな~。
1 | #!/usr/bin/env php |
ちなみに元データの行数は123万行
1 | $ wc -l php_manual_en.html |
集計にかかった実行時間は8秒くらいでした。
1 | $ time cat php_manual_en.html | ./main.php |
3. 結果
怪しげな単語も見受けられましたが、種類で言うと2万単語くらいあるようです。
総単語数 |
---|
23519 |
次に、登場回数が多い単語から並べた時の単語数と文章全体に対するカバレッジを集計してみたのが下記。 カバレッジ80%でも774単語なのは、結構驚きですね。やはり技術文書なので、単語のバリエーションはそんなに多くないという印象です。
カバレッジ | 単語数 |
---|---|
40% | 51 |
60% | 195 |
80% | 774 |
90% | 1879 |
95% | 3784 |
次にPHPerなら気になるである単語の登場回数をチェック。 いやぁ、なんていうか、だからどうした感がすごいですが、phpとarrayオオイネ。
単語 | 登場回数 |
---|---|
php | 15931 |
array | 10536 |
null | 2229 |
foreach | 74 |
htmlspecialchars | 50 |
最後に、登場回数トップ10はコチラ
returnsとreturnがランクインしているあたりに仕様の脆弱さを感じずにはいられません。すいません。orz…
順位 | 単語 | 回数 | カバレッジ |
---|---|---|---|
1 | the | 104467 | 8.367 |
2 | and | 18063 | 9.814 |
3 | string | 17529 | 11.217 |
4 | example | 16237 | 12.518 |
5 | for | 16041 | 13.803 |
6 | php | 15931 | 15.079 |
7 | this | 15219 | 16.297 |
8 | returns | 13205 | 17.355 |
9 | return | 11778 | 18.298 |
10 | description | 11624 | 19.229 |
全部の結果は=>コチラにおいておきました。
要するに、この分析を通して私が伝えたいのは、英語といえども、技術文書なら単語のバリエーションもそんなに多くない!
PHPマニュアル英語版を足がかりに、英語圏の情報に触れていこうよ!ということでした。
おまけ. 実装(シェル)
なんとなく、やってみたくなったのでシェルのワンライナーでもやってみた。
1 | cat php_manual_en.html | sed -e "s/<[^>]*>//g" | sed -e 's/^ *//' -e 's/ *$//' | tr '[:upper:]' '[:lower:]' | sed -e 's/[,()]/ /g' | tr -s ' ' "\012" | sed -e "s/[\.?\!]$//g" | ggrep -P "^[a-z'\.\-]{3,}$" | sort | uniq -c | sort -nr |
あれ・・・、結果の数が微妙に1000件単位で違う・・・。
しかも、せっかくシェル芸にしたのに処理時間が15秒くらいかかって、PHPより遅い・・・。 |彡サッ