青い鴉のブログ

光のプログラマーの青い鴉(ぶるくろ)が情報発信していくブログです。

【研究】Wikipediaをコーパスとした全自動テキスト分類【成果物】

 Wikipediaのオリジナル(XML形式で配布されている)をコーパスに用いて、なるべく簡単にテキスト自動分類を行う。この研究に技術的に真新しいことは何も出てこない。この研究の意義は再現性であり、追試性であり、実用性である。実装コストの低さである。

 まずWikipediaXML)をテキストファイルに落とし込む。この際、ブラケットに囲まれたリンク情報を除く装飾情報および添付ファイルは削除しておく。

 次にWikipediaの約100件のカテゴリに対応する起点ページからリンクを2回まで辿ることで、そのカテゴリに属するページの集合(クラスタ)を取り出す。このページ集合を元に、インデックスを作り、ページを形態素解析エンジンMeCab分かち書きする。

 そして、前述の処理で作られたインデックスと分かち書きされたファイルを元に、ナイーブベイズアルゴリズム(Algorithm::NaiveBayes)によって各記事のカテゴリを学習し、記録する。

 結果として、引数で与えたテキストは自動的にカテゴリに分類される。そこに人手は介在しておらず、それゆえにこのシステムはWikipediaコーパスに基づくテキスト自動分類システムとして位置付けられるであろう。

(以下略)

 

 20130120_bayes08.zip (11KB)

 

更新履歴

2013/01/20

  -c オプションでbayes.dbファイルを削除、再作成するように変更

  -b オプションでカテゴリファイルを指定可能に変更

 

【研究】Wikipediaをコーパスとした全自動テキスト分類

 表題の研究を新年早々行っていたが、一定の成果が出た。

 言語としてはPerlを用い、Wikipediaマイニングを行い、ナイーブベイズで分類する。

1.WikipediaXML)の全ページの切り出し
2.分類の設定(Wikipediaの代表的100カテゴリを基にする)
3.ページから2回のリンクで辿れるページ(クラスタ)の取得
4.形態素解析エンジンMeCabによる分かち書き
5.ナイーブベイズ・アルゴリズムによる学習
6.対象となるテキストの分類

 ここまでを恣意性無しに行うことを目標とし、mixi日記を分類するというタスクにおいて、一定の成果を残した。
 これ単体では論文にはならないだろうが、個人の自由研究でもここまでやれるというマイルストーンになるであろう。

【Softalk(ソフトーク)用】スーパーゆっくり【チート辞書】

Softalk(ゆっくりボイス)支援辞書
チート辞書「スーパーゆっくり ver.20130210」ゆっくりを賢くする辞書です

 ソフトークに付属する辞書は貧弱で、そのままだと小中学校で習うような二字熟語や四字熟語、麻雀用語などを正確に読み上げてくれません。

 そのためソフトークを読書や、文章の校正などに使う場合、読み間違いが気になってイライラします。このイライラを解消するのがこの辞書です。

 また実況動画の製作などでは、わざわざひらがなに変換して打ち込む必要があり、膨大な手間がかかり、ミスも発生しがちです。

http://www.arkhamsoft.jp/

 上記辞書を導入することで、この問題を改善することができます。
 ぜひ使ってみた感想などをお聞かせください。

2013/02/10 最終更新

JunkUtil開発の経緯について

自分の長年のJavaプログラミングで多くの障害になってきたのは、とにもかくにもライブラリの不足であった。PerlPHPなら、そこにあって当然のクラスが、メソッドが、全く用意されていないという問題であった。

通称Commons(旧Jakarta Commons、現Apache Commons)の登場で、その状況は好転に向かったかに思えたが、俺の視点から見れば、それは五十歩百歩であった。ほとんどのライブラリはベータバージョンで開発が停止しており、ドキュメントの量と和訳は不十分であり、それらの詳しい使い方を包括的に解説したサイトは一向に現れなかった。
結局、その都度英語を読み、ライブラリの使い方に習熟せねばならないというのが、それが嫌なら、車輪の再発明(無駄な努力)をせねばならないというのが、Javaプログラマの悲しい現実であった。

俺には、JavaでCatを実装するのに、Grepを実装するのに、なぜあれほどぐちゃぐちゃしたコードが必要とされるのかが分からなかった。OOPLであるということは、煩雑さを許容するということなのだろうか。俺は「それは違う」と思う。少なくとも、Javaプログラマgrepもどきを以下のようにシンプルに書くことが許されて然るべきだ。

List lines = FileUtil.readLines("readFile.txt"); //行の全読み込み
DataDumper.dumpList(System.out, new LzList(lines).grep("^B").list()); //Bで始まる行のダンプ

(これは一見無意味なプログラムだが、巨大なバッチファイルの一部だけを取り出して処理するためには、どうせこれと似たような処理が必要になる)

