Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
類義語検索と類義語ハイライト 
2014/12 
shinichiro@apache.org 
1
About me 
• 株式会社ロンウイット 
• Apache Solr & Apache ManifoldCF トレーニング&コンサルティング 
&サポート 
• [改訂新版] Apache Solr入門第6章「データのクローリング」担当 ...
アジェンダ 
• 日本語全文検索の検索設定・ハイライト設定例 
• 類義語の検索とハイライト 
– 類義語 
• 類義語,同義語,類語,同意語,シノニム,類似語 
• 記事:類義語検索と類義語ハイライト 
– http://www.rondhu...
日本語全文検索の検索設定例 
• 1)検索漏れの対応 
– edismaxによる形態素解析フィールドとN-gramフィールドの横断検索 
q=単語&defType=edismax&qf=title_ja^4 content_ja^3 title...
日本語全文検索の検索設定例 
• 2)検索ゴミの対応 
– qfパラメータでN-gramフィールドの重みを下げる 
– システム出力(ゴミ)を減らす 
• autoGeneratePhraseQueries(デフォルトfalse->true) ...
日本語全文検索のハイライト設定例 
• ハイライタ 
– storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス 
コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ 
トを使って、マッチした単語...
日本語全文検索のハイライト設定例 
• デフォルトハイライタ 
– N-gramフィールドのハイライトがうまくいかない(LUCENE-1489) 
– 例: 
• 2-gramフィールドにインデクシング:「Aを指定し、Bを指定し、Cを指定する」...
日本語全文検索のハイライト設定例 
• PostingsSolrHighlighter 
– FVHより速い。インデックスサイズも小さくできる 
• インデクシング時に保存したオフセットを使ってハイライト 
– ただしフレーズ単位のハイライティ...
検索とハイライトの設定まとめ、それから類義語対応 
• 検索とハイライトの前提条件 
– 形態素解析フィールドとN-gramフィールドの横断検索 
– autoGeneratePhraseQueries=true 
– &hl=on&hl.fl...
SynonymFilterFactoryの設定 
• tokenizerFactory*属性 
– 上流トークナイザを指定してそのトークナイザでシノニム辞書内の類義語を読 
み込み、トークンをマッチさせる 
– 上流トークナイザが持つ属性を同じ...
SynonymFilterFactoryの設定 
• synonyms="synonyms.txt" 
#片方向形式 
aaa => bbb 
aaa => ccc 
#これで、aaa=>bbb,cccになる 
#等価形式(双方向展開) 
内閣...
FSTSynonymFilterの制限事項 
• マルチトークンな類義語はトークングラフ生成が複雑になり、フレーズクエリの検索 
がおかしくなる 
– http://s.apache.org/TokenGraphs 
– Automata In...
[FST|Slow]SynonymFilterの問題点 
• 類義語検索でヒットできない例(FST|Slow両方): 
– シノニム辞書は「内閣総理大臣,首相」 
– 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 
• ...
FSTSynonymFilterの問題点 
• 類義語検索でヒットしないのを期待するがヒットする例: 
– シノニム辞書は「dns, domain name service」 
– textフィールドにインデクシング:「dns is up」 
...
FSTSynonymFilterの問題点 
• 類義語ハイライトがズレる例: 
– シノニム辞書は「内閣総理大臣,首相」 
– 2-gramフィールドにインデクシング:「首相でございます」 
• q=内閣総理大臣&hl=on 
– <b>首相で...
SlowSynonymFilter 
• 類義語ハイライトはズレない 
– 類義語が同一オフセットになるからズレない 
– q=首相&hl=on 
– q=内閣総理大臣&hl=on 
• ハイライトがズレないようにするには、FSTSynではなく...
branch_5x 
• LUCENE-5944branch_5x作成&@Deprecatedなクラスの削除など 
– https://svn.apache.org/viewvc?limit_changes=0&view=revision&re...
NGramSynonymTokenizer 
• LUCENE-5252のパッチ 
– http://www.slideshare.net/KojiSekiguchi/lucene-5252n-gramsynonymtokenizer 
– シ...
Upcoming SlideShare
Loading in …5
×

類義語検索と類義語ハイライト

6,159 views

Published on

http://www.rondhuit.com/synonym-searching-and-synonym-highlighting.html

errata:
☓) AGFQ ◯) AGPQ (=autoGeneratePhraseQueries)

Published in: Technology

類義語検索と類義語ハイライト

  1. 1. 類義語検索と類義語ハイライト 2014/12 shinichiro@apache.org 1
  2. 2. About me • 株式会社ロンウイット • Apache Solr & Apache ManifoldCF トレーニング&コンサルティング &サポート • [改訂新版] Apache Solr入門第6章「データのクローリング」担当 • Apache ManifoldCF committer & PMC member • 第6回と第8回のSolr勉強会で発表 – http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf – http://www.slideshare.net/ShinichiroAbe/solr-40-13545722 2
  3. 3. アジェンダ • 日本語全文検索の検索設定・ハイライト設定例 • 類義語の検索とハイライト – 類義語 • 類義語,同義語,類語,同意語,シノニム,類似語 • 記事:類義語検索と類義語ハイライト – http://www.rondhuit.com/synonym-searching-and-synonym-highlighting. html 3
  4. 4. 日本語全文検索の検索設定例 • 1)検索漏れの対応 – edismaxによる形態素解析フィールドとN-gramフィールドの横断検索 q=単語&defType=edismax&qf=title_ja^4 content_ja^3 title_2g^2 content_2g • 例: – 形態素解析フィールドにインデクシング「製造部門長谷川」 • 製造|部門|長谷川 – 形態素解析だけだと、q=門長やq=谷川でヒットできなくなってしまう – なので、2-gramフィールドで漏れをカバーする • 製造|造部|部門|門長|長谷|谷川 4
  5. 5. 日本語全文検索の検索設定例 • 2)検索ゴミの対応 – qfパラメータでN-gramフィールドの重みを下げる – システム出力(ゴミ)を減らす • autoGeneratePhraseQueries(デフォルトfalse->true) • 例: – q=こんにちは(2-gramでパース) • AGFQ=false-> (こんんににちちは) --BooleanQuery – q.op=ORなら「こんばんは」、「にちようび」もヒットしてしまう • AGFQ=true -> PhraseQuery("こんんににちちは") – q=会社(1-gramでパース) • AGFQ=false-> (会社) – q.op=ORなら「会場」、「弊社」もヒットしてしまう – q.op=ANDなら「社会」もヒットしてしまう • AGFQ=true -> PhraseQuery("会社") – AGFQ=falseは自動でフレーズクエリにしない->ポジションは考慮しない 5 <fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  6. 6. 日本語全文検索のハイライト設定例 • ハイライタ – storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ トを使って、マッチした単語に強調タグをつけて返す • ハイライト対象フィールド(hl.fl)は、検索漏れを考慮して、N-gram フィールドを指定 – N-gramでstoredフィールドをアナライズしてハイライト • 3つのハイライタ – Standard Highlighter(デフォルト) – FastVector Highlighter(aka FVH) – Postings Highlighter 6
  7. 7. 日本語全文検索のハイライト設定例 • デフォルトハイライタ – N-gramフィールドのハイライトがうまくいかない(LUCENE-1489) – 例: • 2-gramフィールドにインデクシング:「Aを指定し、Bを指定し、Cを指定する」 – q=指定&hl=on&hl.fl=content_2g » Aを<em>指定し、Bを指定し、Cを指定</em>する • FVH – デフォルトより速い。ただしインデックスサイズが大きくなる。 • インデクシング時に保存したtermVectorsを使ってハイライトするのでstored フィールドの再アナライズをしない分速い – N-gramフィールドのサポート&フレーズ単位にハイライティング – 例: – q=指定&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true » Aを<b>指定</b>し、Bを<b>指定</b>し、Cを<b>指定</b>する – q=こんにちは&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true » <b>こんにちは</b> こんばんは 7
  8. 8. 日本語全文検索のハイライト設定例 • PostingsSolrHighlighter – FVHより速い。インデックスサイズも小さくできる • インデクシング時に保存したオフセットを使ってハイライト – ただしフレーズ単位のハイライティングの未サポート(LUCENE-4825) – 例: • q=こんにちは&hl=on&hl.fl=content_2g – <em>こん</em><em>に</em><em>ち</em><em>は</em> <em>こん</em>ばんは • q="apple juice"&hl=on&hl.fl=content_2g – <em>apple</em> <em>juice</em> <em>apple</em> • ハイライタの選択 – 高速かつ(フレーズ単位の)正確なハイライトをするなら、FVH • インデックスサイズとインデクシング時間は犠牲にする 8
  9. 9. 検索とハイライトの設定まとめ、それから類義語対応 • 検索とハイライトの前提条件 – 形態素解析フィールドとN-gramフィールドの横断検索 – autoGeneratePhraseQueries=true – &hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true • 類義語対応-(2-gramの例) – フィールドタイプでSynonymFilterFactoryを追加する 9 <fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> <analyzer type="index"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.NGramTokenizerFactory" tokenizerFactory.minGramSize="2" tokenizerFactory.maxGramSize="2” luceneMatchVersion="3.3"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> </analyzer> </fieldType>
  10. 10. SynonymFilterFactoryの設定 • tokenizerFactory*属性 – 上流トークナイザを指定してそのトークナイザでシノニム辞書内の類義語を読 み込み、トークンをマッチさせる – 上流トークナイザが持つ属性を同じように設定する(SOLR-4813) • type="index"側で設定し、expand属性を=true – ■インデクシング側に設定し、シノニム辞書を等価形式にして展開する■ • シノニム辞書を変更したら再インデクシングする必要がある – クエリ側に設定すると、フレーズクエリのときMultiPhraseQueryが生成されて ヒットできなくなる(AGFQ=trueならフレーズクエリになりうるので) • 「[改訂新版] Apache Solr入門」第9章P.281-285 P.300-302を参照 – クエリ側に設定したい場合、シノニム辞書が片方向形式だと、インデクシング側 にも設定しないと、マッチしない – クエリ側に設定すると、類義語のIDFが効いて、レアな類義語が高いスコアを相 対的に獲得してしまう(Television > TV) • https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory – コミュニティではクエリ側での利用の要望・パッチ提案がある(SOLR-4381, SOLR- 5379など)が、取り込まれてはいない 10
  11. 11. SynonymFilterFactoryの設定 • synonyms="synonyms.txt" #片方向形式 aaa => bbb aaa => ccc #これで、aaa=>bbb,cccになる #等価形式(双方向展開) 内閣総理大臣,首相,安倍,野田 • luceneMatchVersion – <= 3.3 SlowSynonymFilter • 従来のフィルタ – >= 3.4 FSTSynonymFilter(LUCENE-3233) • デフォルト。シノニム辞書ロードのメモリがコンパクトになり、処理が速 い。ManagedSynonymFilterFactoryではこちらを採用 • 従来と実装が変わったため、ポジションとオフセットの振り方が変わっ た。この影響で類義語検索でヒットできないケース・類義語ハイライトが ズレるケースがある11
  12. 12. FSTSynonymFilterの制限事項 • マルチトークンな類義語はトークングラフ生成が複雑になり、フレーズクエリの検索 がおかしくなる – http://s.apache.org/TokenGraphs – Automata Invasion P.23 • http://www.slideshare.net/lucenerevolution/automaton-invasionlucenerevolution2012 • その結果、 – 類義語検索でヒットできなかったり意図しないヒットが起こる • ポジションの振り方が変わったためフレーズクエリの検索が失敗する/意図しないヒットを する場合がある – 類義語ハイライトがズレる • オフセットの振り方が変わったためハイライトがズレる – 従来のポジション&オフセットの振り方を維持できない • 回避方法->「シングルトークンで類義語を定義する」 – 片方向形式+インデックス側とクエリ側にSynonymFilterFactoryを配置 • 内閣総理大臣,首相=> 首相 • エンジニア,技術者=> 技術(?) シングルトークン代表を探すのが無理 • 徳川家康,竹千代=> 家康(?) シングルトークン代表を探すのが無理 • dns, domain name service => dns • グラフ生成の別アプローチのパッチ提案がある(LUCENE-5012)が、取り込まれては いない 12
  13. 13. [FST|Slow]SynonymFilterの問題点 • 類義語検索でヒットできない例(FST|Slow両方): – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で – ヒットしない。PQ("首相相で")で次ポジションに「相で」がない – 「臣で」は2-gramのとき生成される – 1-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で – ヒットしない。PQ("首相で")で次ポジションに「で」がない 13 トークン[ポジション] |首相[1] |臣で[6]|でご[7]|ござ|ざい| |内閣[1]|閣総[2]|総理[3]|理大[4]|大臣[5]| トークン[ポジション] |首[1]|相[2] |で[7]|ご[8]|ざ[8]|い[10] |内[1]|閣[2]|総[3]|理[4]|大[5]|臣[6]|
  14. 14. FSTSynonymFilterの問題点 • 類義語検索でヒットしないのを期待するがヒットする例: – シノニム辞書は「dns, domain name service」 – textフィールドにインデクシング:「dns is up」 • q="dns name up" – フレーズクエリでヒットしてしまう – 従来のSlowSynの場合は上記フレーズクエリはヒットしない 14 トークン[ポジション] |dns[1] |is[2] |up[3] | |domain[1]|name[2]|service[3]| トークン[ポジション] |dns[1] |is[4] |up[5] | |domain[1]|name[2]|service[3]|
  15. 15. FSTSynonymFilterの問題点 • 類義語ハイライトがズレる例: – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「首相でございます」 • q=内閣総理大臣&hl=on – <b>首相でござい</b>ます – ハイライトズレ。オフセット0-6でハイライトするため 15 トークン [開始オフセット, 終了オフセット] |首相[0,2]|相で[1,3]|でご[2,4]|ござ[3,5]|ざい[4,6]|いま[5,7]|ます[6,8] |内閣[0,2]|閣総[1,3]|総理[2,4]|理大[3,5]|大臣[4,6]|
  16. 16. SlowSynonymFilter • 類義語ハイライトはズレない – 類義語が同一オフセットになるからズレない – q=首相&hl=on – q=内閣総理大臣&hl=on • ハイライトがズレないようにするには、FSTSynではなくSlowSynを使 えばよい – SOLR-3390 • luceneMatchVersion="3.3" 16 トークン [開始オフセット, 終了オフセット] |首相[0,6] |臣で[5,7]|でご[6,8]| |内閣[0,6]|閣総[0,6]|総理[0,6]|理大[0,6]|大臣[0,6]|
  17. 17. branch_5x • LUCENE-5944branch_5x作成&@Deprecatedなクラスの削除など – https://svn.apache.org/viewvc?limit_changes=0&view=revision&revision=1626055 • SlowSynonymFilterの削除、FSTSynonymFilter->SynonymFilter • (補足)CJKTokenizerの削除 • (補足) schema.xmlにあるtext_cjk型でシノニムは使えない – 「[改訂新版] Apache Solr入門」P.284 参照 – NGramTokenizerを使う 17
  18. 18. NGramSynonymTokenizer • LUCENE-5252のパッチ – http://www.slideshare.net/KojiSekiguchi/lucene-5252n-gramsynonymtokenizer – シノニム辞書にある類義語のトークンはN-gram分割しない。類義語は同一ポジショ ン同一オフセットを保持する – 類義語の両脇の文字列を補正する • 類義語検索でヒットできる – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で • 類義語ハイライトはズレない • q=首相で 18 トークン[ポジション] |首相[1]|で[2]|ござ[3]|ざい[4]|いま|ます |内閣総理大臣[1]|でご[2]| トークン [開始オフセット, 終了オフセット] |首相[0,6]|で[6,7]|ござ[7,9]|ざい[8,10]|いま|ます |内閣総理大臣[0,6]|でご[6,6]|

×