Luceneインデックス
の共起単語分析と
Solrによる共起単語
サジェスチョン
関口宏司@ロンウイット
共起単語の分析と検索
• 分析
 – Luceneインデックス I を分析し、ある単語と共起する単語を探して別のイン
   デックス I* に登録
 – term position vectorを用いる

• 検索(サジェスチョン)
 – Luceneインデックス I にてある単語 t が検索されたとき、I* を t で検索して
   t と共起する単語一覧を返す
 – SolrのSearchComponentとして実装




                               Copyright (c) 2013 RONDHUIT   2
アーキテクチャ                                                                 /update?
                                                                         index=分析対象インデックス I のパス

                                    search("TPP")
         SearchComponent                            共起分析対象
                                                    インデックス I

                                                                          CooccurMakerRequestHandler
/cooccur?build=true                                                                              共起分析結果登録
/cooccur?reload=true
                        QueryComponent                                                      (内)
                                                                        (外)
/cooccur?q=TPP                                               共起分析
                                                                             findCoincidental
      CooccurSuggesterComponent                                              Terms


                            build, reload
    register
                                                       CooccurFinder                              共起分析結果
                                                       共起分析を行う                                    インデックス I*
                       getSuggestions("TPP")
                                                                    findCoincidental       (外)
                                                                    Terms
                                                             (内)        共起分析結果登録
                                                                                                (外)
         CooccurSuggesterListener
                                                                                         共起単語検索
                                                    CooccurIndexManager                  (サジェスチョン)
 newSearcher                                        Solr内部インデックスを分析、
     イベント                                           結果を外部インデックスに登録。
                                build, reload       登録した外部インデックスから共起単語を検索


                                                        Copyright (c) 2013 RONDHUIT                           3
アルゴリズム(CooccurFinder)
                             ① 調査対象フィールドの
                             すべての単語を調べるループ
      調査対象フィールドの辞書                ② 当該単語を含むdocIdを
  ①
      東京        1, 2, 5, …        順に調べるループ

      大阪        1, 3, 4, …                ③ 当該docIdについての                     ④ 当該単語「東京」をサーチ
                                            term position vector(TPV)を取得
      神奈川       4, 5, 7, …
                                     String[]     江東区        足立区     北区      北砂    東京
      千葉
                                         ⑥
      埼玉
                                     当該単語「東京」以外の単語の位置が、                    ⑤ BitSetを用意し、当該単語「東京」の位置を
      :                              ⑤で保存しておいた位置と近い場合                       TPVから調べた結果のビットを立てる
                                     (slop以内)は「共起」している
            ②                        としてインデックスに保存
                                                                             0 1 1 0 0 ・・・    1
TermsEnum       DocsEnum
                                         「東京」と共起する「江東区」のスコアは、次のように算出され、
                                         インデックス時ブースト値として記録される
                                            東京             江東区
                                            a        c       b

  性能のための最適化
  •①のループでは、docFreq/numDocsが0.02〜10%(デフォルト)の単語のみ処理を行う(例:1万件のインデックスで、docFreqが2件から100件まで)
  •②のループでは、maxDocsToAnalyzeまで(デフォルト1000)で打ち切る(最後の方のドキュメントが調査されない)
  •⑤のBitSetは長さMAX_TERMS_PER_DOC(デフォルト1万)までしか用意しない
  •すべての単語について、ストップワードの調査を行い、登録されているストップワードの場合は処理をスキップする
                                                Copyright (c) 2013 RONDHUIT          4
CooccurSuggesterComponent


           http://localhost:8983/solr/cooccur/cooccur?q=地震&rows=0




                                         livedoorニュースコーパスでの例
                      Copyright (c) 2013 RONDHUIT              5
コーパスによる共起単語の違い
            独女通信            スポーツウォッチ                       トピックニュース
仕事     風土,右手,ミオ,徴兵,エリナ,    ブルドーザー,ナゴヤドー セキュリティー,祝日,雑
       温厚,デコーレーションケー       ム,すれ違い,城島,ローサ, 用,ゴシップ,試食,接待,土
       キ,東南アジア,雑談,凶悪       道場,シニア,修行,ディレク 日,仕事場,土木,両立
                           ター,転職
韓国     緊迫,リメイク,リトル,シフト チュヨン,SBS,東亜,IOC,                   起源,ハンギョレ,万歳,セ
       チェンジ,徴兵,歯並び,上陸, 日報,地団駄,チェ,ガン                       レッソ大阪,ポッ
       キリスト,教徒,美男      ヒ,UAE,TV                           プ,DKBnews,戦犯,捕鯨,
                                                          本籍,さりげ
サッカー   リーグ,カクカクシカジカ,駅      キリンカップ,グローバル,                  キリンチャレンジカップ
       伝,種目,JFL,スポーツバー,F   プロサッカーリーグ,アス                   サッカー,チャレンジ,キ
       IFA,ワールドカップ,観戦,     リートファン,復権,傑作,船                 リン,ワールドカップ,自
       連盟                  越,集計,明彦,健生                     負,ガボン,セネガル,イデ
                                                          イリー,聖地,英寿




                                               livedoorニュースコーパスでの例
                            Copyright (c) 2013 RONDHUIT                  6