そうして、数年の月日が流れた。若かった俺は、世界(にいるであろう自分より優秀な人間)を信じて待った。きっとどこかの誰かが、俺の満足のいく完璧なライブラリを公開するだろうと。
実際、Apache CommonsやGoogleはそういう種類のライブラリを公開したかもしれない。しかしそれはやはり根本的に不完全で、俺が思っていた「簡単さ」を実現するものではなかった。上記のようなコードを書くことはできなかった。特にListとMapについては、まともな実装は皆無に近かった。

ファイルを一気読みしてListに格納するメソッドは現れなかった。
PerlのOptGetsのJava版は現れなかった。
PerlのConfigのJava版は現れなかった。
PerlのData::DumperのJava版は現れなかった。
ListやMapを集合論的に処理するライブラリは(それはサーブレットのパラメータを処理するための基礎となる)現れなかった。
俺の欲しいものは、結局誰も与えてくれなかった。

もう一度言おう。PerlのモジュールやPHPの関数のような、あるいはワンライナのような、それを呼べばたちまち仕事が終わる類のライブラリは、Javaには存在しない。
それはJavaJavaらしくあるために必要なことだったが、現実にコードを書くプログラマの観点から見れば、単なる悪夢でしかなく。スクリプト言語の簡単さは常に羨望の的であった。

Javaはそれでも使われ、書かれた。ServletJSPは、あるいはXMLは、Strutsという巨大で不気味なフレームワークと拡張タグに支配され、本来は不要であるはずのぐちゃぐちゃしたコードと記述で荒廃していた。
GUIアプリケーションはJFrameにメニューとショートカット・キーをつけるのもままならず、画面にはボタンが溢れていた。業務アプリでは未だにCSVの読み込みとExcelの出力(素のPOIは使いづらい)に苦労していた。

業務アプリの世界では、JavaCOBOLの置き換えに使われた。無数のバッチが書かれ、無数のWEB帳票が書かれた。デファクトスタンダード。しかしだからどうだというのだろう。Javaは依然として小回りの利かない言語であり続けた。俺は苛立った。

統失という病気になり、俺は仕事のかわりに時間を手に入れた。労働はもはや難しかった。俺は膨大な余暇を、何かで埋め合わせなければならなかった。その時間を、オープンソースに割くことは妥当なことに思われた。なぜなら、相応に年を取った俺は、世界を信じて待つことの無意味さを理解していたからである。
俺はまずなによりも、自分のために、Javaを「簡単にする」ためのコードを書くことにした。

オーケー。分かっている。JunkUtil(ジャンク・ユーティリティ)は始まったばかりのプロジェクトだ。まだ機能は洗練されておらず、まだきっと多くのクラスとメソッドを追加する余地がある。俺の掲げる理想には程遠く、未来の行先は不透明だ。

だがこのプロジェクトは既に開始された。もう後戻りはできない。その名の通りJunk(ゴミ屑)と呼ばれても、車輪の再発明と呼ばれても、かまわない。俺はJavaを少しでも「簡単」にするために、その膨大な時間を投資しようと決めたのだ。

http://sourceforge.jp/projects/junkutil/

【Java】JunkUtil【汎用ライブラリ】

地元で就職できなくて暇なので、JunkUtilというプロジェクトを始めました。

http://www.arkhamsoft.jp/junkutil/

現状、以下が主なクラスです。

junkutil.common

 StringUtil……標準のStringクラスに不足している機能の補完
 FileUtil……ファイルの内容をListやStringで取得、書き出し
 NullUtil……各種nvl関数
 OptGets……引数の解析(バッチプログラムを作る際に効果的)
 DataDumper……なんでも見やすくダンプ表示(デバッグに効果的)
 Config……Iniファイルの読み込み(自動エンコード判別機能つき)

junkutil.set

 LzList、LzMap……orやand、setやmargeなど、パワフルな操作が可能に

junkutil.excel

 CSV……MS-CSV、TSVを解析
 ExcelUtil……Excelの読み書き

junkutil.gui

 LzLookAndFeel……外観を簡単に変えられるクラス
 LzMenu……メニューとアクションを手軽に関連付けできるようにしたクラス
 LzCallBack……LzMenuと共に使えるコールバック
 LzFrame, LzDialog……Escキーでのクローズに対応したクラス

Wikipediaシステム辞書 ver.20110822

 最新のIMEMS Office IME 2010で辞書が使えないという御指摘を受け、辞書をビルドし直しました。
 現在、Wikipediaシステム辞書は、「MS Office IME 2007」および「MS Office IME 2010」に対応しております。
 生成スクリプトも公開しておりますので、ぜひATOKやGoogleIME用の辞書の作成などにお役立てください。

http://www.arkhamsoft.jp/

追記:アクセス解析を導入してみました。

Wikipediaシステム辞書 ver.20110817

 Wikipediaシステム辞書をリビルドしました。今回は日本語でないタイトルを省いて、誤変換を減らすことに注力しております。

 日本語でないタイトルは、タイトルと読み仮名が合っていない事が多く、また多くの場合実用にならないことが多いので、非日本語のページを除外して変換精度を上げるべく改良しております。

 ぜひ使ってみた感想などをお聞かせください。

http://www.arkhamsoft.jp/