自然言語処理カイ二乗値を用いた特徴選択(2010/6/25)の続きです。Newsgroupsというデータは英語文書でかつ元ネタがよく分からずあまり面白くなかったので、今回はこのブログ(人工知能に関する断想録)の記事を分類してみます。このブログの各記事には私の判断でカテゴリをつけています。この記事は[機械学習][自然言語処理]です。カテゴリのリストはこのブログの左メニューにあります。この前、少し整理したので全部で18のカテゴリがあります。新しい記事を書いたとき自動でカテゴリを割り振ることはできるのでしょうか?(注)プログラミング言語はPythonを使っています。シリーズもので以前作ったコードを再利用してるので検索で飛んできた人はナイーブベイズを用いたテキスト分類(2010/6/13)から順に読んでください。はてなダイアリーデータのダウンロードと整形まず、はてなダイアリーのデータを全部ダウンロードしてみます。Type形式からダウンロードできます。Type形式が一番整形しやすそうでした。私のブログ(人工知能に関する断想録)のエクスポートデータはaidiary.txtです。長年に渡って書きためてきた感じがしますが、たった3.6MB程度とはちょっとショックかも。このファイルをナイーブベイズの入力ファイル形式に変換します。下のような形式のファイルです。Pythonを用いるエントリごとに単語の出現頻度をカウントするエントリごとにカテゴリと単語:カウントをファイルに出力する単語はカウントの降順でソートする参考までに変換プログラムを掲載します。この変換プログラムをaidiary.txtと同じフォルダでプログラムを実行するとblog.txtという変換されたファイルができます。Pythonの導入が必要です。Python形態素解析にはMeCabのインストールが必要です。MeCabは高性能な形態素解析モジュールでPython、Ruby、Perl、Javaなどさまざまな言語から使えます。コードの修正が必要でかなり面倒くさい。そこで、Pythonモジュールはid:fgshunさんがコンパイルしたバイナリを使わせてもらいました。野良ビルドからダウンロードしたlibmecab-1.dll、MeCab.py、_MeCab.pydをパッケージフォルダ(Python2.5ならC:\Python25\Lib\site-packages)にコピー。IPA辞書はmecab-0.98.exeでインストールしたので不要。Files\MeCab\etc\mecabrcを読みにいくようなのでmecab-0.98.exeでIPA辞書をインストールしたほうが簡単だと思います。下のサンプルプログラムが動くか確かめてみます。word実行すると名詞のみが抽出されて出力されます。解析MeCab上プログラム事前インストール必要MeCabはまた使いそうなのであとでまとめとこうかな。形態素解析にはMeCabではなく、Yahoo!形態素解析API(2009/4/15)を用いてもよいと思います。Yahoo!はMeCabより固有表現の抽出精度が高いように思います。カテゴリ分布では、話はナイーブベイズに戻ります。カテゴリごとに各記事がどれくらいあるか統計を取ってみました。記事に複数のカテゴリがある場合は第一カテゴリのみ使っています。カテゴリ分布は下のようになりました。Newsgroups(2010/6/18)と違ってかなりばらつきがあります。一般的にカテゴリ間のばらつきが大きいと精度が低下することが知られています。次に各カテゴリで相互情報量(2010/6/19)が高い上位10個の単語を抽出してみます。地味だけどけっこうすごいぞ。Validation)最後にナイーブベイズの分類精度を評価してみます。Newsgroupsは文書数が20000件と多かったので訓練データとテストデータを完全に分けてから分類精度を評価しました。ブログ記事は全部で760件しかないので独立したテストデータを用意するのは少しもったいないです。Validation)という評価法を使ってみます。N-foldの代わりにK-foldを使うことが多いようですが、すでにボキャブラリの数で文字Kを使ってしまったので代わりにNを使いました。Validationは全データを均等にN分割し、その中から1個をテストデータとし、残りのN-1個を訓練データとする評価法です。テストデータの選び方はN通りあるためN通りの訓練データとテストデータのそれぞれで分類精度を求め、最後に平均を取って最終精度とすることが多いです。ちなみに分割数Nをデータ数と同じにした場合はLeave-one-outと呼びます。Validationのコードです。(Python)のコードを参考にしました。剰余を使ってデータを分けるのはけっこううまいやり方だなぁ。下のコードを動かすには相互情報量を用いた特徴選択(2010/6/19)で作ったナイーブベイズ(naivebayes_fs.py)と特徴選択(feature_selection.py)が必要です。ボキャブラリの数は適当に1000としました(相互情報量が高い順に1000語を使います)。Newsgroupsは80%だったので少し落ちますけど思っていたより高いなぁ。まとめ今回は、日本語のブログ記事のデータをナイーブベイズで分類してみました。実データらしくデータ数の偏りが大きかったですがそこそこな分類精度が出ました。今回はボキャブラリ数とか抽出する形態素の品詞選択とかかなり適当なので本来ならもっとちゃんとした検証が必要です。言いながら、次回はPRMLで学んだ(2010/5/3)サポートベクトルマシン(SVM)を使ってブログ記事を分類してみます。SVMはテキスト分類で高精度を叩き出すことで有名な手法です。どれくらい精度が上がるか楽しみだなぁ。Pythonを使う(2010/11/21)のつづきです。Pythonを使う日本語の文章を単語に分割するには形態素解析を使います。用いた特徴選択(2010/6/19)のつづきです。Newsgroupsで分類精度を評価(2010/6/18)のつづきです。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。