図書館資料の自動分類(初級編)

「主専攻に迷って生きるのが辛いklis2年生の選択肢は神に委ねられた...」

gist.github.com


この記事はklis advent calenderの12日目の記事です。 www.adventar.org

まずはこちらの記事をごらんください。
タイ性風俗本購入に「出エジプト記」を旅行記に分類、海老名のTSUTAYA図書館が酷すぎて「#海老名市図書館風に分類してみる」タグまで登場 | BUZZAP!(バザップ!)

つぎにこちらのツイートをごらんください。

どういう方法で分類したらこうなるのかよくわかりませんが、私は機械によって自動的に分類を行っているのでは?と考えました。
「とかげ」は比較的多くの日本人にとっては「文学作品」かもしれません。 しかし、「とかげ」という単語が最も多く出現するのは、動物学を擁するNDCの第一分類「4」であるだろうというのはなんとなく直感に則している気がします。

というわけで、このエントリーでは実際に図書館のデータを使って単語の出現頻度に基づく分類モデルを作ってみます。 作成したモデルを用いて書名から日本十進分類法の第一分類記号を予測してみることにします。

データ

まずはモデルを作るためのデータをどこかから集めてくる必要があります。国内で図書館APIといえば国立国会図書館のNDL APIが思い浮かぶかもしれません、しかし、今回は国立情報学研究所CiNii BooksのAPIを使います。(楽だった)

NDC10の第1分類(0から9まで)の各150,000件のデータを収集します。合計で1,500,000件のデータを取得することができました。

なお、このデータ収集を、皆さんが手元の環境で実行してみようと思ったとき、クロール先のサーバに負荷をかけていないか、よく確認してください。 このコードでは17行目と31行目でそれらしいことをしています。

gist.github.com

辞書の追加

次に、収集したデータを形態素ごとに分割します。例えば、IPAの辞書では、「社会学」という単語を「社会」「学」に分割してしまいます。
しかし、「社会学」は書名に出現した時は固有名詞な気がします。 というわけで固有名詞をmecabの辞書に追加します。
今回はwikipediaの見出語を用いてmecabの辞書を訓練することにします。

wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
gunzip jawiki-latest-all-titles-in-ns0.gz

レコード数

wc jawiki-latest-all-titles-in-ns0
1587088  1587086 35503019 jawiki-latest-all-titles-in-ns0

コンバータ gist.github.com

辞書のビルド

.localに自分でビルドしたmecabのとき

.local/libexec/mecab/mecab-dict-index \
-d .local/lib/mecab/dic/ipadic \      
-u .local/lib/mecab/dic/wiki.dic \
-f utf-8 -t utf-8 dic_wikipedia/wikidic.txt

homebrewでインストールしたmecabのとき

/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/Cellar/mecab-ipadic/2.7.0-20070801/lib/mecab/dic/ipadic \
-u /usr/local/Cellar/mecab-ipadic/2.7.0-20070801/lib/mecab/dic/ipadic/wiki.dic \
-f utf-8 -t utf-8 wikidic.txt

形態素解析する

書籍のタイトルを形態素ごとに分割しましょう

wakati.rb · GitHub

ここまでで、形態素がどの分類記号のもとにどれくらいの頻度で出現するかを示す行列が出来上がりました。
f:id:h1mkt:20151210010240p:plain

(出現した形態素の種類 x 10(NDCの第一分類の種類))の行列です。

予測する

それでは張り切って「とかげ」がどの分類になるか、実際に予測してみましょう。
f:id:h1mkt:20151210010528p:plain

やはり我々の予想通り、NDCの「4」に分類....されませんでした。
この分類器はきちんと「とかげ」を文学作品であると判定しました。優秀ですね。ぱちぱちぱち。
理由はちょっと考えるとわかります。

テストする

さて、この分類器はどれだけ汎化性能を持っているのでしょうか?
今回各分類ごとに15万件ずつのデータを収集したので、10万件ずつを訓練データ、5万件ずつをテストデータとして性能を評価してみます。

gist.github.com

f:id:h1mkt:20151210011329p:plain

正解: 187581
不正解: 312419
精度: 約38%

ランダムに予測するなら10%なので、タイトルは多少のヒントにはなるようです。

まとめ

やっつけ仕事感がありますが、形態素の出現頻度に基づいて資料のタイトルから日本十進分類における第一分類を予想してみました。
単純なモデルだと微妙な感じですね。

多クラス(one vs all)なロジスティック回帰モデルを作るともう少し精度が上がりそうなので、暇があったらやってみようと思います。