EXTENSIONS

第3回 日本語表記揺れ検索を極める|Apache Solr ハンズオンセミナー
無料

ご利用にはKandaSearchへの
ユーザー登録(無料)が必要です

Misc
第3回 日本語表記揺れ検索を極める|Apache Solr ハンズオンセミナー

最新バージョン: 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 ハンズオンセミナー

P01 表紙

第3回 日本語表記揺れ検索を極める Apache Solr ハンズオンセミナー
株式会社ロンウイット
関口宏司 @kojisays

P02 改訂履歴

2022年5月23日 初版
2022年5月25日 会社名ソートのソート順指定とtokenizerFactoryの具体例の誤記載を訂正
2022年6月23日 シノニム関連操作はすべてKandaSearch UIを使うように修正
2022年6月24日 著者名の読みでソート、会社名の読みでソートの各演習での操作を簡易な操作に修正
2022年7月12日 KandaSearchの拡張機能メニュー変更に合わせ内容更新

P03 ご注意

  • 本書演習やセミナー内で使用される辞書や設定ファイルなどの「エクステンション」は、 KandaSearch の利用規約 https://kandasearch.com/policy/terms の範囲内でご利用いただけます。

P04 本日の内容

  • 検索における「表記揺れ」対策の必要性
  • Livedoorニュースコーパス
  • [演習] Livedoorニュースコーパスの環境準備
  • 形態素解析(JapaneseTokenizer)と文字N-gram
  • 日本語検索の基本戦略
  • 日本語検索における表記揺れ
  • 日本語検索を支えるさまざまなフィルター
  • 類義語検索
  • [演習]
  • Q&A, アンケート

P05 [演習] 演習環境の準備

P06 [演習1] 検索エンジンプロジェクトの作成

これから Apache Solr のいろいろな機能を使っていきます。本セミナーでは Apache Solr 環境を簡単に準備できる KandaSearch を通じて Apache Solr を使っていきます。
そのためには、 https://kandasearch.com/ にログイン後、プロジェクトを作成します。

  1. https://kandasearch.com/ にログインします。
  2. 「プロジェクトを作成する」というボタンからプロジェクトを作成してみましょう。
    • プロジェクト名はわかりやすいものをつけましょう。日本語の名前も可能です。
    • 会社名(架空の名前でも可)などにしてもいいでしょう。
    • プロジェクト名は後から設定メニューでいくらでも変更が可能です。

P07 [演習1a] プロジェクト管理機能(オプション)

(お試しになりたい方のみお試しください。このステップを飛ばしても以降の[演習]には差し支えございません)

  1. プロジェクトメンバーに同僚の開発者を招待することができます。
    • 画面左の「メンバー」メニューから招待したい人のメールアドレスを入力して「管理者」または「ユーザー」の役割で招待できます。
  2. プロジェクトにアイコンを設定できます。
    • 画面左の「設定」メニューからプロジェクトのアイコンに使用する画像をアップロードできます。

P08 [演習2] 検索エンジンインスタンスを作成

作成したプロジェクト内に検索エンジンインスタンス、つまり Apache Solr を作成してみましょう。

  1. 画面左の「オーバービュー」メニューから「インスタンスを作成する」ボタンをクリックし、インスタンス作成ステップを開始します。
  2. プラン選択にて「一週間トライアル」(右下)を選んで次に進みます。
    • 一週間後に自動的に削除されます。
    • 「スタンドアロン」と「SolrCloud」が選択できますが、「スタンドアロン」を選びます。
  3. インスタンス情報入力にて「インスタンス名」と「インスタンスサブドメイン」、「IPアドレス範囲」を設定します。
    • 「インスタンスサブドメイン」はユニークである必要があります。プロジェクト名とインスタンス名に日本語等特殊文字を使用していない場合は、「自動生成」をクリックして自動で作成することができます。
    • 「IPアドレス範囲」に設定したIPアドレスからのみこの Apache Solr へのアクセスを許可するファイアウォールが設定されます。(最大4つ)
    • 最終確認で作成される検索エンジンインスタンスをご確認後、ボタンをクリックして作成し、1〜2分お待ちください。

