第5回 自然言語処理ツールを導入して検索性能を向上させる|Apache Solr ハンズオンセミナー | 拡張機能ライブラリー | KandaSearch

EXTENSIONS

第5回 自然言語処理ツールを導入して検索性能を向上させる|Apache Solr ハンズオンセミナー
無料

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

Misc
第5回 自然言語処理ツールを導入して検索性能を向上させる|Apache Solr ハンズオンセミナー

最新バージョン: 1.3.1

開発者: RONDHUIT

ダウンロード数: 36

最終更新日: 2022-07-01

Copyright: RONDHUIT Co.,LTD

最新バージョン: 1.3.1

開発者: RONDHUIT

ダウンロード数: 36

最終更新日: 2022-07-01

Copyright: RONDHUIT Co.,LTD

Apache Solr ハンズオンセミナー「第5回 自然言語処理ツールを導入して検索性能を向上させる」のスライドです。

第5回 自然言語処理ツールを導入して検索性能を向上させる|Apache Solr ハンズオンセミナー

P01 表紙

第5回 自然言語処理ツールを導入して検索性能を向上させる
Apache Solr ハンズオンセミナー
株式会社ロンウイット
関口宏司 @kojisays

P02 改訂履歴

2022年6月3日 初版
2022年6月16日 Transliteration の演習を追加
2022年6月18日 Apache OpenNLP の固有表現抽出に関する記述の訂正と演習を追加
2022年6月29日 施設名辞書に関する記述を追記。一部誤字を修正
2022年7月1日 固有表現抽出モデルファイル名の誤りを修正

P03 ご注意

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

P04 本日の内容

  • 自然言語処理・機械学習とApache OpenNLP 入門
    • [演習問題] モデルの作成と利用
  • 情報検索の性能評価
    • [演習問題] 精度と再現率
  • 自然言語処理による検索性能改善
    • 類義語辞書
      • 外来語自動抽出のしくみ
      • [演習] Transliteration
    • 文書分類
    • 言語判別
    • 固有表現抽出
  • [演習] 検索のための言語判別
  • [演習] 検索のための固有表現抽出(OpenNLP)
  • [演習] 検索のための固有表現抽出(辞書ベース)
  • 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 自然言語処理・機械学習とApache OpenNLP入門

P10 自然言語処理とは?

  • NLP = Natural Language Processing
  • 計算機で自然言語を処理する
    • 自然言語:人が日常で使う言語 ⇔ プログラミング言語
    • 人工知能研究の一分野
  • 歴史
    • 機械翻訳(直接翻訳方式による;1947年〜)

P11 機械学習とは?

  • 機械学習
    • コンピューターに人間のような学習能力をつけさせる技術の総称
    • データからモデルを学習 ⇒ 学習後のモデルを用いて未知データを分類したり、シミュレーションなどを行う
  • モデル
    • ある現象を表現している数式や図。データの数学的な要約
    • (例)自然現象を理解しようとするとき、仮定をおいてモデルを作る

P12 [演習問題] モデルの作成と利用

  1. ある現象を確認したところ、次のような数列が観測されました。適当な仮定をおいて、モデル(表や数式)を作成してみましょう。

1,1,2,3,5,8....

ic 1 2 3 4 5 6
x(i) 1 1 2 3 5 8

モデル
x(i) = x(i - 1) + x(i - 2) (i > 2)

  1. 前問で作成したモデルを使って、次に来る数字を予測してください。

13,21,?

モデル
x(i) = x(i - 1) + x(i - 2) (i > 2)

34

P13 教師あり学習と教師なし学習

  • 学習時に「正解(教師ラベル)」が参照できる場合は「教師あり学習」、「正解」が不明な場合は「教師なし学習」
  • 教師あり学習
    • 特徴ベクトル(新聞記事などの文書)+教師ラベル(記事のカテゴリなど)
  • 教師無し学習
    • 特徴ベクトル(新聞記事などの文書)

P14 Livedoorニュースコーパス(文書データ例) (再掲)第3回 日本語表記揺れ検索を極める

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

