NLPツール開発にはLucene 4が超便利!

23/10/2012

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を使えば、パターン抽出やインスタンス抽出を簡単な検索問題に置き換えることが可能ではないかと考えています。

» Pagetop