P09 日本語表記揺れ検索

P10 表記揺れ対策の必要性

  • 表記揺れを考慮していない検索システム

「パソコン」で検索 ⇒ ヒット10件
「パソコン」で検索 ⇒ ヒット2件
「pc」で検索 ⇒ ヒット0件
「PC」で検索 ⇒ ヒット20件
「PC」で検索 ⇒ ヒット8件

  • 表記揺れ対策を施した検索システム

「パソコン」で検索 ⇒ ヒット40件
…… パソコン ......... PC ................................
…. パソコン ................................................
…………………………………. PC …………
………………… パソコン ...........................

表記揺れ対策を施すだけで、検索効率は5倍にUP!

P11 Livedoorニュースコーパスとは?

  • NHN Japan 社(現 LINE 社)のLivedoorニュース記事からHTMLタグを消去したコーパス。
    • コーパスとは、テキスト等を大量に収集した言語資料のこと。
  • フィールド:ID、カテゴリー、日付、タイトル、本文、記事URL。
    • オリジナルのLivedoorニュースコーパスでは記事URLがIDの役割を果たしているが、KandaSearchが配布しているLivedoorニュースコーパスでは、ファイル名をIDとして用いています。
  • 検索のみならず、NLP研究でも徐々に人気に。
  • CC BY-ND 2.1(当時)

P12 Livedoorニュースコーパス(文書データ例)

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月。独女の中には自分の式はまだなのに呼ばれてばかり……という「お祝い貧乏」状態の人も多いのではないだろうか? さらに出席回数を重ねていくと、こんなお願いごとをされることも少なくない。",
            "",
            ..........
            " 主役はあくまで新郎新婦ながらも、いざとなると緊張し、内容もあれこれ考えて、こっそりリハーサル……そんな人知れず頑張るスピーチ担当独女たちにも幸あれ(高山惠)"
        ]

P13 [演習3] Livedoorニュースコーパスの環境準備

ライブラリーにあるLivedoorニュースコーパスとそのconfigを使ってlivedoornewsコレクションを作成し、サンプルデータをインデクシングします。

  1. 拡張機能ライブラリーをクリックします。一覧から「Livedoorニュースコーパス(mini)」と「Livedoorニュースconfiguration」を探してプロジェクトに追加します。
    ```
    ``` KS-UIはアップロードサイズ上限があるのでminiサイズを使っています。
  2. 上記2つのエクステンションをローカルPCにダウンロードします。
  3. インスタンスの「コレクション」に行き、「+コレクションを追加する」で「インポートの作成」タブから先ほどダウンロードしたRONDHUIT-livedoornews-conf-X.X.X.zipをインポートしてコレクション(ここではlivedoornewsとします)を作成します。
  4. インスタンスの「オーバービュー」の「ドキュメントを登録する」から先ほどダウンロードしたRONDHUIT-livedoor-mini-X.X.X.jsonを登録します。

本日の演習ではすべてこのlivedoornewsコレクションを使っていきます。

P14 日本語の単語分割方法 (再掲)第1回 Apache Solr 入門

  • 形態素解析

    • 辞書に基づいた単語分割。
    • 検索結果は、検索誤りが低く、検索漏れが発生しがち。
    • 緊急事態宣言 → 緊急 / 事態 / 宣言
  • 文字N-gram

    • 機械的にN文字単位に分割。
    • 検索結果は、検索漏れが低く、検索誤りが発生しがち。
    • 緊急事態宣言 → 緊急 / 急事 / 事態 / 態宣 / 宣言 (N=2の場合)

P15 [演習4] 形態素解析と文字N-gramの動作確認

