Solrにおける日本語処理の現状

株式会社 ロンウイット
www.rondhuit.com

Apache Lucene/Solr• Apache Lucene– Javaで書かれたオープンソースの全文検索ライブラリ• Apache Solr
– Luceneをベースに開発されたオープンソースの全文検索サーバ2よくある質問／問題• あいまい検索はできますか？
• 形態素解析とN-gramどちらを使えばいいですか？
• ハイライトが正しく動作しません。
• ハイライトがずれます。

3あいまい検索はできますか？
• あいまい検索とは？
– ユーザによって「あいまい」の定義はさまざま• 全角・半角混じり文の検索• カタカナ語の表記揺れ• 正式名称短縮名称検索• いすずいすゞ• 結合文字検索• 西暦和暦検索• ワイルドカード検索／正規表現検索／あいまい（Fuzzy）検索• Google 「もしかして・・・」• Googleサジェスト

4CharFilter – クラス図
ReaderCharStream+correctOffset(int):int

CharReaderCharFilter
input:CharStream

input:Reader

correct(int):int

OffCorrectMap
off:int
cumulativeDiff:int

BaseCharFilter0…*

pcmList:List<OffCorrectMap>
getLastCumulativeDiff():intaddOffCorrectMap(int,int):void

MappingCharFilter

5文字オフセット補正の動き
Reader

CharReader
correctOffset(補正前オフセット)

補正後オフセット=補正前オフセット
correct(補正前)
CharFilter

correctOffset(補正前オフセット)
CharFilter
correctOffset(補正前オフセット)
CharFilter
correctOffset(補正前オフセット)
Tokenizer

TokenFilter

補正後補正後オフセット
correct(補正前)補正後補正後オフセット
correct(補正前)補正後補正後オフセット

CharFilterImplCharFilterImpl

CharFilterImpl"CharStream aware" Tokenizer

CharFilterはcorrectOffset()が呼ばれたら、まず、自身のcorrect()を使ってオフセット補正を行い、その後上流のcorrectOffset()を呼び出す

TokenFilter

6MappingCharFilter• <charFilter/>のmapping属性で指定されたファイルに従った「文字マッピング」を実行する。
• mapping.txtのサンプル# Syntax:# "source" => "target"#"source".length() > 0 (source cannot be empty.)#"target".length() >= 0 (target can be empty.)# example:# "À" => "A"# "\u00C0" => "A"# "\u00C0" => "\u0041"# "ß" => "ss"# "\t" => " "# "\n" => ""# À => A"\u00C0" => "A"# Æ => AE"\u00C6" => "AE"# Ç => C"\u00C7" => "C"7

MappingCharFilter（オフセット補正）
0a => aab => bbb
cc => cccc

文字数が増える場合

10a1b01

aa2(1,-1)

0

12bbb

3

(1,-1)(2,-2)

0

1

2cc0

12

3cccc

4

(2,-1) (3,-2)

8

MappingCharFilter（オフセット補正）
aa => abbb => bcccc => cc

文字数が減る場合

012abbb10

101a023ba(1,+1)(1,+2)

0123cccc012cc

4(2,+2)

9形態素解析とN-gram
今日はいい天気です
N-gram
（N=2）

形態素解析

今日は天気いいです

MeCabSen
Rosette言語処理プラットフォーム（RLP）

日は今日

はい
天気

いいい天
気でです

CJKTokenizer
NGramTokenizer

10形態素解析とN-gramN-gram

形態素解析
長所•自然言語の単語に近い•実装が容易•N-gramよりもインデックスサイズ •辞書不要を小さくできる•新語への対応が容易•単語の品詞が抽出できる

短所•新語への対応が困難•形態素解析よりもインデックスサ•辞書のメンテナンスが必要
イズが大きくなりがち•N-gramよりも検索漏れが生じや •Nより短い文字が検索漏れとなる
すい用途

•NLP
•固有表現抽出•特許検索•ブログ検索11

単語の境界がはっきりしない例

製造部門長谷川12

ハイライトのトラブル• ハイライトとは？
検索語の強調表示
ハイライトスニペット• トラブルその１「N-gramを使うとハイライトがおかしくなります」• トラブルその２「FVHを使うとハイライトがずれます」

13

FastVectorHighlighter
q=ルシーン^2 "検索 ライブラリ"~10

1

2

3

4

5

6

7

8

910 11 12 13 14 15 16 17 18

ルシー ン は検索エ ン ジ ン ラ イ ブ ラ リ です 。
12

3

4

5

6

ルシーン

boost=2

検索ライブラリX

7

QueryPhraseMap
slop=1X

FieldTermStack

FieldPhraseList

FieldFragList

ルシーン (0,4,1)
検索 (5,7,3)
ライブラリ (11,16,5)

ルシーン [(0,4)] boost=2
検索 ライブラリ [(5,7),(11,16)] boost=1

ルシーン [(0,4)]
検索 ライブラリ [(5,7),(11,16)]
totalBoost=3

14

Solrサブスクリプション・パッケージ
ロンウイットは、OSSのSolrを企業／団体様が安心してお使いいただけるよう、年間購読料形式の「サブスクリプション・パッケージ」としてご提供しています。
お客様のアプリケーションの目的に応じたエディションをご選択いただけます。

BASICLANGUAGE

ENTERPRISE

Solr 1.4√√√

バグフィックス√√√

各種プラグイン√√√

サポートサービス

√√

√

言語判別√

√

類義語辞書

√

√

固有表現抽出√15

Solrサブスクリプション・パッケージ• 各種プラグイン※提供予定の機能を含みます。また機能は順次追加されます。

– 全角／半角／新旧漢字混じり、カタカナ語表記揺れ吸収検索– Java 6のNormalizerを使用した正規分解／互換分解／正規合成／互換合成処理による検索– 踊り字検索– ギャル文字検索– 顔文字検索– 1-gram最適化検索– 専門用語抽出– カタカナひらがなローマ字検索– 日本語文章境界を認識するハイライター– 日本語サジェスチョン
– Heritrixアーカイブファイルローダー

16Solrサブスクリプション・パッケージ• 言語判別– 世界およびインターネット上で使われている主要な下記25言語をサポート：
アラビア語、ベンガル語、デンマーク語、ドイツ語、ギリシャ語、英語、スペイン語、ペルシャ語、フィンランド語、フランス語、ヒンディー語、ハンガリー語、アイ
スランド語、イタリア語、日本語、ジャワ語、韓国語、オランダ語、ノルウェー語、ポルトガル語、ロシア語、スウェーデン語、タイ語、トルコ語、中国語• 類義語辞書– SynonymFilterで利用可能な分野別類義語辞書：
分野

およそのエントリ数

コンピューター

8,000

政治・経済

14,000

医療

3,000

科学

2,500

教育

3,000

芸能・スポーツ

2,000
17Solrサブスクリプション・パッケージ• 固有表現抽出 ※BASIS Technology社の固有表現抽出製品REXを用いています。
– 人名／地名／国名／組織名などを文章から抽出– ベイズ理論に基づき、抽出すべき語の「文脈パターン」を事前学
習

18

ロンウイットのSolr技術トレーニング• 特徴– Lucene/Solrコミッター監修– 演習付き– PDFテキスト（持ち帰りOK）– 受講後1ヶ月のアフターサポート付き• トレーニングコース※2010年6月より順次ご提供できる予定です。

– Solr 1.4 基礎– Solr 1.4 応用– Solr 1.4 運用（？）– Solr 1.4 プラグイン開発– Solr 1.4 DIH開発（？）

19

ご静聴ありがとうございました！

20