P15 生コーパスの応用例

  • スマホの単語アシスト機能
    • "o" とタイプしたときに、それまでに入力された単語列(コンテキスト;文脈)に応じて "o" で始まる単語の種類を変えながらアシスト(入力補助)する。
    • 生コーパスから言語モデル(単語列に対する確率モデルを表す)を作成することで実現可能。

私はoXXXXを送った。⇒ order, offer

私はoXXXXを食べた。⇒ orange, onion

P16 文書のベクトル表現

  • Bag-of-Words
    • NLPで頻繁に使われる文書のベクトル表現形式
    • 各単語が何回出現したか。語順、文の構造などは表現に表れない
  • 1文書に1つの袋を用意し、文書に使われる単語を袋に入れた状態

P17 スコア計算 (再掲)第1回 Apache Solr 入門

スコア=クエリと文書の関連度
e.g. score( q, d ) = cos( q, d )

値は単語の重要度(ここでは個数)
tf*idf などが使われることが多い。

Apache OpenNLP

  • 基本的なNLPタスクのツールキット(教師あり学習)
    • [分類] 言語判別、文書分類
    • [系列ラベリング] 文識別、トークン化/単語分割、品詞タグ付け、固有表現抽出、チャンク化
    • [その他NLP] レンマ化、構文解析
  • 海外ではビジネス利用もされている(Apache License)
  • Java API。柔軟な素性(特徴ベクトル)設定

P19 - P27 情報検索の性能評価

positive negative
true tp tn
false fp fn

tn(true negative) fp(false potitive) tp(true psitive) fn(false negative)
result target

P28 - P30 情報検索の性能評価

tn(true negative) fp(false potitive) tp(true psitive) fn(false negative)
result target

精度(適合率 Precision)=|tp| / (|tp| + |fp|) 再現率(recall)=|tp| / (|tp| + |fn|)

P31 [演習問題] 精度と再現率

2022年6月1日 朝日新聞デジタル「『線状降水帯』予測情報、きょうから開始 精度向上へ集中観測も」 ・・・同庁が過去3年の事例で検証したところ、予測した地方で発生を的中できるのは4分の1程度。3回に2回は予測できず発生する。・・・

Q1. 前述のようなベン図で表現するとどうなるでしょうか。描いてみましょう。

Q2. 精度(Precision)と再現率(Recall)はそれぞれいくつになるでしょうか。(A2. 精度 P = 1/4 再現率 R = 1/3)

P32 自然言語処理による検索性能改善

P33 検索性能改善のためのロンウイットの基本戦略

(1) 再現率を高める(検索漏れがないようにする)

(2a) 漸次的精度改善

(2b) ランキングチューニング

P34 (1) 再現率を高める(例) SynonymGraphFilter - samples

省略語

WWW, World Wide Web
WHO, World Health Organization
CEO, Chief Executive Officer
CTO, Chief Technology Officer
:

q=WHO → SynonymGraphFilter → expand query → 「I joined World Health Organization in 1995.」

外来語

internet, インターネット
interface, インターフェイス, インタフェース
computer, コンピューター
server, サーバー
:

q=サーバー → SynonymGraphFilter → expand query → 「I sold the server to buy foods.」

P35 外来語自動抽出のしくみ

1.クロール
↓
2.カタカナ語とアルファベット語が近接するペアを抽出
↓
アルゴリズム, algorithm
↓
3."アルゴリズム"
↓
4.Transliteration
↓
"algorism"
↓
5.algorithm 編集距離を計算
↓
6.編集距離が閾値以内であれば最初に拾ったペアが互いに同じものであるとして類義語辞書に出力。

synonyms.txt
アルゴリズム, algoritm

P36 [演習3] Transliteration(翻字)

KandaSearch のライブラリーにある Transliterator(翻字プログラム)をプロジェクトに追加し、ダウンロードして ZIP を解凍し、次のように実行してカタカナ語から英単語、英単語からカタカナ語を推定させてみましょう。

java -jar transliterator.jar アルゴリズム
algorism

# "-r" オプションで英単語⇒カタカナ語の推定
java -jar transliterator.jar -r algorithm
アルゴリズム

# 文字化けしてしまう場合は "-Dfile.encoding=UTF-8" を使います
java -Dfile.encoding=UTF-8 -jar transliterator.jar -r restaurant
レストオーラント