Solr Admin UI で livedoornewsコレクションを選択し、Analysis を選びます。適当な日本語文字列、たとえば、「緊急事態宣言」を Field Value (index) に入力して、下記それぞれのフィールド型で解析して、結果を比較します。

  1. text_ja ⇒ 緊急 / 事態 / 宣言
  2. text_1g ⇒ 緊 / 急 / 事 / 態 / 宣 / 言
  3. text_2g ⇒ 緊急 / 急事 / 事態 / 態宣 / 宣言
  4. text_3g ⇒ 緊急事 / 急事態 / 事態宣 / 態宣言

P16 「検索誤り」と「検索漏れ」

特徴 具体例
形態素解析 検索誤り 起きにくい 東京都⇒東京/都:「京都」で「東京都」がヒットしない。
検索漏れ 起こりやすい 「きもの」で「ここ/で/はきもの/を脱ぐ」がヒットしない。
文字N-gram 検索誤り 起こりやすい 東京都⇒東京/京都:「京都」で「東京都」がヒットする。
検索漏れ 起きにくい はきもの⇒はき/きも/もの:「きもの」で「はきもの」がヒットする。

P17 日本語検索の基本戦略

  • 形態素解析と文字N-gramのそれぞれの特徴を踏まえつつ、copyField を使って両方のフィールドを準備します。 必要に応じてその他のフィールドもcopyFieldで用意します。
    <copyField source="title" dest="title_2g"/>
    <copyField source="body" dest="body_2g"/>
    ※ titleとbodyフィールドは形態素解析、title_2gとbody_2gは2-gramです。
    
  • クエリパーサーはedismaxを採用し(defType=edismax)、qfパラメーターに横断検索したいフィールドを重み指定と共に記述します。 一般的に、「形態素解析フィールド」>「文字N-gramフィールド」、「”タイトル”フィールド」>「”本文”フィールド」という具合に重みを付与します。
    <str name="defType">edismax</str>
    <str name="qf">title^5 title_2g body^3 body_2g</str>
    

P18 [演習5] edismaxの動作確認

KandaSearchの検索で以下のように入力してedismaxによるフィールド横断検索を試してみましょう。(適宜「保存」機能を使ってパラメーターを保存しておくと便利です)

  • コレクション:livedoornews、ユニークキー:id、タイトルフィールド:title、ボディフィールド:body
  • クエリパーサー:edismax(ここまでは以降の演習で共通です)
  • クエリフィールド(qf):title^5 title_2g body^3 body_2g
  • 検索キーワードの例:ネット、ラーメン、・・・

P19 日本語検索における表記揺れ

種類
文字の正規化 半角全角/"カード" <-> "カード", 新旧漢字/"慶應" <-> "慶応", V音/"ヴェランダ" <-> "ベランダ"
カタカナ語 末尾の長音記号 "コンピューター" <-> "コンピュータ", "サーバー" <-> "サーバ", "ユーザー" <-> "ユーザ"
中黒の有無 漢字とその読み "ハリー・ポッター" <-> "ハリーポッター", "トム・クルーズ" <-> "トムクルーズ" "乗り物" <-> "のりもの", "鞄" <-> "カバン"
同義語 類義語 同義語/"ピンポン" <-> "卓球", 類義語/"言う" <-> "話す"
省略語 "木村拓哉" <-> "キムタク", "スマートフォン" <-> "スマホ"
外来語 "interface" <-> "インターフェイス" <-> "インタフェース"
漢字送り仮名 "引っ越し" <-> "引越し" <-> "引越", "受け付け" <-> "受付け" <-> "受付"
西暦・和暦 "2019年" <-> "平成31年" <-> "令和元年"

P20 [演習6] 中黒の有無の動作確認

下記例のように中黒を含むカタカナ語(対応する英語等が複数単語で構成されることが多い)は、中黒の有無により検索結果が異なる場合があることを確認します。

  • トムクルーズ ⇒ 4件ヒット、トム・クルーズ ⇒ 4件ヒット 〇
  • ハリーポッター ⇒ 1件ヒット、ハリー・ポッター ⇒ 3件ヒット ×
  • イーモバイル ⇒ 1件ヒット、イー・モバイル ⇒ 2件ヒット ×
  • ビルゲイツ ⇒ 0件ヒット、ビル・ゲイツ ⇒ 3件ヒット ×

