PythonでWordNetを利用して、テキストの特徴行列を単語ベース→概念ベースに変換する
目的
「RとRMeCabでテキストファイルをクラスタリングする」 では、各テキストから単語を抽出し、各単語の出現頻度を元に、各テキストの特徴ベクトルを生成した。このとき、例えば"愛"と"あい"という単語は同一のものとして扱われたが、"愛"と"恋"という単語はまったく別のものとして扱われた。この結果、テキスト間の距離が人間が感じる距離と異なる場合が出てきた。そこで、本稿では、同じ概念の単語をひとまとめにして特徴ベクトルを作成することで、概念レベルでのテキストのクラスタリングを目指す。
手法
クラスタリングの手順は以下のとおり。手順2以外については、以前の記事とほぼ同様なので、ここでは詳細は割愛する。
- Rで複数のテキストファイルからtf*idf行列を作成し、テキストファイルに出力する。
- tf*idf行列の書かれたテキストファイルを、PythonとWordNetを用いて変換し、テキストファイルに出力する。
- 再びRで修正されたtf*idf行列を読込み、クラスタリングを行う。
手順2では、単語ベースのtf*idf行列を、概念ベースのtf*idf行列に変換する。同じ概念の単語をひとまとめにするために、WordNetを用いる。WordNetとは、単語がその意味でグルーピングされ、それらグループの関係性が記述された、概念辞書である。日本語WordNetはver0.9が2009年に公開され、無償で使用、複写、改変、頒布することが許可されている。また、Perl, Python, Java, Ruby等のフロントエンドも用意されている。今回は、Pythonを用いてWordNetを扱う。(このせいで文字コードに大変苦労させられたわけだが…。)WordNetをPythonから使うには、Python2.6(Python3系は不可), sqlite3, WordNet-0.9が必要。
Pythonのスクリプトは以下のように書ける。
・wndriver.py: WordNetの自作ドライバ(WordNetのPythonAPIであるwn.pyを利用)
・convDocMatrix.py: 特徴行列を変換するメインモジュール
# prepare file
# write file
参考ページ
- 日本語WordNet
http://nlpwww.nict.go.jp/wn-ja/ - 日本語WordNetのdbの中身
http://sucrose.hatenablog.com/entry/20110204/p1 - 日本語WordNetのPythonフロントエンド
http://subtech.g.hatena.ne.jp/y_yanbe/20090314/p2 - Pythonの文字コードについて
http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html
http://d.hatena.ne.jp/atsuoishimoto/20110311/1299805971 - sqlite3
http://www.sqlite.org/