【論文紹介】 Identifying Relations for Open Information Extraction (Open IEツール Reverbの原著論文)

Reverbの原著論文を読んだので軽くまとめます。

こちらから読めます。

https://homes.cs.washington.edu/~soderlan/Fader-emnlp11.pdf

 

●入出力

文書を入力として、関係インスタンスと関係パタンの3つ組で出力。なおその3つ組の信頼度も同時に出力する。

 

例) I eat an apple. → (I, eat, an apple), 信頼度

 

関係インスタンスっていうのは、意味的関係のある名詞対のことで、上の例だと、Iとan apple.

関係パタンっていうのは、関係インスタンスがどのような関係なのかを表す動詞もしくは動詞句のこと。上の例だと、eatが該当する。

 

●既存研究の問題点

上述したトリプルで抽出するツールとして、TEXTRUNNERやWOEが有名。

しかしながら、これらのシステムには2つのエラーが頻出する。

・頻出エラー1:意味不明な関係パタンの抽出

例) The guide contains dead links and omits sites.

  →関係パタン:contains omits

 

・頻出エラー2:重要な情報を省いた抽出

例) Faust made a deal with the devil.

       →(Faust, made, a deal)

 

●提案アプローチ(上述した問題点への改善策)

・改善策1:構文的制約の導入

→抽出する関係パタンに構文的な制約をかける。

例)動詞で始まり、前置詞で終わる...とか

 

しかしながら改善策1では、あまりに特徴的な関係パタンを抽出してしまう。

(関係パタンとしては長すぎて使い物にならない)

そこで、抽出する関係パタンについて辞書を作成する。(改善策2)

 

・改善策2:語彙的制約の導入

→抽出する関係パタンについての辞書を作成。

500millionの文について、20回以上関係パタンとして出現しているものを辞書に加える処置を施す。

 

●信頼度計算

ラベル付き1,000文についてロジスティック回帰を学習。

各特徴量に重み付けをして信頼度を計算する。

 

 

●感想

情報抽出分野について詳しくなかったから最初読んだ時は意味がわからなかったけれど、理解してみれば簡単。

エラー分析をして頻出エラーへの対策をしたという研究で、流れがとても参考になる。

 

実際に使ってみたところ、中々よさ気な抽出ができている。

日本語ではこのような抽出ツールが存在しないので、誰か作ってくれないかな。

 

 

libSVMのパラメータ調整について

昨日からSVMlibSVMを使って動かしている。

で、どうやら重要なのがパラメータ調整。

色々と考える必要があるみたい。

主に以下の3つ。

 

●素性のスケーリング

大きい値が支配的にならないように。

値の正規化みたいなもの。

libsvmではコマンド一発でスケーリングしてくれる。

 

svm-scale -l 0 -u 1 -s scale_data feature1 > feature1.scale

 

カーネル関数

思考停止でRBFカーネルを使えばいいっぽい。

ただし、データ数<<特徴量の場合は線形カーネルのほうがうまくいく。

 

●cパラメータ、γパラメータ

cパラメータ:誤り時のペナルティのパラメータ

γパラメータ: RBFで用いるパラメータ

 

 

どうやらeasy.pyを使えば、スケーリング、パラメータ調整などをやってくれる様子。

とりあえず何かしらのデータセットについて試してみたい。

 

 

参考サイト様

qiita.com

 

d.hatena.ne.jp

PythonでSVM (LIBSVM)

PythonSVMを使ったのでメモ。

 

ここのサイトが一番参考になった。

gasser.blog114.fc2.com

 

環境はWindows7

まずは公式サイトからzipファイルをダウンロード。

 

www.csie.ntu.edu.tw

 

 

解凍して、一番上のサイトにあるサンプルプログラムを動かしたら動いた。

makeコマンドが必要とのことだが、特に必要なく動いた。(Windowsだから?)

 

Reverb、LDA、SVMと様々なツールを動かしてきたが、環境構築もそろそろ最終段階にきた。

必要なツールは揃ったので、あとは実装するのみ。

MALLETでトピックモデリング(LDA)

ここ最近、LDA関連のツールを動かしていたのでメモ。

使ったのはgensimとMALLET。

 

まずはgensimから。

ストップワードや記号の除去などを全部自分でやらなければならない。

最初は、ストップワード処理をしていなかったため、語彙数が膨大になり、メモリエラーをはくという事態。

 

ストップワード、記号除去の処理などをしたら動いた。

しかしながら、トピック-単語の分布を見ても結果は納得できない。

数字が除去できていなかったためなのかもしれないが。

 

で、LDAを使う際に欲しいのは、文書-トピック行列もしくは、トピック-単語行列であると思う。

その2つの行列の取得方法は公式のチュートリアルを見てもらえると簡単にわかると思う。

radimrehurek.com

 

 

