SlideShare una empresa de Scribd logo
1 de 18
類義語検索と類義語ハイライト 
2014/12 
shinichiro@apache.org 
1
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
アジェンダ 
• 日本語全文検索の検索設定・ハイライト設定例 
• 類義語の検索とハイライト 
– 類義語 
• 類義語,同義語,類語,同意語,シノニム,類似語 
• 記事:類義語検索と類義語ハイライト 
– http://www.rondhuit.com/synonym-searching-and-synonym-highlighting. 
html 
3
日本語全文検索の検索設定例 
• 1)検索漏れの対応 
– edismaxによる形態素解析フィールドとN-gramフィールドの横断検索 
q=単語&defType=edismax&qf=title_ja^4 content_ja^3 title_2g^2 content_2g 
• 例: 
– 形態素解析フィールドにインデクシング「製造部門長谷川」 
• 製造|部門|長谷川 
– 形態素解析だけだと、q=門長やq=谷川でヒットできなくなってしまう 
– なので、2-gramフィールドで漏れをカバーする 
• 製造|造部|部門|門長|長谷|谷川 
4
日本語全文検索の検索設定例 
• 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">
日本語全文検索のハイライト設定例 
• ハイライタ 
– storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス 
コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ 
トを使って、マッチした単語に強調タグをつけて返す 
• ハイライト対象フィールド(hl.fl)は、検索漏れを考慮して、N-gram 
フィールドを指定 
– N-gramでstoredフィールドをアナライズしてハイライト 
• 3つのハイライタ 
– Standard Highlighter(デフォルト) 
– FastVector Highlighter(aka FVH) 
– Postings Highlighter 
6
日本語全文検索のハイライト設定例 
• デフォルトハイライタ 
– 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
日本語全文検索のハイライト設定例 
• 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
検索とハイライトの設定まとめ、それから類義語対応 
• 検索とハイライトの前提条件 
– 形態素解析フィールドと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>
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
SynonymFilterFactoryの設定 
• synonyms="synonyms.txt" 
#片方向形式 
aaa => bbb 
aaa => ccc 
#これで、aaa=>bbb,cccになる 
#等価形式(双方向展開) 
内閣総理大臣,首相,安倍,野田 
• luceneMatchVersion 
– <= 3.3 SlowSynonymFilter 
• 従来のフィルタ 
– >= 3.4 FSTSynonymFilter(LUCENE-3233) 
• デフォルト。シノニム辞書ロードのメモリがコンパクトになり、処理が速 
い。ManagedSynonymFilterFactoryではこちらを採用 
• 従来と実装が変わったため、ポジションとオフセットの振り方が変わっ 
た。この影響で類義語検索でヒットできないケース・類義語ハイライトが 
ズレるケースがある11
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
[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]|
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]|
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]|
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]|
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
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]|

Más contenido relacionado

La actualidad más candente

Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
Kouhei Sutou
 

La actualidad más candente (20)

Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...
スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...
スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会
 
第16回Lucene/Solr勉強会 – ランキングチューニングと定量評価 #SolrJP
第16回Lucene/Solr勉強会 – ランキングチューニングと定量評価 #SolrJP第16回Lucene/Solr勉強会 – ランキングチューニングと定量評価 #SolrJP
第16回Lucene/Solr勉強会 – ランキングチューニングと定量評価 #SolrJP
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
インセプションデッキのひな形(PDF形式:説明表示版)
インセプションデッキのひな形(PDF形式:説明表示版)インセプションデッキのひな形(PDF形式:説明表示版)
インセプションデッキのひな形(PDF形式:説明表示版)
 
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
 
ペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おうペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おう
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 

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

Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Tetsu Yama
 
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Tetsu Yama
 
Powershell勉強会 v2 (もっと新しいバージョンがあります)
Powershell勉強会 v2 (もっと新しいバージョンがあります)Powershell勉強会 v2 (もっと新しいバージョンがあります)
Powershell勉強会 v2 (もっと新しいバージョンがあります)
Tetsu Yama
 
COD2012 T2/T3 : 実機で試す SQL Server の現状取得
COD2012 T2/T3 : 実機で試す SQL Server の現状取得COD2012 T2/T3 : 実機で試す SQL Server の現状取得
COD2012 T2/T3 : 実機で試す SQL Server の現状取得
Masayuki Ozawa
 
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
SFDG ROOKIES
 

Similar a 類義語検索と類義語ハイライト (20)

AWS Black Belt Techシリーズ Amazon CloudSearch
AWS Black Belt Techシリーズ Amazon CloudSearchAWS Black Belt Techシリーズ Amazon CloudSearch
AWS Black Belt Techシリーズ Amazon CloudSearch
 
solr勉強会資料
solr勉強会資料solr勉強会資料
solr勉強会資料
 
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
 
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
 
Jfdg2
Jfdg2Jfdg2
Jfdg2
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
 
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
 
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)
 
Powershell勉強会 v2 (もっと新しいバージョンがあります)
Powershell勉強会 v2 (もっと新しいバージョンがあります)Powershell勉強会 v2 (もっと新しいバージョンがあります)
Powershell勉強会 v2 (もっと新しいバージョンがあります)
 
COD2012 T2/T3 : 実機で試す SQL Server の現状取得
COD2012 T2/T3 : 実機で試す SQL Server の現状取得COD2012 T2/T3 : 実機で試す SQL Server の現状取得
COD2012 T2/T3 : 実機で試す SQL Server の現状取得
 
20180725 Learning To Rank meetup
20180725 Learning To Rank meetup20180725 Learning To Rank meetup
20180725 Learning To Rank meetup
 
全文検索入門
全文検索入門全文検索入門
全文検索入門
 
Yahoo!検索のパフォーマンス向上策全て見せます
Yahoo!検索のパフォーマンス向上策全て見せますYahoo!検索のパフォーマンス向上策全て見せます
Yahoo!検索のパフォーマンス向上策全て見せます
 
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用PHPでのSWF編集とその応用
PHPでのSWF編集とその応用
 
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
【Devsumi2019】開発者に贈るSalesforceプラットフォーム概論と最新動向
 
GoldenGateテクニカルセミナー4「テクニカルコンサルタントが語るOracle GoldenGate現場で使える極意」(2016/5/11)
GoldenGateテクニカルセミナー4「テクニカルコンサルタントが語るOracle GoldenGate現場で使える極意」(2016/5/11)GoldenGateテクニカルセミナー4「テクニカルコンサルタントが語るOracle GoldenGate現場で使える極意」(2016/5/11)
GoldenGateテクニカルセミナー4「テクニカルコンサルタントが語るOracle GoldenGate現場で使える極意」(2016/5/11)
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?
 
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
 
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
ヤフー発のメッセージキュー 「Pulsar」のご紹介@jjug ccc 20171118
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 

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

  • 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]|