またまた報告が遅れましたが、11月14日の土曜日に行われました社内のプロコンについて
書きたいと思います。

お題は「メール署名抽出プログラミングを作ろう」です。詳細は下記を見て下さい。
署名とはなにか
署名抽出って??
抽出プログラムを作りましょう
配点

制限時間は3時間(+泣きの延長15分)です。
環境は運営側で用意したPCです。Eclipseだけ用意してあり、PCはインターネットに繋がっていて
自由にライブラリなどダウンロード可能です。

結果の中から上位だった方のプログラムについてインタビューをまとめましたので簡単に紹介します。

優勝者インタビューのまとめ
言語 java
main()に全てのコードをつぎ込むつもりで開始。
メール単位でStringオブジェクトに入れられたので、こっから解析の仕方を
考えるんだけど、その前にとりあえずマスタデータとして使えそうなものをWebから拾う。
- 都道府県リスト -> 住所抽出に使えそう
- IPADICの人名 -> 氏名抽出に使えそう
今回の評価ポイントに「署名のありなし」があるため、署名っぽい部分の抽出を考える。
個々の項目の抽出は、順序としてはこれの後。
で、重要となるメールの解析方法だけど、行単位での解析といきたいとこだが、
後々の項目抽出を考えると、改行orブランク文字でsplitしたString配列を解析対象と
するのがよいような気がした。
署名のありなしに話を戻すと、結局、連続したPUNCTUATION文字(Character.getType()が
20or24or28)が13以上ある、という判定方法に落ち着いた(だったと思う)。
氏名は前述のIPADICの前方一致、
住所も都道府県に前方一致、郵便番号は"[〒]?[0-9]{3}-[0-9]{4}"のRegEx、
会社名に至っては、「株式会社」を含むかどうかだけで判別してたと思います。

結果は588点
署名ありなし判定は88%の精度でした!すごい!

準優勝者インタビューのまとめ
言語 ruby
抽出正規表現や抽出方法を順番に探しました。
住所の正規表現があったのが良かったです。
それぞれに、とれそう度をつけて順番に試し、また下の方にあるのを探すようにしました。
引用かどうかを判定して探さないようにしました。
携帯かどうかは電話番号が090/080かどうかで振り分けています。
名前がとれなかったので、MeCabを入れて抽出しようとしたのですが
(たぶん電話番号やメールアドレスの近くで、姓-名で並んでるはず)
windows-rubyで使う方法を探すのに手間取り、時間が切れました。

結果は466点
署名判定に失敗してましたが、抽出の精度は一番高かったです。
郵便番号は96%の精度、FAXは100%
メールアドレス88%


3位インタビューのまとめ
言語 C#
クラスはまず3つ
・ファイル読む
・ファイル吐く
・解析する
CSV読む方法は、クラスがあったなーと思ったので、Googleする。@ITにあった。コピペで終了。
エンコードのチェックのため、読むだけ読んで、全部書き出す処理を書く。
吐き出すクラスは、構造体使い構造どおりにCSVに吐くだけ。
file一個だから、try-catchでくくる。
上記が出来たので、解析部分にはいる。
構造体に、まず、全て取れなかったとしたら、を初期値としてセットする。
それぞれ、単純にIF文で、「取れたら」「取れたとして、複数合ったら」って分岐かける。
まず、署名の有り無しを見よう。署名は、大体、記号の羅列以降が書名になる。
署名以前は本文なので、切り捨てる。Regexという正規表現オブジェクトで、上
記がマッチしたINDEXを取って、それ以前を切りすてる。
その後の文字列は書名テキストになるので、テキトーな正規表現でも、誤認識率
が下がるはずだ。
メール、電話番号、携帯電話番号、URLを組み込む。

結果は428点
署名ありなし判定は88% これもすごい!



良く見ると3人とも別の言語ですね。各人得意な言語があるのか、問題に合わせて言語を選択したのか、気になります。
意外にも非常に盛り上がったので、ぜひ今後も続けていこうと思っています。
時間制限の中でしっかり点数とってくる上位の方は本当にすごい!です。
ただ今回上位者はプログラム10年ぐらいの熟練者ばかりでしたので、もっと若い方達に頑張ってほしい!!

さあ次回はどんなお題にしましょうか?
もし社外から参加したいという希望者の方がいらっしゃったらぜひ声かけてください!!
チームラボのイベントの実況などtwitterで行ってます。
twitter teamlab_tech