次にMALLET。

これの便利なところは、文書に対してストップワード処理を簡単にしてくれるところ。

そして何より早い。すごく早い。

 

しかしながら、公式のドキュメントを見てもトピック-単語行列の取得方法がいまいちわからないところが難点。

Topic Modeling

 

色々調べたら、

--word-topic-counts-file

というコマンドで単語-トピックのカウントファイルが出力されるとのこと。

 

つまり、このファイルを編集すれば、トピック単語行列も取得可能な模様。

 

コマンドラインの操作も簡単で以下の2つのコマンドを打つだけでok

 

●文書をmallet形式のファイルに変換

bin/mallet import-dir --input /data/topic-input --output topic-input.mallet --keep-sequence --remove-stopwords

 

●mallet形式のファイルに対してLDAを適用

bin/mallet train-topics --input topic-input.mallet --num-topics 200 --output-state topic-state.gz --optimize-interval 10 --output-model topic.model --output-doc-topics doc-topics --output-topic-keys topic-keys --word-topic-counts-file word-topics.txt

 

doc-topicsファイルに文書トピック行列が

word-topicsファイルに各単語が各トピックに何回出現したかのデータが出力される。

 

 

結果も良好で例えば、あるトピックには

car autos rec cars engine ford speed drive miles driving article auto tires tech power honda mph mustang toyota 

のような車関係の語が集まったりしている。

 

とりあえずLDAを使ってみたい人にはMALLETを勧める。

 

【追記】

公式には書かれていないが、--topic-word-weights-fileを指定すれば、トピック単語行列の出力も可能な模様。

これでMALLETでLDAを使う際の懸念がなくなった。

 

 

やりたいことがおすぎる

MALLETを用いてLDAの結果。

トピック単語行列の取得方法が分からず、断念。

 

もう一度、gensimのLDAに立ち返る。

チュートリアルを見てみると、Wikipediaコーパス(8GB)で出来るみたいなことが書いてあった。

それなら、20Newsgroupsで出来ないわけがないと思い、メモリエラーの原因を分析。

 

結果、語彙数が多すぎるということが判明した。

1回しか出ない単語を削るなどして、実装。

メモリエラーが出ないことを祈る。

 

 

そして、やりたいことが多すぎて、何から手をつけたら良いかわからなくなったので、思考の整理を兼ねてここに吐き出します。

 

●メインの研究

Document Enrichmentに惹かれているので、まずは既存を実装する。

LDA、Reverb、SVMなどなどだんだん使えるようになってきたからもう少しで既存を実装できそう・・・?

 

 

●Chainer

ディープ系を組んで動かしてみたい欲求が強いので、やりたい。

中々時間がとれない。

 

 

●お勉強

会議論文

入門自然言語処理

機械学習

英語

 

 

とりあえずメインの研究にリソースを割きつつも、時間を見つけてやっていくしかない。

7:2:1くらいでやっていこう。

MALLETでLDAやってみた

前回、gensimでLDAをやろうとしましたが、メモリエラーをはいたので、

MALLETでLDAをやってみました。

備忘録に。

 

基本的には公式のチュートリアルを読めばできる。

Topic Modeling

 

今回は、20_Newsgroupsのmisc.forsaleの文章を入力として使用。

以下からダウンロード可能。

Home Page for 20 Newsgroups Data Set

 

 

まずは、MALLETをダウンロード。

WIndowsでもubuntuでも動作を確認した。

Downloading MALLET

 

次に、上で用意した文章をMALLET形式に変換。

bin/mallet import-dir --input /data/topic-input --output topic
-input.mallet --keep-sequence --remove-stopwords

 

最後にMALLET形式に直した文章でトピックモデルを構築。

bin/mallet train-topics --input topic-input.mallet --num-topics 100 --output-state topic-state.gz


簡単。


ちなみに、ModelOutputの形式には色々とある。
--output-doc-topics [FILENAME]

を指定した場合の出力は、文書トピック行列。
以下の形で出力される。

Path/misc.forsale/70337 17 0.20703125 84 0.05859375 22 0.05078125 90 0.03515625 77 0.02734375 63 0.02734375 57 0.02734375 29 0.02734375 95 0.01953125 68 0.01953125 62 0.01953125 .......

おそらく、misc.forsaleの70337文書は、17番目のトピックを0.207含んで...のような形。



しかし、トピック単語行列の出力はデフォルトでは生成できない?
LDAって結局は文書単語行列とトピック数を入力として、
文書トピック行列とトピック単語行列を出力するって認識だったのだけど
違うのだろうか。



もう少し頑張る。


gensimを用いたLDA

gensimでLDAを実装。

以下のサイトを参考に実装した。

 

openbook4.me

 

基本的には上記のサイトのコードを切り貼りしただけ。

 

これからコードを読む作業。