Solr Admin UIのAnalysisを使って、中黒の有無でヒット数が同じキーワードと異なるキーワードがある理由を調査します。

Advanced)さらに、text_2gフィールドではどうなるか試してみましょう。

⇒ 本書後半の Advanced にてこの「中黒の有無」問題を解決していきます。

P21 漢字の読みで検索する場合の対策(例)

<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"/>

P22 [演習7] 漢字やその読みでの検索の動作確認

  1. 検索キーワードで「鞄」や「苺」で検索します。
  2. 次に「カバン」「かばん」や「イチゴ」「いちご」で検索します。
  3. この設定では、漢字キーワードの方が読みキーワードよりもヒット件数が少なくなります。前問同様、Solr Admin UIを用いてデバッグを行いながらヒット件数が異なる理由を検討しましょう。

P23 日本語フィールドへのシノニム適用について(1)

  • シノニムを設定するには、SynonymGraphFilterとManagedSynonymGraphFilterがあります。
    • SynonymGraphFilter は日本語で文字N-gramフィールドでは動作しません。*1
    • ManagedSynonymGraphFilter は日本語フィールドにおいて、形態素解析でも文字N-gramでも正しく動作します(ハイライトも含めて)。*2
  • シノニム辞書ファイルの記述方法やexpandオプションにより、シノニム適用には「正規化」と「展開」の2パターンがあります。
    • 正規化:「キムタク => 木村拓哉」と定義することで、「キムタク」は「木村拓哉」に正規化されるようにする。 ⇒ インデクシング時とクエリ時、両方に定義する。
    • 展開:「キムタク,木村拓哉」と定義することで、「キムタク」または「木村拓哉」は「キムタク」と「木村拓哉」に展開されるようにする。 ⇒ インデクシング時またはクエリ時、どちらかに定義する。
```*```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"/>
  • インデクシング時にシノニムを定義した場合、シノニム辞書を変更したら再インデクシングが必要になります。 以上をまとめると、日本語フィールドにシノニムを適用する場合、以下の組み合わせで設定するのがよいでしょう。
    • SynonymGraphFilterではなく、ManagedSynonymGraphFilterを使う。
    • ManagedSynonymGraphFilterをクエリ側に適用。
    • expand=true(展開)で用いる(正規化ではなく)。
  • こうすることでシノニム辞書定義を変更しても、再インデクシングは不要になります。ただし、コレクションのリロードは必要です。

P25 ManagedSynonymGraphFilterの使い方

  • ManagedSynonymGraphFilterはManaged REST APIを通じてmanagedリソースを操作する必要があります。
    <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を使って行います。

P26 [演習8] シノニムの動作確認(1)

「スマホ」と「スマートフォン」の相互ヒットを行うために、以下を実行してKandaSearch UIから「スマホ」や「スマートフォン」で検索してみましょう。

  1. 類義語辞書の設定
    • プロジェクトの「類義語辞書」メニューを選び、「辞書を追加する」ボタンをクリックします。新規作成タブが選ばれている状態で適当な名前(ここではmydicとします)の類義語辞書を作成します。
    • mydicの「辞書を見る」アイコンを選び、「類義語セットを追加する」をクリックします。
    • 「スマホ」と「スマートフォン」を追加して「確認」で類義語セットを登録します。
  2. 類義語辞書のデプロイ
    • 歯車のアイコンから「辞書をデプロイする」を選びます。
    • デプロイ先のインスタンスとコレクションを選びます。また、ManagedSynonymGraphFilterを選択します。Managedリソースは「synonym-ja」を選びます。
    • パラメーターは次の通り設定し、「確認」で辞書をデプロイをします。
      • tokenizerFactory=solr.JapaneseTokenizerFactory, tokenizerFactory.mode=normal, ignoreCase=true, format=solr
  3. インスタンスビューの「検索」から前問で保存したクエリを呼び出し、「スマホ」や「スマートフォン」で検索し、相互ヒットすることを確認します。