P37 検索性能改善のためのロンウイットの基本戦略

(1) 再現率を高める(検索漏れがないようにする)

(2a) 漸次的精度改善

P38 (2a) 漸次的精度改善

Solrへのリクエスト:

GET http://solr/foo
    ?q=watch
    &facet=on
    &facet.field=gender
    &facet.query=price:[1 TO 100]
    &facet.query=price:[101 TO 200]
    :

P39 (2a) 漸次的精度改善

Solrへのリクエスト:

GET http://solr/foo
    ?q=watch
    &facet=on
    &facet.field=gender
    &facet.query=price:[1 TO 100]
    &facet.query=price:[101 TO 200]
    :
    &fq=gender:mens

filter by Gender
x Men's

P40 (2a) 漸次的精度改善

Solrへのリクエスト:

GET http://solr/foo
    ?q=watch
    &facet=on
    &facet.field=gender
    &facet.query=price:[1 TO 100]
    &facet.query=price:[101 TO 200]
    :
    &fq=gender:mens
    &fq=price:[101 TO 200]

filter by Gender
x Men's

filter by Price
x $101-$200

P41 構造化文書

id product price gender
1 CURREN New Men’s Date Stainless Steel Military Sport Quartz Wrist Watch 52.00 mens
2 Suiksilver The Gamer Watch 132.99 mens

OR

[
  { “id”: 1,
    “product”: “CURREN New Men’s Date Stainless Steel Military Sport Quartz Wrist Watch”,
    “price”: 52.00,
    “gender”: “mens” },
  { “id”: 2,
    “product”: “Suiksilver The Gamer Watch”,
    “price”: 132.99,
    “gender”: “mens” }
]

P42 非構造化文書

id body
1 Rebekah Jones was the manager of the Geographic Information System team at Florida's Department of Health.
2 During what Commissioner Roger Goodell described as a two-hour meeting, the NFL made some changes in its approach to diversity, equity, and inclusion through an expansion of the Rooney Rule.

P43 文書分類とは?

  • 文書分類とは?
    • テキストの内容に応じて適切な分類ラベルを付与するタスク。
  • 応用例
    • ECサイトの商品の自動分類。
    • オークションサイトの出品物のカテゴリー提示。
    • クレジットカードや住宅ローンの自動与信審査。
    • スパムメール判定。

P44 文書分類

[
  {
    “title”: “Florida Ousts Top COVID-19 Data Scientist”,
    “body”: “Rebekah Jones was the manager of the Geographic Information System team at Florida's Department of Health.”,
    “date”: “19/May/2020”
  },
  {
    “title”: “NFL passes expansion of Rooney Rule”,
    “body”: “During what Commissioner Roger Goodell described as a two-hour meeting, the NFL made some changes in its approach to diversity, equity, and inclusion through an expansion of the Rooney Rule.”,
    “date”: “19/May/2020”
  },
  :
]


文書分類 - model

[
  {
    “title”: “Florida Ousts Top COVID-19 Data Scientist”,
    “body”: “Rebekah Jones was the manager of the Geographic Information System team at Florida's Department of Health.”,
    “category”: “science”,
    “date”: “19/May/2020”
  },
  {
    “title”: “NFL passes expansion of Rooney Rule”,
    “body”: “During what Commissioner Roger Goodell described as a two-hour meeting, the NFL made some changes in its approach to diversity, equity, and inclusion through an expansion of the Rooney Rule.”,
    “category”: “sports”,
    “date”: “19/May/2020”
  },
  :
]

P45 固有表現抽出とは?

テキストから固有名詞を属性(固有名詞タイプ)付きで抽出するタスクを固有表現抽出(Named Entity Extraction; NEE)と呼びます。

location person title                 organization
東京都の小池百合子知事は25日記者会見し、「希望の党」を立ち上げ...

P46 固有表現抽出

