PHPマニュアルに出てくる英単語を分析してみた

2014-12-05
PHP
Advent Calendar

この記事は、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
2
3
4
5
6
#!/usr/bin/env php
$count){
$then += $count;
$coverage = round(($then/$total)*100.00,3); //その時点での単語数を総数で割って、カバレッジを計算
print("$word => $count $coverage\n");
}

ちなみに元データの行数は123万行

1
2
$ wc -l php_manual_en.html
1236825 php_manual_en.html

集計にかかった実行時間は8秒くらいでした。

1
2
3
4
$ time cat php_manual_en.html | ./main.php
real 0m8.688s
user 0m8.495s
sys 0m0.300s

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より遅い・・・。 |彡サッ