P27 [演習問題]

前の演習を参考に、"pc" <-> "パソコン" <-> "コンピューター" が相互ヒットするように、シノニムを登録して検索してみましょう。

(ヒント1)プロジェクトの「類義語辞書」から前問で作成した辞書mydicを編集します。

(ヒント2)JapaneseKatakanaStemFilterの動作を考慮し、「コンピューター」ではなく「コンピュータ」でシノニム登録を行います。

(ヒント3)歯車アイコンから「辞書をデプロイする」を選んで、デプロイ先を適切に選んでデプロイします。

P28 [演習9] シノニムの動作確認(2)

  1. KandaSearchのライブラリーから「日英外来語類義語辞書(CSV)」を探してローカルPCにダウンロードします。
    • 一旦、インスタンスのlivedoornewsコレクションにダウンロードする必要があります。さらにコンフィグメニューなどからRONDHUIT-loanwords-X.X.X.txtをダウンロードします。
  2. 「類義語辞書」メニューから「辞書を追加する」で新しい辞書loanwordsを作成します。
    • 「インポートの作成」タブから上記手順でダウンロードしたRONDHUIT-loanwords-X.X.X.txtを登録します。インポート完了には数十秒お待ちください。
  3. 歯車アイコンから「辞書をデプロイする」を選んで、デプロイ先を適切に選んでデプロイします。
  4. インスタンスビューの「検索」から、下記例のキーワードのような、カタカナ語とその英単語で検索してみます。
    • 「アディダス」と「adidas」
    • 「ダイアモンド」と「ダイヤモンド」と「diamond」
    • 「ゴールド」と「gold」
    • 「オーディオ」と「audio」

P29 正規化によるシノニム適用について

  • シノニムを適用する際に、必ずしも「展開」形式がいつも正しいわけではありません。
    • 「正規化」の場合、SynonymGraphFilterではexpand=falseとしてCSVファイルを解釈させるか、"=>"記号の表記を使います。ManagedSynonymGraphFilterの場合はJSONで表現します。
  • 正規化が必要になる場面もあります。前問で用いた「日英外来語」の場合で次の場面を考えてみましょう。
    • 展開形式:"cloud" <-> "クラウド" <-> "crowd" ⇒ cloudでcrowdがヒットしてしまう。
    • 正規化形式:"cloud" -> "クラウド", "crowd" -> "クラウド"
    • 展開形式:"mouse" <-> "マウス" <-> "mouth" ⇒ mouseでmouthがヒットしてしまう。
    • 正規化形式:"mouse" -> "マウス", "mouth" -> "マウス"

P30 [演習10] シノニムの動作確認(3)

  1. KandaSearchのライブラリーから「漢字送り仮名表記揺れ類義語辞書(CSV)」を探してローカルPCにダウンロードします。
    • 一旦、インスタンスのlivedoornewsコレクションにダウンロードする必要があります。さらにコンフィグメニューなどからRONDHUIT-kanji-okurigana-X.X.X.txtをダウンロードします。
  2. 「類義語辞書」メニューから「辞書を追加する」で新しい辞書「漢字送り仮名」を作成します。
    • 「インポートの作成」タブから上記手順でダウンロードしたRONDHUIT-kanji-okurigana-X.X.X.txtを登録します。インポート完了には2分弱お待ちください。
  3. 歯車アイコンから「辞書をデプロイする」を選んで、デプロイ先を適切に選んでデプロイします。
  4. インスタンスビューの「検索」から、下記例のキーワードのような、漢字送り仮名表記揺れが発生するキーワードで検索してみます。
    • 「乗り物」と「乗物」
    • 「引っ越し」と「引越し」
    • 「受け付け」と「受付け」と「受付」

P31 Advanced

