INFORMATION
テクノロジ
NLPツール開発にはLucene 4が超便利!
本稿は 2012/12/23 に soleami.comに投稿された記事の転載です。
Author: 関口宏司
先日、辞書型コーパスから類義語知識を自動獲得するシステムを開発しました。辞書型コーパスというのは、「見出し語」とその「説明」からなるエントリが多数集まったもので、平たくいえば辞書です。電子辞書や身近なところでは Wikipedia のデータも辞書型コーパスになります。他にも EC サイトにおける「商品名」と「商品説明」も辞書型コーパスとみなすことができます。
このシステムの詳しい説明は、SlideShare をご覧ください。
辞書型コーパスからの類義語知識の自動獲得
このシステムはもともと Lucene/SolrのSynonymFilter に使うための synonyms.txt を Wikipedia から自動的に生成したい、と考えて作成したものです。出力結果の CSV ファイルは Lucene/Solr の SynonymFilter で使えるのですが、実はこのシステム自身、その内部で Lucene 4.0 を使っています。
私は従来より NLPツール 開発には Lucene 4.0 が便利だろうと感じていて、今回それを実証してみて、あらためてその考えを強くしたところです。
以下、簡単に今回のシステム構築で使用した Lucene 4.0 のクラスを紹介しましょう。
IndexSearcher, TermQuery, TopDocs
このシステムでは見出し語とその説明から抽出した名詞で構成される類義語候補の類似度を計算します。そして類似度がある閾値より大きいときは、その候補が見出し語の類義語であると判定して CSV ファイルに出力します。 しかし、見出し語とその類義語候補の類似度はどうやったら計算できるでしょう。このシステムでは見出し語の説明文 Aa と、類義語候補を使って書かれた辞書エントリの説明文の集合 {Ab} の類似度を計算することで近似しています。 そこで {Ab} を求める必要があるわけですが、このとき IndexSearcher, TermQuery, TopDocs などのクラスを使って類義語候補で説明フィールドを検索し、{Ab} を求めています。
PriorityQueue
次に Aa と {Ab} の類似度を計算するのに、それぞれから「特徴語」をピックアップします。そのためにはそれぞれから重要度の大きい単語上位 N 個を選んで特徴ベクトルを構成します。ここで、重要度には当該単語の TF*IDF を使うこととします(詳しくは前述の SlideShare をご覧ください)。このとき、「重要度の大きい単語上位 N 個」を選ぶために PriorityQueue を使っています。
DocsEnum, TotalHitCountCollector
前述の特徴語を抽出する際に重みを TF*IDF で算出したわけですが、このうち TF を求めるのに DocsEnum.freq() を使っています。また、IDF を求めるのに必要なパラメータである docFreq (類義語候補を含む記事数)は、IndexSearcher の search() メソッドに TotalHitCountCollector を渡して求めています。
Terms, TermsEnum
類義語候補を見つけるために、「説明」フィールドの中をこれらのクラスを使って探索します。 以上は今回のシステムでの Lucene 4.0 の使用例ですが、これ以外にも Lucene は NLP ツールの開発現場において活躍すると考えています。たとえば、Bootstrap を用いた語彙知識獲得課題では、(1)パターン抽出、(2)パターン選択、(3)インスタンス抽出、(4)インスタンス選択、というサイクルを回すことで、少数シードの教師データから知識を獲得します。このような課題に Lucene を使えば、パターン抽出やインスタンス抽出を簡単な検索問題に置き換えることが可能ではないかと考えています。
INFORMATION
KandaSearch
KandaSearch はクラウド型企業向け検索エンジンサービスです。
オープンAPIでカスタマイズが自由にできます。
セミナー
企業が検索エンジンを選定する際のポイントから、
実際の導入デモをお客様ご自身でご体験!