Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
• 導入編:10分で振り返るAzure Search概要と
活用事例のご紹介
• 基礎編:
検索の専門的な知識不要で容易にリッチ検索アプリの構築を可能と
し、また完全マネージドで運用管理コストも削減することができる
→ アプリ/サービス開発に集中できる
地理空間検索
全てAzure Searchの機能で実現していま
す
http://azjobsdemo.azurewebsites.net/
インデックス追加・更新 /indexes/<indexname> PUT
インデックス一覧表示 /indexes GET
インデックス統計情報取得 /indexes/<indexname>/stats GET
インデックスの削除 /indexe...
Free Basic Standard S1 Standard S2
Maxサービス数 1 12 12 6
Maxインデックス
数/サービス
3 5 50 200
Maxドキュメント
数/サービス
1000
0
100万 1500万/P
(1....
https://www.microsoft.com/ja-jp/casestudies/ffs.fujifilm.aspx
Id: 375
Question: “What is..?”
Answer: “This is …”
Category: “Azure”
Keywords: “kw1”,”kw2”,
URL: “https://...”
ドキュメント
フィール...
再現率(Recall)
適合率
(Precision)
検索ヒット数↑
検索ノイズ ↑
検索精度↑
検索漏れ↑
再現率、適合率の最適なブレイクポイント
QueryParser Search
Engine
Analyzer
IndexWriter
インデックスSimple lucene
Analyzed
terms
Query
terms
Query
tree
Query
text
Docume...
# ドキュメント
1 Microsoft’s new cloud
search service is …
2 A cloud based search
application on Azure
3 Application programming...
アナライザーについて
• インデックス生成処理とクエリ処理の両方で実行される
テキスト解析処理
• フィールド単位で個別のアナライザーを設定可能
• 独自アナライザの定義も可能
吾輩は猫ながら時々考える事
がある。・・・
インデックス処理 クエリ処理
トークン
ja...
マイクロソフト自然言語処理(NLP)技術
ja.microsoft
Lucene Core
ja.lucene kuromoji
言語別アナライザー一覧
日本語の場合ja.luceneかja.microsoftの2択と考えてよ
い
reference
https://<アカウント名>.search.windows.net/indexes/<インデックス名>/analyze
{
"text": "テキスト",
"analyzer":"アナライザ名"
}
{
"tokens"...
Demo
Analyze APIでアナライザーの
テキスト解析結果を確認
利用ツール: azure-search-ta (Test Analyzer)
https://github.com/yokawasa/azure-search-ta
クエリ―について
https://<アカウント名>.search.windows.net/indexes/<インデックス名
>/docs
&search=“xxx”
&searchMode=all
&queryType=full
?api-version
=20...
/indexes/myindex/docs
?$filter=geo.intersects
(loc,geography'POLYGON((
-122.03157 47.57858,
-122.13157 47.67858,
-122.0315...
search= A B の例
(1) search=A B&searchMode=any (2) search=A B&searchMode=all
⇒ search=A OR B ⇒ search=A AND B
any all
simple full
クエリーパーサーを選択
Simple クエリ (simple)
• 規定のクエリで表現性は低い
• AND, OR, NOT 検索
• ワイルドカード検索
• フレーズ検索
• グループ化
(full)
• Apache...
Demo
あいまい検索
ランキングについて
TF-IDF
ベース
のスコア
スコアリング
プロファイル
による調整
ランクスコア
Σ
ランキングのチューニングは
スコアリングプロファイルで行う
プロファイル名search=キーワード&scoringPorfile=
フィールドウェイト設定
freshness (鮮度) 度合いによるブースト
"scoringProfiles": [
{
"name": "プロファイル名",
"text"...
同義語辞書
Public Preview
クエリ処理
Microsoft
「Microsoft」で検索
インデックス
Synonym
Maps
Microsoft
OR MSFT
OR MS
OR マイクロソフト
…
Microsoft, MSFT, MS, マイクロソフト
…
「Mi...
登場人物 役割 設定箇所 変更コスト
アナライザー テキストのトークン化 インデックススキーマ 大
(小: 新規フィールド追
加でアナライザ設定)
クエリ トークンの絞り込み、マッ
チングの挙動と結果評価の
制御
クエリパラメータ 小
ランキン...
Demo
QnA Makerで日本語質問
QnA Maker
https://qnamaker.ai
Azure関連FAQ
Demo
Azure Search QnA Bot
で日本語質問
AzureSearch QnA Bot Code:
https://github.com/yokawasa/decode2017
Azure関連FAQ
最適なフィールド属性の定義
• 必要最低限の機能有効化。特に不要な言語解析処理
(searchable)は避ける
最適なアナライザーの選定
• テキスト解析の基本処理なので選択は慎重に
• 基本的に日本語はja.luceneかja.micros...
{
"name": "qnakb",
"fields": [
{ "name":"id", "type":"Edm.String", "key":true,
"searchable":false, "filterable":false, "so...
{
"fields": […],
"scoringProfiles": [
{
"name": "weightedFields",
"text": {
"weights": {
"question": 9,
"answer": 1
}
}
}
...
スペルミス・タイプミス対策
• あいまい検索(fuzzy)や近似検索( Proximity)
ランキングのパーソナライズ
• ユーザの位置/関心内容に応じてランキングを変える
– 距離/Tagブースト
自前でテキスト解析処理を施す
• Azur...
Azure 検索
クラウド ドキュメントA (score:
0.312)
Tags:
ドキュメントB (score:
0.291)
Tags:
Azur
e
ドキュメントC (score:
0.164)
Tags:
サーチ
ドキュメントA (s...
https://text-analytics-demo.azurewebsites.net/
抽出したキーワードをQnA
検索用インデックスのtags
フィールドに格納する
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。
Y
A
X B
セッションアンケートにご協力ください
 専用アプリからご回答いただけます。
decode 2017
 スケジュールビルダーで受講セッションを
登録後、アンケート画面からご回答ください。
 アンケートの回答時間はたったの 15 秒です!
Ask the Speaker のご案内
本セッションの詳細は『Ask the Speaker Room』各コーナーカウンタにて
ご説明させていただきます。是非、お立ち寄りください。
• 文字列のトークン化
• 語幹変化/見出し語変化
• 正規化
• ストップワード除去
• アンチフレージング
検索結果の再現率/適合率
向上のため手法
主要なテキスト解析処理
→ 方式: 形態素解析, N-
Gram
文字フィルタ
文字レベルの加工処理
トークナイザ
文字列をトークン化
トークンフィルタ
トークンごとに加工
0個以上定義可
1つのみ
0個以上定義可
a s
文字列をトークンに分かち書き
トークンを小文字化
ストップワードを削除
文字列からHT...
Azure Search Built-in モジュール一覧
https://docs.microsoft.com/en-us/rest/api/searchservice/custom-analyzers-in-azure-
search#pr...
"analyzers":(optional)[
{
"name":"analyzer_name_1",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"charFilters":...
日本語用N-gramアナライザ
やりたいこと
• 入力された文字列に対して
• HTMLタグを除去したい
• 文字列の分割
• 3グラムで分割したい
• 分割後のトークンに対して
• 全角・半角文字を統一させたい
• 大文字を小文字に変換させた...
文字列分かち書き
(3グラム)
HTML_Strip HTMLタグを削除
(吾輩|わがはい|私|自分)
(猫|ねこ|ネコ|CAT)
“吾輩”と”猫”を同義語展開
(猫|ねこ|ネコ|CAT)
“ネコ” を同義語展開
半角カタカナ全角化
文字列分か...
AND検索「+」A+B : AかつB
query: Azure+Search
OR検索「|」 A|B: A, B or Both
query: Azure|Search
NOT検索
「-」A-B: A or (NOT B)
query: Azu...
フィールドスコープ「field:term」検索対象フィールドの指定
query: session:Azure AND Search
query: session:“Azure Search" AND “Azure AD"
あいまい検索「term...
ブースティング「term^N」または「phrase^N」(N:ブースト値
default=1): ^で指定した単語またはフレーズをN値分ブーストさせてより
適合性の高いものにする(ランキングをN値分上げる)
query: apache luce...
• レーベンシュタイン距離(編集距離)
AzuuuとAzureの例
レーベンシュタイン距離=2
• Azuuu → Azuru (“u”と”r”の入れ替
え)
• Azuru → Azure (“u”と”e”の入れ替え)
2回入れ替えて同じにな...
{
"name": "mysynonymmap",
"format":"solr",
"synonyms": "
MS, MSFT, Microsoft
Washington, Wash., WA => WA
pet => cat, dog, ...
フォーマット詳細:Lucene SolrSynonymParser APIリファレンス
i-pod, i pod => ipod
i-pod, i pod, ipod
foo => foo, bar
foo => baz
foo => foo,...
{
"name":"tags",
"type":"Collection(Edm.String)",
"searchable":false,
"filterable":true,
"sortable":false,
"facetable":fal...
正規化の例
• U.S.A → USA
• Co-education → coeducation
• 半角カタカナ→全角カタカナ
• カタカナ→ひらがな
• Alphabētikós Katálogos →
Alphabetikos Katal...
© 2017 Microsoft Corporation. All rights reserved.
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
Upcoming SlideShare
Loading in …5
×

[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法

3,029 views

Published on

情報検索サービスで、優れたアプリケーション UI や充実した情報ソースを持っていながら、検索精度が悪く肝心の情報がうまく取り出せていないケースを散見します。検索精度はサービスの利便性に直結しており、最重要課題です。このセッションでは、Azure 上のフル マネージド型全文検索サービスである Azure Search のテキスト分析やマッチングの仕組みを解説しつつ、検索精度を効果的に向上させるための機能やノウハウをご紹介します。また、検索機能と親和性のある Bot インターフェースやAI (人工知能) 機能など、最近注目を集めているテクノロジーの Azure Search との連携による利便性向上例についてもご紹介します。

受講対象: アプリケーション開発に携わるすべての皆様、検索機能に関心のある皆様、今運用されている情報取り出し型のアプリケーションに短時間でそこそこの利便性を実現したいと考えている皆様、是非ご参加ください。

関連リソース 1: Azure Search (https://azure.microsoft.com/ja-jp/services/search/)
関連リソース 2: Unofficialism (http://unofficialism.info/)
関連リソース 3: [AC08] 新世代のアーキテクチャに移行せよ。富士フイルムの事例に学ぶ、クラウドネイティブソリューションのビジョンと設計R (https://www.microsoft.com/ja-jp/events/decode/2017/sessions.aspx#AC08)

川﨑 庸市
日本マイクロソフト株式会社
クラウド & ソリューションビジネス統括本部 Azure & クラウドインフラストラクチャ技術本部
クラウドソリューションアーキテクト

Published in: Technology
  • Be the first to comment

[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法

  1. 1. • 導入編:10分で振り返るAzure Search概要と 活用事例のご紹介 • 基礎編:
  2. 2. 検索の専門的な知識不要で容易にリッチ検索アプリの構築を可能と し、また完全マネージドで運用管理コストも削減することができる → アプリ/サービス開発に集中できる
  3. 3. 地理空間検索 全てAzure Searchの機能で実現していま す http://azjobsdemo.azurewebsites.net/
  4. 4. インデックス追加・更新 /indexes/<indexname> PUT インデックス一覧表示 /indexes GET インデックス統計情報取得 /indexes/<indexname>/stats GET インデックスの削除 /indexes/<indexname> DELETE ドキュメント追加・削除 /indexes/<indexname>/docs/index POST 検索 /indexes/<indexname>/docs GET ドキュメントlookup /indexes/<indexname>/docs/<key> GET ドキュメント数取得 /indexes/<indexname>/docs/$count GET サジェスション /indexes/<indexname>/docs/suggest GET テストアナライザ /indexes/<indexname>/analyze POST https://<アカウント名>.search.windows.net { "@odata.context": "https://yoichikademo.search.windows.net /indexes('messages')/$metadata#Collectio n(Microsoft.Azure.Search.V2016_09_01.Ind exResult)", "value": [ { "errorMessage": null, "key": "1", "status": true, "statusCode": 201 }, { "errorMessage": null, "key": "2", "status": true, "statusCode": 201 }, { "errorMessage": null, "key": "3", "status": true, "statusCode": 201 } ] } ※ APIバージョン 2016-09-21の機能一覧。バージョンごとの機能についてはこちらを参照ください
  5. 5. Free Basic Standard S1 Standard S2 Maxサービス数 1 12 12 6 Maxインデックス 数/サービス 3 5 50 200 Maxドキュメント 数/サービス 1000 0 100万 1500万/P (1.8億/サービス) 6000万/P (7.2億/サービス) Maxストレージ サイズ/サービス 50MB 2GB 25GB/P (300GB/サービス ) 100GB/P (1.2TB/サービス) Maxパーティショ ン数/サービス N/A 1 12 12 Maxレプリカ数/ サービス N/A 3 12 12 Maxサーチユニッ ト数/サービス N/A 3 36 36 クエリ数/秒 (QPS) 目安 N/A 〜3/R 〜15/R 〜60/R Standard S3 Standard S3 HD 6 6 200 1000/P (3000/サービス) 1.2億/P (14億/サービス) 2000万/P (100万/インデックス) 200GB/P (2.4TB/サービス) 200GB/P (600G/サービス) 12 3 12 12 36 36 >60/R >60/R
  6. 6. https://www.microsoft.com/ja-jp/casestudies/ffs.fujifilm.aspx
  7. 7. Id: 375 Question: “What is..?” Answer: “This is …” Category: “Azure” Keywords: “kw1”,”kw2”, URL: “https://...” ドキュメント フィールド テキストトークン インデックス
  8. 8. 再現率(Recall) 適合率 (Precision) 検索ヒット数↑ 検索ノイズ ↑ 検索精度↑ 検索漏れ↑ 再現率、適合率の最適なブレイクポイント
  9. 9. QueryParser Search Engine Analyzer IndexWriter インデックスSimple lucene Analyzed terms Query terms Query tree Query text Documents terms Analyzed terms Retrieve Ingest Analyzer ドキュメント 検索処理 • クエリーを元に トークン引き当て • ランキング処理 クエリ文を解析し内部 クエリ―形式に変換 テキスト解析を行いトークンの 展開、変換、削除などを行う 転置インデックス インデックス生成処理 本セッションは ここにフォーカス
  10. 10. # ドキュメント 1 Microsoft’s new cloud search service is … 2 A cloud based search application on Azure 3 Application programming for Microsoft Azure … … トークン トークンが含まれる ドキュメント# Microsoft 1, 3 search 1, 2 service 1 cloud 1, 2 Azure 2, 3 application 2, 3 programming 3 … … 「Azure」で検索 テキスト解析 インデクシング
  11. 11. アナライザーについて
  12. 12. • インデックス生成処理とクエリ処理の両方で実行される テキスト解析処理 • フィールド単位で個別のアナライザーを設定可能 • 独自アナライザの定義も可能 吾輩は猫ながら時々考える事 がある。・・・ インデックス処理 クエリ処理 トークン ja.luceneアナライザーの例
  13. 13. マイクロソフト自然言語処理(NLP)技術 ja.microsoft Lucene Core ja.lucene kuromoji 言語別アナライザー一覧 日本語の場合ja.luceneかja.microsoftの2択と考えてよ い
  14. 14. reference https://<アカウント名>.search.windows.net/indexes/<インデックス名>/analyze { "text": "テキスト", "analyzer":"アナライザ名" } { "tokens": [ { "token" : "トークン1", "startOffset": 0, "endOffset": 4, "position": 0 }, { "token": "トークン2", "startOffset": 5, "endOffset": 7, "position": 1 }, .... ]} { "text": "テキスト", "tokenizer": "トークナイザ名", “tokenFilters”:(任意)[フィルタ(複数)], "charFilters":(任意)[フィルタ(複数)] } Public Preview
  15. 15. Demo Analyze APIでアナライザーの テキスト解析結果を確認 利用ツール: azure-search-ta (Test Analyzer) https://github.com/yokawasa/azure-search-ta
  16. 16. クエリ―について
  17. 17. https://<アカウント名>.search.windows.net/indexes/<インデックス名 >/docs &search=“xxx” &searchMode=all &queryType=full ?api-version =2016-09-01 &$count=true &$top=5 &$skip=10 &$select=title,speaker &$orderby=level desc &facet=tag &highlight=title • 絞り込み用 • アナライザとランキング処理共に無し • oData式構文サブセット • and, or, not, eq, lt, any, all search • searchクエリ文字列 • クエリ文字列にアナライザー処理 • ランキング処理 searchMod e • Booleanクエリ評価方法を決定 (all|any) queryType • クエリパーサーを選択(simple|full) &$filter = xxx
  18. 18. /indexes/myindex/docs ?$filter=geo.intersects (loc,geography'POLYGON(( -122.03157 47.57858, -122.13157 47.67858, -122.03157 47.57858))') &search=キーワード 検索 (アナライザ+ ランキング) 絞り込み 特定ポリゴン内に存在するドキュメント検索
  19. 19. search= A B の例 (1) search=A B&searchMode=any (2) search=A B&searchMode=all ⇒ search=A OR B ⇒ search=A AND B any all
  20. 20. simple full クエリーパーサーを選択 Simple クエリ (simple) • 規定のクエリで表現性は低い • AND, OR, NOT 検索 • ワイルドカード検索 • フレーズ検索 • グループ化 (full) • Apache Luceneクエリが利用可 • 表現性の高いクエリ言語 • フィールドスコープ • あいまい検索(fuzzy) • 近似検索(proximity) • Termブースティング • 正規表現 • ワイルドカード検索 • フレーズ検索
  21. 21. Demo あいまい検索
  22. 22. ランキングについて
  23. 23. TF-IDF ベース のスコア スコアリング プロファイル による調整 ランクスコア Σ ランキングのチューニングは スコアリングプロファイルで行う
  24. 24. プロファイル名search=キーワード&scoringPorfile= フィールドウェイト設定 freshness (鮮度) 度合いによるブースト "scoringProfiles": [ { "name": "プロファイル名", "text": (optional) { "weights": { "field_name1": 相対的ウェイト値, ... } }, "functions": (optional) [ { "type": "関数タイプ", "boost": ブースト値, "fieldName": "対象フィールド名", "interpolation": "数値補間方法", } ], “functionAggregation”: ”関数合計算出 方法" }], 関数合計値算出方法:sum(規定)|average | minimum | maximum | firstMatching magnitute (数値、範囲) 度合いによるブースト distance (距離) 度合いによるブースト tag で指定した値が含まれるかどうかでブースト 関数 プロファイル名 searchableフィールドにのみ有効 filterableフィールドにのみ有効
  25. 25. 同義語辞書 Public Preview
  26. 26. クエリ処理 Microsoft 「Microsoft」で検索 インデックス Synonym Maps Microsoft OR MSFT OR MS OR マイクロソフト … Microsoft, MSFT, MS, マイクロソフト … 「Microsoft」でクエリを投げ 「マイクロソフト」,「MSFT」, 「MS」が含まれた文書もヒット Public Preview
  27. 27. 登場人物 役割 設定箇所 変更コスト アナライザー テキストのトークン化 インデックススキーマ 大 (小: 新規フィールド追 加でアナライザ設定) クエリ トークンの絞り込み、マッ チングの挙動と結果評価の 制御 クエリパラメータ 小 ランキング 関連度(スコア)の計算 スコアリングプロファイル クエリパラメータ 小 同義語辞書 辞書ベースのキーワードの 展開(クエリ側でのみ) 同義語辞書 インデックススキーマ 小 (大: 既存フィールドへ の新規定義追加が必要 な場合)
  28. 28. Demo QnA Makerで日本語質問 QnA Maker https://qnamaker.ai Azure関連FAQ
  29. 29. Demo Azure Search QnA Bot で日本語質問 AzureSearch QnA Bot Code: https://github.com/yokawasa/decode2017 Azure関連FAQ
  30. 30. 最適なフィールド属性の定義 • 必要最低限の機能有効化。特に不要な言語解析処理 (searchable)は避ける 最適なアナライザーの選定 • テキスト解析の基本処理なので選択は慎重に • 基本的に日本語はja.luceneかja.microsoftの2択 スコアリング- フィールドウェイト調整 • searchableフィールドにフィールドウェイト設定 クエリパラメータ選定 • searchMode、queryType、$filter、search 短時間で そこそこの結果 にするために まずできること
  31. 31. { "name": "qnakb", "fields": [ { "name":"id", "type":"Edm.String", "key":true, "searchable":false, "filterable":false, "sortable":false, "facetable":false }, { "name":"question", "type":"Edm.String", "searchable":true, "filterable":false, "sortable":false, "facetable":false,"analyzer":“ja.lucene"}, { "name":"answer", "type":"Edm.String", "searchable":true, "filterable":false, "sortable":false, "facetable":false,"analyzer":"ja.lucene"}, { "name":"category", "type":"Edm.String", "searchable":false, "filterable":true, "sortable":true, "facetable":true }, { "name":"url", "type":"Edm.String", "searchable":false, "filterable":false, "sortable":false, "facetable":false }, { "name":"tags", "type":"Collection(Edm.String)", "searchable":false, "filterable":true, "sortable":false, "facetable":false } ], … } question, answerフィールドはsearchableで アナライザーをja.lucene
  32. 32. { "fields": […], "scoringProfiles": [ { "name": "weightedFields", "text": { "weights": { "question": 9, "answer": 1 } } } ] } & searchMode=any & queryType=full & search=“キーワード” & scoringProfile=weightedFields ( & $filter=category eq ‘カテゴリ’ ) • 特定フィールドに絞る場合 はフィールドスコープ指定 (question:キーワード) • ここではanswerフィールド を考慮するため指定しない カテゴリ絞りをする場合 スコアリングのフィールドウェイト をquestionを9に対してanswerに1 を設定
  33. 33. スペルミス・タイプミス対策 • あいまい検索(fuzzy)や近似検索( Proximity) ランキングのパーソナライズ • ユーザの位置/関心内容に応じてランキングを変える – 距離/Tagブースト 自前でテキスト解析処理を施す • Azure Search未サポート処理をAzure Search外の処理でカ バーするアプローチ • 例)事前にキーワード文字列の正規化やノイズ除去 アナライザーのカスタマイズ(△) • カスタムアナライザでアナライザーの振る舞いをカスタマ イズ。ただし現時点(2017年5月)では日本語モジュール が不十分なので日本語検索ではあまり効果が期待できない。 さらに 精度・利便性 を上げるために できること 同義語、類義語対応 • 再現率を上げたいフィールドに対して同義語辞書 (Public Preview)機能の有効化。辞書更新は逐次
  34. 34. Azure 検索 クラウド ドキュメントA (score: 0.312) Tags: ドキュメントB (score: 0.291) Tags: Azur e ドキュメントC (score: 0.164) Tags: サーチ ドキュメントA (score: 0.312) Tags: ドキュメントC (score: 0.164) Tags: ユーザXが関心のあるキーワード ユーザーXさん ドキュメントB (score: 0.91) Tags: Azur e スコアブースト 検索ヒットしたドキュメント 最終的な結果並び順 「〇✖△」で検索 Tagブースト用プロファイル(※) と関心のあるTagを指定 Xさんにとって興味のある結果が上位にきた! ※ Tagブーストの一連の設定例についてはAPPENDIXを参照ください
  35. 35. https://text-analytics-demo.azurewebsites.net/ 抽出したキーワードをQnA 検索用インデックスのtags フィールドに格納する
  36. 36. 本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。 Y A X B
  37. 37. セッションアンケートにご協力ください  専用アプリからご回答いただけます。 decode 2017  スケジュールビルダーで受講セッションを 登録後、アンケート画面からご回答ください。  アンケートの回答時間はたったの 15 秒です!
  38. 38. Ask the Speaker のご案内 本セッションの詳細は『Ask the Speaker Room』各コーナーカウンタにて ご説明させていただきます。是非、お立ち寄りください。
  39. 39. • 文字列のトークン化 • 語幹変化/見出し語変化 • 正規化 • ストップワード除去 • アンチフレージング 検索結果の再現率/適合率 向上のため手法 主要なテキスト解析処理 → 方式: 形態素解析, N- Gram
  40. 40. 文字フィルタ 文字レベルの加工処理 トークナイザ 文字列をトークン化 トークンフィルタ トークンごとに加工 0個以上定義可 1つのみ 0個以上定義可 a s 文字列をトークンに分かち書き トークンを小文字化 ストップワードを削除 文字列からHTMLタグを削除 あるアナライザーの処理例 トークン
  41. 41. Azure Search Built-in モジュール一覧 https://docs.microsoft.com/en-us/rest/api/searchservice/custom-analyzers-in-azure- search#property-reference Analyzer • <lang>.microsoft (50言語) • <lang>.lucene (35言語) • keyword • pattern • simple • standard • standardasciifolding.lucene • stop • whitespace CharFilter • html_strip • mapping • pattern_replace Tokenizer • classic • edgeNGram • keyword_v2 • letter • lowercase • microsoft_language_tokenizer (43言語) • microsoft_language_stemming _tokenizer (*) • nGram • path_hierarchy_v2 • pattern • stnadard_v2 • uax_url_email • whitespace TokenFilter arabic_normalization apostrophe asciifolding cjk_bigram cjk_width classic common_grams dictionary_decompounder edgeNGram_v2 elision keep keyword_marker keyword_repeat kstem length limit lowercase nGram_v2 pattern_capture pattern_replace phonetic porter_stem reverse shingle snowball stemmer (*) stemmer_override stopwords (*) synonym trim truncate unique uppercase word_delimiter (*) - 複数言語対応。ただし日本語み対応 2017年5月対応状況
  42. 42. "analyzers":(optional)[ { "name":"analyzer_name_1", "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer", "charFilters":[ "char_filter_name_1", "char_filter_name_2" ], "tokenizer":"tokenizer_name", "tokenFilters":[ "token_filter_name_1", "token_filter_name_2" ] }, { "name":"analyzer_name_2", "@odata.type":"#analyzer_type", ... } ], "charFilters":(optional)[ { "name":"char_filter_name", "@odata.type":"#char_filter_type", "option1":"value1", "option2":"value2", ... } ], "tokenizers":(optional)[ { "name":"tokenizer_name", "@odata.type":"#tokenizer_type", "option1":"value1", "option2":"value2", ... } ], "tokenFilters":(optional)[ { "name":"token_filter_name", "@odata.type":"#token_filter_type", "option1":"value1", "option2":"value2", ... } ] Analysis in Azure Search Char Filter Tokenizer Token Filter Public Preview [INFO] 日本語での検索シナリオの場合、現時 点(2017年5月)で日本語Stemming や正規化モジュールが未サポートであ るため機能不十分であるといえる。将 来的な機能強化に期待。
  43. 43. 日本語用N-gramアナライザ やりたいこと • 入力された文字列に対して • HTMLタグを除去したい • 文字列の分割 • 3グラムで分割したい • 分割後のトークンに対して • 全角・半角文字を統一させたい • 大文字を小文字に変換させたい • 同義語展開をさせたい "analyzers":[ { "name":"my_ngram_ja", "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer", "charFilters": ["html_strip"], "tokenizer":"my_tokenizer", "tokenFilters":[ "cjk_width", "lowercase“, “my_synonym_filter” ] } ], "tokenizers":[ { "name":"my_tokenizer", "@odata.type":"#Microsoft.Azure.Search.NGramTokenizer", "minGram":1, "maxGram":3 } ], "tokenFilters":[ { "name":"my_synonym_filter", "@odata.type":"#Microsoft.Azure.Search.SynonymTokenFilter", "synonyms": [ "吾輩,わがはい,私,自分", "猫,ねこ,ネコ,CAT" ], “ignoreCase”: true, “expand”: true } ], 同義語設定内容 • “吾輩、わがはい、私、自分” • “猫、ねこ、ネコ、CAT”
  44. 44. 文字列分かち書き (3グラム) HTML_Strip HTMLタグを削除 (吾輩|わがはい|私|自分) (猫|ねこ|ネコ|CAT) “吾輩”と”猫”を同義語展開 (猫|ねこ|ネコ|CAT) “ネコ” を同義語展開 半角カタカナ全角化 文字列分かち書き (3グラム)
  45. 45. AND検索「+」A+B : AかつB query: Azure+Search OR検索「|」 A|B: A, B or Both query: Azure|Search NOT検索 「-」A-B: A or (NOT B) query: Azure-Search ワイルドカード検索 「*」大小文字区別なし query: Azu* フレーズ検索 「“”」”A B”: A B順にあるものだけ query: “Azure Search” グルーピング 「()」A+(B|C): A+B or A+C query: Azure+(AD|Search) Simple Query syntax
  46. 46. フィールドスコープ「field:term」検索対象フィールドの指定 query: session:Azure AND Search query: session:“Azure Search" AND “Azure AD" あいまい検索「term~」または「term~N」(N=0~2, default 2): N回入れ 替えれば一致するもの全て query: Azure~1 近似検索「”A B”~N 」: AとBの間がN語以内のもの query:“Azure Search”~3 Azure search 3 words Lucene Query syntax
  47. 47. ブースティング「term^N」または「phrase^N」(N:ブースト値 default=1): ^で指定した単語またはフレーズをN値分ブーストさせてより 適合性の高いものにする(ランキングをN値分上げる) query: apache lucene^2 query: “Azure Search"^3 "SharePoint Search" 正規表現検索「/正規表現/」正規表現構文詳細はLucene RegExpクラスド キュメントを参照ください query: /[hm]otel/ ワイルドカード検索「*」複数文字、「?」単一文字ワイルドカード。中間、 後方一致のみ。前方一致は未サポート query: te?t query: test* Lucene Query syntax
  48. 48. • レーベンシュタイン距離(編集距離) AzuuuとAzureの例 レーベンシュタイン距離=2 • Azuuu → Azuru (“u”と”r”の入れ替 え) • Azuru → Azure (“u”と”e”の入れ替え) 2回入れ替えて同じになるのでAzuuu~2 でAzureがマッチします /indexes/myindex/docs/suggest?... &search=Azuru&suggesterName=mysuggt& fuzzy=true 2. 検索サジェストのfuzzyモード1. Luceneクエリのfuzzy search機能 /indexes/myindex/docs?… &search=Azuru~1 &querytype=full
  49. 49. { "name": "mysynonymmap", "format":"solr", "synonyms": " MS, MSFT, Microsoft Washington, Wash., WA => WA pet => cat, dog, puppy, pet" }' { "name":”myfieldname", "type":"Edm.String", "searchable":true, "analyzer":"en.lucene", "synonymMaps":[ "mysynonymmap" ] } Public Preview
  50. 50. フォーマット詳細:Lucene SolrSynonymParser APIリファレンス i-pod, i pod => ipod i-pod, i pod, ipod foo => foo, bar foo => baz foo => foo, bar, baz Public Preview
  51. 51. { "name":"tags", "type":"Collection(Edm.String)", "searchable":false, "filterable":true, "sortable":false, "facetable":false } { "name": "personalizedBoost", "functions": [ { "type": "tag", "boost": 5, "fieldName": "tags", "tag": { "tagsParameter":"featuredtags" } } ] } search=キーワード &scoringProfile=personalizedBoost &scoringParameter=featuredtags:TAG1,TAG2,TAG3.. tagフィールド 名指定 プロファイル名 tagsParameter名 ユーザーごとにパーソナラ イズされたタグを指定
  52. 52. 正規化の例 • U.S.A → USA • Co-education → coeducation • 半角カタカナ→全角カタカナ • カタカナ→ひらがな • Alphabētikós Katálogos → Alphabetikos Katalogos #音声記号 • 簡化字 → 简化字 # -*- coding: utf-8 -*- import unicodedata """ unicodedata.normalizeのNFKC(Normalization Form Compatibility Composition)で半角カタカナ、全角記号、 濁音、特殊文字などを正規化 """ data = u"㈱㍉㌶ (%&!?@#)カタカナザザザザザア" normal = unicodedata.normalize('NFKD', data).encode('utf-8', 'ignore') print normal # => (株)ミリヘクタール (%&!?@#) カタカナザザザザザア
  53. 53. © 2017 Microsoft Corporation. All rights reserved. 本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

×