[
  {
    “title”: “Florida Ousts Top COVID-19 Data Scientist”,
    “body”: “Rebekah Jones was the manager of the Geographic Information System team at Florida's Department of Health.”,
    “date”: “19/May/2020”
  },
  {
    “title”: “NFL passes expansion of Rooney Rule”,
    “body”: “During what Commissioner Roger Goodell described as a two-hour meeting, the NFL made some changes in its approach to diversity, equity, and inclusion through an expansion of the Rooney Rule.”,
    “date”: “19/May/2020”
  },
  :
]


固有表現抽出 - model

[
  {
    “title”: “Florida Ousts Top COVID-19 Data Scientist”,
    “body”: “Rebekah Jones was the manager of the Geographic Information System team at Florida's Department of Health.”,
    “person”: “Rebekah Jones”,
    “title”: “manager”,
    “org”: “Florida's Department of Health”,
    “date”: “19/May/2020”
  },
  {
    “title”: “NFL passes expansion of Rooney Rule”,
    “body”: “During what Commissioner Roger Goodell described as a two-hour meeting, the NFL made some changes in its approach to diversity, equity, and inclusion through an expansion of the Rooney Rule.”,
    “person”: “Roger Goodell”,
    “title”: “Commissioner”,
    “org”: “NFL”,
    “date”: “19/May/2020”
  },
  :
]

P47 言語判別と Apache Solr からの利用

  • NLPの「言語判別」タスクとは?
    • テキストが「何語」で書かれているか推定するタスク。
  • 検索エンジン(Apache Solr)になぜ言語判別が必要なのか?
    • (グローバル)企業には各国語で書かれた文書(Word/PDF/Excel/PPT etc.)が存在し、それを検索したい。
    • 正しくインデックスを作成するために、スキーマ設定で各国語ごとにフィールド型を分ける必要がある。(例:英語ではtext_en、日本語ではtext_jaとtext_2g)
    • 一方、検索対象文書は人がオープンして読まないと何語で書かれているかわからない場合がある。 ⇒ インデクシング時に「検索対象文書が何語で書かれているか」を自動判別したい、という需要が生じる。
  • なお、Apache Solrでは、検索時は自動判別を行わず、edismaxを使い、必要なだけ各国語のフィールドをqfで横断的に指定する。

P48 検索性能改善のためのロンウイットの基本戦略

(1) 再現率を高める(検索漏れがないようにする)

(2b) ランキングチューニング

P49 (2b) ランキングチューニング(チューニング前)

result 50 100 500 1 2 3

target 50 100 500

P50 (2b) ランキングチューニング(チューニング後)

result 1 2 3

target 1 2 3

P51 Apache Solr と KandaSearch による解決

文字正規化辞書、類義語ツール、外来語辞書、日本語文字表記揺れ対策
 │ │
 │ └→ ファセットと絞り込み検索、文書分類、固有表現抽出、言語判別
 │
 └→ クリックモデル、ハイパーパラメーター探索、ランキング学習

P52 [演習4] 検索のための言語判別

  1. KandaSearch ライブラリにある Livedoor ニュースコーパスの config をインポートしてコレクション livedoornews を作成します。

  2. コンフィグメニューで livedoornews の solrconfig.xml を「編集」で開き、次のコメント箇所を探して、コメントを外して有効化します。

    <!-- uncomment when you index data for langid exercise
    <requestHandler name="/update" class="solr.UpdateRequestHandler">
     <lst name="defaults">
       <str name="update.chain">langid</str>
     </lst>
    </requestHandler>
    -->
    

    本来はこのようなやりかたではなく、Appendixにある方法で update.chain=langid パラメーター付きでインデクシングします。

  3. livedoornews コレクションをリロードします。

P53 [演習4] 検索のための言語判別(つづき)

  1. KandaSearch ライブラリにある演習用データセットを入手してローカルPCにダウンロードしてZIPファイルを解凍します。

  2. 解凍した中にある以下の演習用データ seminar5-langid.json を livedoornews コレクションにインデクシングします。

    [
    {"id": "en-1", "title": "This is an English text.", "body": "It is fine today."},
    {"id": "de-1", "title": "Dies ist deutscher Text.", "body": "Es ist heute fein."},
    {"id": "fr-1", "title": "C'est texte français.", "body": "C'est fin aujourd'hui."},
    {"id": "ja-1", "title": "これは日本語のテキストです。", "body": "今日はいい天気です。"}
    ]
    
  3. KandaSearch の検索、またはSolr Admin UIで全件検索し、各国言語の文書が正しく各国語用のフィールドに振り分けられていることを確認します。

