前回は Python で文書の類似度判定を行うプログラムのアルゴリズムについて紹介しました。
今回の話は、前回の類似度判定を行うプログラムの使い方と、前回の記事のアルゴリズムを用いた文書の類似度検索を行うプログラムの設計と類似度判定プログラムの実装について紹介します。
また、作成したプログラムのコードは github [1] に上げました。
まずは使い方。github からコードをダウンロードして、以下のコマンドを叩きます (argparse を使っているので python2.7 以降じゃないと動かないです、あと形態素解析に “MeCab” [2] を使っているので、そっちもインストールしてください) 。
1 |
ohyama@ariel:~/Suneo$ python search_with_vsm.py -f SENTENCE_PATH |
コマンドライン引数の SENTENCE_PATH は、既知の文書のデータファイルのパスになります。ここで言っている “既知の文書” とは、プログラム起動後に受け付ける入力文書との比較対象になる文書群になります。このプログラムは、これら事前に用意した文書と、入力文書がどれだけ似通っているかを判定するプログラムです。
ファイルのフォーマットは、各行が比較対象となる一文書に対応します。なので、以下の要領で作成してください
[既知の文書のデータファイルの記述例]
1 2 3 |
本日は晴天なり明日はわからん 今日も窓から眺める富士山の景色がうつくしー ... |
まずは、アウトラインの構造とデータ構造について見て行きます。
このプログラムは以下のファイル構造になってます。
1 2 3 4 5 |
/Suneo |-- search_with_vsm.py |-- Sentence/ |-- sentence.py |-- word.py |
これを見てわかるように、クラス構造はとても単純です。Sentence ディレクトリ以下の 2 つのファイル (sentence.py, word.py) がクラス定義と実装で、search_with_vsm.py がその他の所々の処理を行う Suneo 本体のスクリプトファイルです。
次に Suneo のスクリプトファイルの処理について簡単に見てみます。
ますは初期化処理として、コマンドライン引数で指定したファイルの各行を読み込み、Sentence オブジェクトを作り、更に単語に分解して Validword オブジェクトを作り、それぞれに関連を持たせます。
そして、標準入力から受け取った文書を単語に分割し、各単語に対応する Validword オブジェクト群を取得し、分割した単語を含む Sentence オブジェクトの文書に対して、入力文書との比較処理を行います。
比較処理は、前回紹介したベクトル空間モデルにおける内積によって、類似度を算出する手法を使います。有効語は、面倒くさいので既存文書が含む全単語要素に設定しています。
これにより有効語数が N の時、有効語の出現頻度を特徴ベクトルとした N 次元ベクトルで各文書を表現できます。
あとは、既存の各文書と入力文書のベクトルの内積を取って、それぞれのベクトルの大きさの積で正規化してやれば、類似度を 0 から 1 までの実数で表現できます。
ただこれだけだと、一見して単なる単語一致検索と同じように見えてしまいます。有効語と既知の単語群の集合が同じなのは明らかに多すぎなので、有効語を何らかの基準で絞って次元削減するとそれっぽい結果になると思います。
更なる発展形としては、有効語の類義語も有効語にするとかすると、更にオモロい結果になると思いますが。気が向いたらやります。
[1] https://github.com/userlocalhost2000/Suneo
[2] http://mecab.sourceforge.net/
最近のコメント