P32 [演習11] RONDHUIT Solr プラグインの適用

  • さらにきめ細かい日本語検索に対応するため、KandaSearchのライブラリーから「RONDHUIT Solr プラグイン(RCSS)」を探して、livedoornewsコレクションのlibディレクトリにダウンロードします。
  • インスタンスメニューのコンフィグにて、livedoornewsコレクションを選択し、managed-schemaを「編集」で開きます。ブラウザのページ内検索機能を使って、「RCSS」とコメントが書かれているところを探します(全部で5カ所あります)。そのすべてのコメントを外して有効化します。
  • livedoornewsコレクションをリロードして、RCSSライブラリーとmanaged-schemaの修正を有効化します。
  • Livedoorニュースデータを再インデクシングし、以降の演習を実行します。

P33 [演習12] 中黒の対応(Advanced)

  • RCSSのNakaguroCharFilterが効いています。
  • 前の演習でうまく検索できなかった、下記キーワードを検索してみましょう。
    • イーモバイル
    • ハリーポッター
    • ビルゲイツ

P34 [演習13] 和暦・西暦相互検索

  • RCSSのKanjiNumberCharFilterとWarekiCharFilterが効いています。
  • KandaSearch の検索で、以下のように設定します。
    • ボディフィールド:body_wareki
    • ハイライトフィールド(hl.fl):title,body_wareki
    • クエリフィールド(qf):title body_wareki
  • 以下のキーワードを検索してみます。
    • 2011年
    • 平成23年
    • 平成23年
    • 平成二十三年
    • 平成二三年

P35 [演習14] 読みでソート

  • 読み仮名でソートするための下記フィールド定義が有効になっています。
    <dynamicField name="*_ja_kata_srt" type="text_ja_kata_srt" indexed="true" stored="true"/>
    
  • ライブラリーから「演習用データセット」を取得してダウンロードし、ZIPファイルを解凍します。以下のデータ(seminar3-authors.json)をKandaSearch のUIから登録します。
    [
    { "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": "村上 春樹" }
    ]
    
  • 次のパラメーターを使って「著者」フィールドの読みでソートを行います。
    • 検索キーワード:author_ja_kata_srt:[* TO *]
    • タイトルフィールド:author_ja_kata_srt
    • ソート:author_ja_kata_srt asc

P36 [演習15] 会社名の読みでソート(1)

  • 会社名には「株式会社」「一般社団法人」「学校法人」などの法人の種類が商号に含まれて表記されますが、会社名の読みがなでソートしたいとき、これらの法人の種類は取り除いた上でソートしたいことがよくあります。
  • また、「株式会社」という表記は「(株)」(全角のカッコ)や「(株)」(半角のカッコ)や「㈱」などと書かれたり、前株や後株などの位置が自由ないわゆる「表記の揺れ」があります。
  • このような会社名の読みで簡単にソートするための下記フィールド定義が有効になっています。
    <dynamicField name="*_ja_corp_srt" type="text_ja_corp_srt" indexed="true" stored="true"/>
    

P37 [演習15] 会社名の読みでソート(2)

前問で取得した「演習用データセット」の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": "学校法人 神田言語学院" }
]

P38 [演習15] 会社名の読みでソート(3)

  • 次のパラメーターを使って、「会社名」フィールドの読みでソートします。
    • 検索キーワード:corp_ja_corp_srt:[* TO *]
    • タイトルフィールド:corp_ja_corp_srt
    • ソート:corp_ja_corp_srt asc

P39 Q&A, アンケート

P40 (Appendix)Apache Solr のコマンド

P41 インデクシング

  • インデクシングは Apache Solr に付属の post コマンドを使って次のように行います。(Livedoorニュースコーパス(完全版)の例)
    post -url https://<instance-name>.i.kandasearch.nl/solr/livedoornews/update -commit yes livedoor.json
    

P42 ManagedSynonymGraphFilter

以下のようにリソース(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
    
  • 別途JSONファイルを用意する場合
    curl -X PUT -H 'Content-type:application/json' -d @<dictionary-file>.json https://<subdomain>.i.kandasearch.com/solr/livedoornews/schema/analysis/synonyms/synonym-ja
    

お見積もり・詳細は KandaSearch チームに
お気軽にお問い合わせください。

お問い合わせ