Más contenido relacionado
La actualidad más candente (20)
Similar a 類義語検索と類義語ハイライト (20)
類義語検索と類義語ハイライト
- 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. アジェンダ
• 日本語全文検索の検索設定・ハイライト設定例
• 類義語の検索とハイライト
– 類義語
• 類義語,同義語,類語,同意語,シノニム,類似語
• 記事:類義語検索と類義語ハイライト
– http://www.rondhuit.com/synonym-searching-and-synonym-highlighting.
html
3
- 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. 日本語全文検索の検索設定例
• 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. 日本語全文検索のハイライト設定例
• ハイライタ
– storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス
コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ
トを使って、マッチした単語に強調タグをつけて返す
• ハイライト対象フィールド(hl.fl)は、検索漏れを考慮して、N-gram
フィールドを指定
– N-gramでstoredフィールドをアナライズしてハイライト
• 3つのハイライタ
– Standard Highlighter(デフォルト)
– FastVector Highlighter(aka FVH)
– Postings Highlighter
6
- 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. 日本語全文検索のハイライト設定例
• 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. 検索とハイライトの設定まとめ、それから類義語対応
• 検索とハイライトの前提条件
– 形態素解析フィールドと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. 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. SynonymFilterFactoryの設定
• synonyms="synonyms.txt"
#片方向形式
aaa => bbb
aaa => ccc
#これで、aaa=>bbb,cccになる
#等価形式(双方向展開)
内閣総理大臣,首相,安倍,野田
• luceneMatchVersion
– <= 3.3 SlowSynonymFilter
• 従来のフィルタ
– >= 3.4 FSTSynonymFilter(LUCENE-3233)
• デフォルト。シノニム辞書ロードのメモリがコンパクトになり、処理が速
い。ManagedSynonymFilterFactoryではこちらを採用
• 従来と実装が変わったため、ポジションとオフセットの振り方が変わっ
た。この影響で類義語検索でヒットできないケース・類義語ハイライトが
ズレるケースがある11
- 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. [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. 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. 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. 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. 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. 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]|