P54 [演習5] 検索のための固有表現抽出(OpenNLP)

  1. 前問で作成したlivedoornewsコレクションを使います。solrconfig.xmlの以下の箇所を探してコメントアウトを外して有効化します。
<!-- depends on OpenNLP NER model
<updateRequestProcessorChain name="opennlp-ner">
  <processor class="solr.OpenNLPExtractNamedEntitiesUpdateProcessorFactory">
    <str name="modelFile">RONDHUIT-ja-ner-1.0.0.bin</str>
    <str name="analyzerFieldType">opennlp-tokenization</str>
    <str name="source">body</str>
    <str name="dest">ner_{EntityType}</str>
  </processor>
  <processor class="solr.UniqFieldsUpdateProcessorFactory">
    <str name="fieldRegex">ner_.*</str>
  </processor>
  <processor class="solr.RunUpdateProcessorFactory" />
  <processor class="solr.LogUpdateProcessorFactory" />
</updateRequestProcessorChain>
-->

P55 [演習5] 検索のための固有表現抽出(OpenNLP;つづき)

  1. 同じく前問でコメントアウトを外して有効化した"langid"を"opennlp-ner"に書き換えます。
    <requestHandler name="/update" class="solr.UpdateRequestHandler">
     <lst name="defaults">
       <str name="update.chain">langid</str>
     </lst>
    </requestHandler>
    
  2. ライブラリーからLivedoorニュースの固有表現抽出モデルを探し、livedoornewsコレクションのconfにダウンロードし、コレクションをリロードします。
  3. ライブラリーからLivedoorニュースコーパス(mini)を入手し、インスタンスのオーバービューから登録します。
  4. インスタンスの検索からlivedoornewsコレクションをedismaxを使って検索します。検索結果画面に"ner_"で始まるファセットが表示されますが、これらが機械学習モデルベースで抽出された固有名詞になります。

P56 [演習6] 検索のための固有表現抽出(辞書ベース)

Apache OpenNLP の固有表現抽出は、機械学習モデルベースで動作するため、適切なモデルファイルが必要です。ここでは別の方法として、モデルファイルがなくても動作する、RCSSの「辞書ベースのNEE」機能を使う方法を紹介します。

  1. KandaSearch のライブラリーから、RCSSを探してプロジェクトに登録します。さらに「詳細」からlivedoornews コレクションにダウンロードします。
  2. 同じく、KandaSearch のライブラリーから、Livedoorニュースコーパス(mini)を探してプロジェクトに登録します。さらに「詳細」からローカルPCにダウンロードします。

P57 [演習6] 検索のための固有表現抽出(辞書ベース;つづき)

  1. コンフィグから livedoornews コレクションを選択して solrconfig.xml を「編集」で開きます。前の演習でコメントを外した下記部分の"opennlp-ner"を"known"に書き換えます。
    <requestHandler name="/update" class="solr.UpdateRequestHandler">
     <lst name="defaults">
       <str name="update.chain">opennlp-ner</str>
     </lst>
    </requestHandler>
    
  2. さらに、solrconfig.xml の中で RCSS と書かれているコメントを外して有効化します。
  3. livedoornews コレクションをリロードします。
  4. インスタンスのオーバービューから livedoornews コレクションに、あらかじめダウンロードしておいた Livedoorニュースコーパス(mini)をインデクシングします。
  5. KandaSearch の検索にて「病名」や「施設名」で絞り込み検索ができることを確認します。 「施設名」に関しては、別途ライブラリーに「施設名|専門用語辞書」のエクステンションがありますので適宜ご利用ください。

P58 Q&A, アンケート

P59 (Appendix)Apache Solr のコマンド

P60 インデクシング(言語判別)

  • インデクシング時に言語判別を行うには、Apache Solr に付属の post コマンドを使って次のように行います。
    post -url https://<instance-name>.i.kandasearch.com/solr/langid/update seminar5-langid.xml -params "update.chain=langid"
    

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

お問い合わせ