参考文献
• High Frequency Terms/Phrases at the Index Level, Suri Babu B,
  https://issues.apache.org/jira/browse/LUCENE-474
• livedoorニュースコーパス,
  http://www.rondhuit.com/download.html#ldcc




                                 Copyright (c) 2013 RONDHUIT      7

Luceneインデックスの共起単語分析とSolrによる共起単語サジェスチョン

  • 1.
  • 2.
    共起単語の分析と検索 • 分析 –Luceneインデックス I を分析し、ある単語と共起する単語を探して別のイン デックス I* に登録 – term position vectorを用いる • 検索(サジェスチョン) – Luceneインデックス I にてある単語 t が検索されたとき、I* を t で検索して t と共起する単語一覧を返す – SolrのSearchComponentとして実装 Copyright (c) 2013 RONDHUIT 2
  • 3.
    アーキテクチャ /update? index=分析対象インデックス I のパス search("TPP") SearchComponent 共起分析対象 インデックス I CooccurMakerRequestHandler /cooccur?build=true 共起分析結果登録 /cooccur?reload=true QueryComponent (内) (外) /cooccur?q=TPP 共起分析 findCoincidental CooccurSuggesterComponent Terms build, reload register CooccurFinder 共起分析結果 共起分析を行う インデックス I* getSuggestions("TPP") findCoincidental (外) Terms (内) 共起分析結果登録 (外) CooccurSuggesterListener 共起単語検索 CooccurIndexManager (サジェスチョン) newSearcher Solr内部インデックスを分析、 イベント 結果を外部インデックスに登録。 build, reload 登録した外部インデックスから共起単語を検索 Copyright (c) 2013 RONDHUIT 3
  • 4.
    アルゴリズム(CooccurFinder) ① 調査対象フィールドの すべての単語を調べるループ 調査対象フィールドの辞書 ② 当該単語を含むdocIdを ① 東京 1, 2, 5, … 順に調べるループ 大阪 1, 3, 4, … ③ 当該docIdについての ④ 当該単語「東京」をサーチ term position vector(TPV)を取得 神奈川 4, 5, 7, … String[] 江東区 足立区 北区 北砂 東京 千葉 ⑥ 埼玉 当該単語「東京」以外の単語の位置が、 ⑤ BitSetを用意し、当該単語「東京」の位置を : ⑤で保存しておいた位置と近い場合 TPVから調べた結果のビットを立てる (slop以内)は「共起」している ② としてインデックスに保存 0 1 1 0 0 ・・・ 1 TermsEnum DocsEnum 「東京」と共起する「江東区」のスコアは、次のように算出され、 インデックス時ブースト値として記録される 東京 江東区 a c b 性能のための最適化 •①のループでは、docFreq/numDocsが0.02〜10%(デフォルト)の単語のみ処理を行う(例:1万件のインデックスで、docFreqが2件から100件まで) •②のループでは、maxDocsToAnalyzeまで(デフォルト1000)で打ち切る(最後の方のドキュメントが調査されない) •⑤のBitSetは長さMAX_TERMS_PER_DOC(デフォルト1万)までしか用意しない •すべての単語について、ストップワードの調査を行い、登録されているストップワードの場合は処理をスキップする Copyright (c) 2013 RONDHUIT 4
  • 5.
    CooccurSuggesterComponent http://localhost:8983/solr/cooccur/cooccur?q=地震&rows=0 livedoorニュースコーパスでの例 Copyright (c) 2013 RONDHUIT 5
  • 6.
    コーパスによる共起単語の違い 独女通信 スポーツウォッチ トピックニュース 仕事 風土,右手,ミオ,徴兵,エリナ, ブルドーザー,ナゴヤドー セキュリティー,祝日,雑 温厚,デコーレーションケー ム,すれ違い,城島,ローサ, 用,ゴシップ,試食,接待,土 キ,東南アジア,雑談,凶悪 道場,シニア,修行,ディレク 日,仕事場,土木,両立 ター,転職 韓国 緊迫,リメイク,リトル,シフト チュヨン,SBS,東亜,IOC, 起源,ハンギョレ,万歳,セ チェンジ,徴兵,歯並び,上陸, 日報,地団駄,チェ,ガン レッソ大阪,ポッ キリスト,教徒,美男 ヒ,UAE,TV プ,DKBnews,戦犯,捕鯨, 本籍,さりげ サッカー リーグ,カクカクシカジカ,駅 キリンカップ,グローバル, キリンチャレンジカップ 伝,種目,JFL,スポーツバー,F プロサッカーリーグ,アス サッカー,チャレンジ,キ IFA,ワールドカップ,観戦, リートファン,復権,傑作,船 リン,ワールドカップ,自 連盟 越,集計,明彦,健生 負,ガボン,セネガル,イデ イリー,聖地,英寿 livedoorニュースコーパスでの例 Copyright (c) 2013 RONDHUIT 6
  • 7.
    参考文献 • High FrequencyTerms/Phrases at the Index Level, Suri Babu B, https://issues.apache.org/jira/browse/LUCENE-474 • livedoorニュースコーパス, http://www.rondhuit.com/download.html#ldcc Copyright (c) 2013 RONDHUIT 7