ご利用にはKandaSearchへの
ユーザー登録(無料)が必要です
最新バージョン: 1.3.0
開発者: RONDHUIT
ダウンロード数: 43
最終更新日: 2022-07-12
Copyright: RONDHUIT Co.,LTD
最新バージョン: 1.3.0
開発者: RONDHUIT
ダウンロード数: 43
最終更新日: 2022-07-12
Copyright: RONDHUIT Co.,LTD
Apache Solr ハンズオンセミナー「第3回 日本語表記揺れ検索を極める」のスライドです。
第3回 日本語表記揺れ検索を極める Apache Solr ハンズオンセミナー
株式会社ロンウイット
関口宏司 @kojisays
2022年5月23日 | 初版 |
---|---|
2022年5月25日 | 会社名ソートのソート順指定とtokenizerFactoryの具体例の誤記載を訂正 |
2022年6月23日 | シノニム関連操作はすべてKandaSearch UIを使うように修正 |
2022年6月24日 | 著者名の読みでソート、会社名の読みでソートの各演習での操作を簡易な操作に修正 |
2022年7月12日 | KandaSearchの拡張機能メニュー変更に合わせ内容更新 |
これから Apache Solr のいろいろな機能を使っていきます。本セミナーでは Apache Solr 環境を簡単に準備できる KandaSearch を通じて Apache Solr を使っていきます。
そのためには、 https://kandasearch.com/ にログイン後、プロジェクトを作成します。
(お試しになりたい方のみお試しください。このステップを飛ばしても以降の[演習]には差し支えございません)
作成したプロジェクト内に検索エンジンインスタンス、つまり Apache Solr を作成してみましょう。
「パソコン」で検索 ⇒ ヒット10件
「パソコン」で検索 ⇒ ヒット2件
「pc」で検索 ⇒ ヒット0件
「PC」で検索 ⇒ ヒット20件
「PC」で検索 ⇒ ヒット8件
:
「パソコン」で検索 ⇒ ヒット40件
…… パソコン ......... PC ................................
…. パソコン ................................................
…………………………………. PC …………
………………… パソコン ...........................
表記揺れ対策を施すだけで、検索効率は5倍にUP!
extensions / data / livedoor / data / dokujo-tsushin / dokujo-tsushin-4778030.txt
「/ dokujo-tsushin /」 ← カテゴリー ← 教師ラベル
以下は特徴ベクトル
"id": "dokujo-tsushin-4778030.txt", ←ID string
"url": "http://news.livedoor.com/article/detail/4778030/", ←URL string
"category": "dokujo-tsushin",
"date": "2010-05-22T14:30:00Z", ←日付 date
"title": "友人代表のスピーチ、独女はどうこなしている?", ←title text_ja / text_2g
"body": [ ←本文 text_ja / text_2g
" もうすぐジューン・ブライドと呼ばれる6月。独女の中には自分の式はまだなのに呼ばれてばかり……という「お祝い貧乏」状態の人も多いのではないだろうか? さらに出席回数を重ねていくと、こんなお願いごとをされることも少なくない。",
"",
..........
" 主役はあくまで新郎新婦ながらも、いざとなると緊張し、内容もあれこれ考えて、こっそりリハーサル……そんな人知れず頑張るスピーチ担当独女たちにも幸あれ(高山惠)"
]
ライブラリーにあるLivedoorニュースコーパスとそのconfigを使ってlivedoornewsコレクションを作成し、サンプルデータをインデクシングします。
本日の演習ではすべてこのlivedoornewsコレクションを使っていきます。
形態素解析
文字N-gram
Solr Admin UI で livedoornewsコレクションを選択し、Analysis を選びます。適当な日本語文字列、たとえば、「緊急事態宣言」を Field Value (index) に入力して、下記それぞれのフィールド型で解析して、結果を比較します。
特徴 | 具体例 | ||
---|---|---|---|
形態素解析 | 検索誤り | 起きにくい | 東京都⇒東京/都:「京都」で「東京都」がヒットしない。 |
検索漏れ | 起こりやすい | 「きもの」で「ここ/で/はきもの/を脱ぐ」がヒットしない。 | |
文字N-gram | 検索誤り | 起こりやすい | 東京都⇒東京/京都:「京都」で「東京都」がヒットする。 |
検索漏れ | 起きにくい | はきもの⇒はき/きも/もの:「きもの」で「はきもの」がヒットする。 |
<copyField source="title" dest="title_2g"/>
<copyField source="body" dest="body_2g"/>
※ titleとbodyフィールドは形態素解析、title_2gとbody_2gは2-gramです。
<str name="defType">edismax</str>
<str name="qf">title^5 title_2g body^3 body_2g</str>
KandaSearchの検索で以下のように入力してedismaxによるフィールド横断検索を試してみましょう。(適宜「保存」機能を使ってパラメーターを保存しておくと便利です)
種類 | 例 |
---|---|
文字の正規化 | 半角全角/"カード" <-> "カード", 新旧漢字/"慶應" <-> "慶応", V音/"ヴェランダ" <-> "ベランダ" |
カタカナ語 末尾の長音記号 | "コンピューター" <-> "コンピュータ", "サーバー" <-> "サーバ", "ユーザー" <-> "ユーザ" |
中黒の有無 漢字とその読み | "ハリー・ポッター" <-> "ハリーポッター", "トム・クルーズ" <-> "トムクルーズ" "乗り物" <-> "のりもの", "鞄" <-> "カバン" |
同義語 類義語 | 同義語/"ピンポン" <-> "卓球", 類義語/"言う" <-> "話す" |
省略語 | "木村拓哉" <-> "キムタク", "スマートフォン" <-> "スマホ" |
外来語 | "interface" <-> "インターフェイス" <-> "インタフェース" |
漢字送り仮名 | "引っ越し" <-> "引越し" <-> "引越", "受け付け" <-> "受付け" <-> "受付" |
西暦・和暦 | "2019年" <-> "平成31年" <-> "令和元年" |
下記例のように中黒を含むカタカナ語(対応する英語等が複数単語で構成されることが多い)は、中黒の有無により検索結果が異なる場合があることを確認します。
Solr Admin UIのAnalysisを使って、中黒の有無でヒット数が同じキーワードと異なるキーワードがある理由を調査します。
(Advanced)さらに、text_2gフィールドではどうなるか試してみましょう。
⇒ 本書後半の Advanced にてこの「中黒の有無」問題を解決していきます。
<fieldType name="text_ja_reading" class="solr.TextField"
autoGeneratePhraseQueries="true" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="RONDHUIT-mapping-ja-1.0.0.txt"/>
<tokenizer class="solr.JapaneseTokenizerFactory" mode="normal" userDictionary="userdict_ja.txt"/>
<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="stoptags_ja.txt"/>
<filter class="solr.StopFilterFactory" words="stopwords-ja.txt" ignoreCase="true"/>
<filter class="solr.JapaneseReadingFormFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="RONDHUIT-mapping-ja-1.0.0.txt"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ICUTransformFilterFactory" id="Hiragana-Katakana"/>
</analyzer>
</fieldType>
<field name="body_reading" type="text_ja_reading" indexed="true" stored="true" multiValued="true"/>
<copyField source="body" dest="body_reading"/>
```*```2: [https://www.rondhuit.com/synonym-searching-and-synonym-highlighting_synonymgraphfilter_2022.html](https://www.rondhuit.com/synonym-searching-and-synonym-highlighting_synonymgraphfilter_2022.html)
## P24 日本語フィールドへのシノニム適用について(2)
- (特に)日本語フィールドへシノニム定義を行う場合、上流のTokenizerに合わせてtokenizerFactoryオプションを忘れずに設定します。
```xml
<tokenizer class="solr.JapaneseTokenizerFactory" mode="normal" userDictionary="userdict_ja.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms_ja.txt"
tokenizerFactory="solr.JapaneseTokenizerFactory" tokenizerFactory.mode="normal"/>
<filter class="solr.ManagedSynonymGraphFilterFactory" managed="synonym-ja"/>
curl -X PUT -H 'Content-type:application/json' --data-binary '{"initArgs":{"ignoreCase":true,"tokenizerFactory":"solr.JapaneseTokenizerFactory","tokenizerFactory.mode":"normal","format":"solr"}}'
https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja
curl -X PUT -H 'Content-type:application/json' --data-binary '{"managedMap":{
"キムタク":["キムタク","木村拓哉"],
"木村拓哉":["キムタク","木村拓哉"]
}}' https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja
⇒ 以降の演習では、操作が簡単なKandaSearch UIを使って行います。「スマホ」と「スマートフォン」の相互ヒットを行うために、以下を実行してKandaSearch UIから「スマホ」や「スマートフォン」で検索してみましょう。
前の演習を参考に、"pc" <-> "パソコン" <-> "コンピューター" が相互ヒットするように、シノニムを登録して検索してみましょう。
(ヒント1)プロジェクトの「類義語辞書」から前問で作成した辞書mydicを編集します。
(ヒント2)JapaneseKatakanaStemFilterの動作を考慮し、「コンピューター」ではなく「コンピュータ」でシノニム登録を行います。
(ヒント3)歯車アイコンから「辞書をデプロイする」を選んで、デプロイ先を適切に選んでデプロイします。
<dynamicField name="*_ja_kata_srt" type="text_ja_kata_srt" indexed="true" stored="true"/>
[
{ "id": "1", "author_ja_kata_srt": "宮部みゆき" },
{ "id": "2", "author_ja_kata_srt": "東野圭吾" },
{ "id": "3", "author_ja_kata_srt": "青木雄三" },
{ "id": "4", "author_ja_kata_srt": "西加奈子" },
{ "id": "5", "author_ja_kata_srt": "横山秀夫" },
{ "id": "6", "author_ja_kata_srt": "池井戸 潤" },
{ "id": "7", "author_ja_kata_srt": "レイモンド・チャンドラー" },
{ "id": "8", "author_ja_kata_srt": "村上 春樹" }
]
<dynamicField name="*_ja_corp_srt" type="text_ja_corp_srt" indexed="true" stored="true"/>
前問で取得した「演習用データセット」のZIPにある以下のデータ(seminar3-companies.json)を登録します。
[
{ "id": "11", "corp_ja_corp_srt": "パナソニック株式会社", "corp_s": "パナソニック株式会社" },
{ "id": "12", "corp_ja_corp_srt": "(株)野村総合研究所", "corp_s": "(株)野村総合研究所" },
{ "id": "13", "corp_ja_corp_srt": "(株)ロンウイット", "corp_s": "(株)ロンウイット" },
{ "id": "14", "corp_ja_corp_srt": "富士通㈱", "corp_s": "富士通㈱" },
{ "id": "21", "corp_ja_corp_srt": "日本東京有限会社", "corp_s": "日本東京有限会社" },
{ "id": "22", "corp_ja_corp_srt": "(有)東京日本", "corp_s": "(有)東京日本" },
{ "id": "23", "corp_ja_corp_srt": "(有)千葉神奈川", "corp_s": "(有)千葉神奈川" },
{ "id": "24", "corp_ja_corp_srt": "本州北陸㈲", "corp_s": "本州北陸㈲" },
{ "id": "31", "corp_ja_corp_srt": "大江戸 合資会社", "corp_s": "大江戸 合資会社" },
{ "id": "32", "corp_ja_corp_srt": "合資会社 ローリスク", "corp_s": "合資会社 ローリスク" },
{ "id": "33", "corp_ja_corp_srt": "㈾ハイテンション", "corp_s": "㈾ハイテンション" },
{ "id": "41", "corp_ja_corp_srt": "日本生命保険相互会社", "corp_s": "日本生命保険相互会社" },
{ "id": "42", "corp_ja_corp_srt": "明治安田生命保険相互会社", "corp_s": "明治安田生命保険相互会社" },
{ "id": "51", "corp_ja_corp_srt": "一般社団法人 日本能率協会", "corp_s": "一般社団法人 日本能率協会" },
{ "id": "52", "corp_ja_corp_srt": "一般財団法人 日本M&Aアドバイザー協会", "corp_s": "一般財団法人 日本M&Aアドバイザー協会" },
{ "id": "53", "corp_ja_corp_srt": "公益社団法人 東京都猟友会", "corp_s": "公益社団法人 東京都猟友会" },
{ "id": "54", "corp_ja_corp_srt": "公益財団法人日本レクリエーション協会", "corp_s": "公益財団法人日本レクリエーション協会" },
{ "id": "61", "corp_ja_corp_srt": "NPO法人 日本交流協会", "corp_s": "NPO法人 日本交流協会" },
{ "id": "62", "corp_ja_corp_srt": "特定非営利活動法人 コーヒー同好会", "corp_s": "特定非営利活動法人 コーヒー同好会" },
{ "id": "71", "corp_ja_corp_srt": "KPMG あずさ監査法人", "corp_s": "KPMG あずさ監査法人" },
{ "id": "72", "corp_ja_corp_srt": "弁護士法人 越中島法律研究会", "corp_s": "弁護士法人 越中島法律研究会" },
{ "id": "73", "corp_ja_corp_srt": "学校法人むさしの育英会", "corp_s": "学校法人むさしの育英会" },
{ "id": "74", "corp_ja_corp_srt": "学校法人 神田言語学院", "corp_s": "学校法人 神田言語学院" }
]
post -url https://<instance-name>.i.kandasearch.nl/solr/livedoornews/update -commit yes livedoor.json
以下のようにリソース(synonym-jaとします)の初期化を行い、
curl -X PUT -H 'Content-type:application/json' --data-binary '{"initArgs":{"ignoreCase":true,"tokenizerFactory":"solr.JapaneseTokenizerFactory","tokenizerFactory.mode":"normal","format":"solr"}}'
https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja
その上でシノニムの登録を行います。
curl -X PUT -H 'Content-type:application/json' --data-binary '{"managedMap":{
"キムタク":["キムタク","木村拓哉"],
"木村拓哉":["キムタク","木村拓哉"]
}}' https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja
curl -X PUT -H 'Content-type:application/json' -d @<dictionary-file>.json https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja