Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Groonga 
改良型Ngram 
トークナイザー 
Naoya(@naoa̲y) 
全⽂検索エンジンGroongaを囲む⼣べ5 
2014/11/29 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
自⼰紹介 
Naoya(@naoa̲y) 
✓数年ほど特許事務所勤務 
✓前は数年ほどユーザSIでインフラSE 
✓Groongaでプログラミングを学ぶ 
✓GroongaのCプラグインなら書ける 
✓ 
Groonga改良型Ngramトークナ...
制作物 
特許の全⽂検索サービス 
 を個⼈で制作(中) 
✓ 
専門家以外でも有用な知財情報へ迅 
速にアクセスできるように 
権利の死活情報でも絞込みができ 
侵害調査やフリーな技術調査が可能 
✓ 
知財流通促進・フリーな技術流用に 
よ...
制作物 
✓ 
⼀番大きな⽇本語のデータベー 
スで数百GiB超(カラム非圧縮) 
✓ 
数百GiB規模のDBを⼩規模で 
できるだけ実用的な速度で検索 
したい 
Ngramトークナイザーを⾼速 
化、効率化したプラグイン作成(したけど時間が...
改良型Ngramトークナイザ 
ー 
YaNgram-Yetanother 
Ngramtokenizerplugin https://github.com/naoa/groonga-tokenizer-yangram 
✓ 
✓検索時のオーバ...
Groongaの全⽂検索の流れ 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
Groongaのトークナイザー 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
Ngramトークナイザー 
所定の⻑さのユニットサイズで 
1⽂字ずつずらす 
1:Unigram2:Bigram 
3:Trigram 
✓ 
✓ 
例:「今⽇は⾬だ」⇒ 
「今⽇/⽇は/は⾬/⾬だ/だ」 
✓ 
Groongaは1⽂字でも検...
Ngramトークナイザー 
デフォルトではアルファベッ 
ト、記号、数字はグループ化 
✓ 
検索ノイズ低減、検索速度向上のた 
め 
✓ 
アルファベット、記号、数字も 
Ngramにしたいのであれば、 
TokenBigramSplit〜系...
Ngramトークナイザーのメ 
リット 
✓漏れのない検索が可能 
新語、造語に対応特許⽂献の場合、権利解釈の範囲を狭めないように固有 
✓ 
✓メンテナンスコスト不要 
名詞があまり使われず商標も使えないので造語だらけ 
Groonga改良型...
Ngramトークナイザーのデ 
メリット 
1⽂字ずつずらすためトークン 
の総数が多くなり転置索引のサ 
イズが大きくなる転置索引のサイズはほぼトークンの総数によって決まる 
✓ 
✓ 
検索ノイズが含まれることがあ 
る例:東京都に対して京...
形態素解析トークナイザー 
形態素解析器を使って⽂脈に応 
じて単語単位に分かち書き 
TokenMecab 
✓ 
✓ 
例:「今⽇は⾬だ」⇒ 
「今⽇/は/⾬/だ」 
分割ルールは学習モデルと辞書 
によるUnidicであれば短く分かち書き...
形態素解析トークナイザーの 
メリット 
✓ 
検索ノイズの低減例:東京都に対して京都がヒットしない 
単語ごとにずらせるため転置索 
引のサイズがコンパクト形態素解析の場合「転置索引」⇒「転置索引」1つ 
Bigramの場合「転置索引」⇒「転...
形態素解析トークナイザーの 
デメリット 
✓検索漏れ有 
辞書の追加やモデルの再学習な 
どメンテナンスコスト大 
✓ 
✓ 
検索クエリと⽂章中では⽂脈が 
異なり分割ルールが異なること 
がまれによくあるチューニングが大変 
Groong...
キー探索 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
キー探索 
ハッシュ表やパトリシアトライ 
などを使って語彙表のキーとし 
て登録されたトークンを探す 
✓ 
✓いわゆる辞書引き・KVS 
Groongaではインデックス≠キ 
ー 
✓ 
✓ 
キー探索は非常に速くμsecオ 
ーダーKVS...
キーの種類数が増える要因 
⽂字の種類数が多いこと組み合わせが増えるためキーの種類数は多くなる 
✓ 
⽇本語の⽂字の種類は多いひらがなカタカナ50種›漢字いっぱい 
✓ 
英語の⽂字の種類は非常に少な 
いアルファベット26種 
✓ 
✓⽇本...
キーの種類数が増える要因 
✓ 
⽂字数が多いこと組み合わせが増えるためキーの種類数は多くなる 
✓ 
NgramのNが大きいほどキー 
の種類数が多い 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
キーの種類数増によるキー探 
索速度への影響 
パトリシアトライ(ADD後⇒GET) 
キー種類数キー1件取得秒数 
1万21μsec 
1千万37μsec 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
キーの種類数増によるキー探 
索速度への影響 
✓ 
キー探索はキーの種類が増えて 
も線形的に時間が増えない 例:ハッシュ表O(1)、パトリシアトライO(k) 
✓ 
キー種類増の検索速度への影響 
は非常に軽微 
Groonga改良型Ngr...
ポスティング探索 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
ポスティング探索 
キー探索によって取得したポス 
ティングリスト中のトークンの 
出現位置と検索クエリのトーク 
ンの出現位置の相対的な並びが 
⼀致するかどうかを⽐較 
✓ 
トークンの出現頻度が増えると 
ポスティングリストが⻑くなる 
...
トークンの出現頻度が増える 
要因 
⽂字の種類数が少ないほどキー 
の種類数は少ない 
⇒トークン1個あたりの出現頻 
度は大きい 
✓ 
⽇本語はキーの種類が多い 
⇒トークンの出現頻度が少ない 
✓ 
Groonga改良型Ngramトーク...
トークンの出現頻度が増える 
要因 
⽂字数が少ないほどキーの種類 
数は少ない 
⇒トークン1個あたりの出現頻 
度は大きい 
✓ 
NgramのNが大きいとキーの 
種類数が多い 
⇒トークンの出現頻度が少な 
い 
✓ 
Groonga改...
Bigramトークナイザーの出 
現頻度と検索速度例 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
トークンの出現頻度増による 
ポスティング探索速度への影 
響 
⽂書数/サイズが多くなるとト 
ークンの出現頻度が増えポステ 
ィングリストが非常に⻑くなる 
✓ 
トークンの出現頻度に応じてほ 
ぼ線形的に検索時間が伸びる 
大抵の場合、ポ...
検索速度を⾼速に保つために 
重要なこと 
✓ 
✓CPUクロック数を上げる 
キーの種類数よりもポスティン 
グリストが⻑くなりすぎないよ 
うにする 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
形態素解析トークナイザーの 
出現頻度例 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
形態素解析トークナイザーの 
⾼速化 
✓ 
助詞などの頻出語をストップワ 
ードにする 
✓頻出語を含む複合語を辞書登録 
✓ 
⾒出しタグ等⽂書に必ず含まれ 
るフレーズを除去もしくは辞書 
登録 
Groonga改良型Ngramトークナイ...
Ngramトークナイザーの⾼ 
速化 
✓ 
Nのサイズを大きくする 
Bigram⇒Trigram 
✓ 
トークンの種類が増えて1つご 
とのポスティングリストは短く 
なる 
Groonga改良型NgramトークナイザーPoweredby...
Trigramトークナイザーの 
出現頻度と検索速度例 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
Bigramトークナイザーの出 
現頻度と検索速度例(再褐) 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
Ngramトークナイザーの⾼ 
速化 
✓ 
⽇本語は⽂字種も多いため 
Trigramであればかなり速い 
Trigramにすれば基本的に3⽂ 
字以上の検索速度が速くなる 
✓ 
✓が、まだ速くする⽅法がある 
Groonga改良型Ngra...
Ngramトークナイザーをさ 
らに⾼速化するために 
Ngramの⽂書追加時は1⽂字ず 
らしでキーを登録する必要あ 
✓ 
「今⽇は⾬だ」⇒ 
「今⽇/⽇は/は⾬/⾬だ/だ」 
⽇本語は⽂章中の単語境界が判断で 
きないため 
✓ 
✓ 
...
Ngramトークナイザーをさ 
らに⾼速化するために 
検索時は開始位置が決まってい 
るので1⽂字ずらしする必要は 
ない 
⇒オーバラップ部分をスキップ 
✓ 
「今⽇は⾬」⇒「今⽇/⽇は/は⾬」 
× 
✓ 
「今⽇は⾬」⇒「今⽇/ /は...
Ngramトークナイザーをさ 
らに⾼速化するために 
✓ 
末尾で短くなるところは短い奴 
を採用するのではなく1つ⼿前 
の⻑い⽅を採用する短いやつはポスティングリストが⻑く検索が遅い 
「今⽇は⾬だ」 
⇒「今⽇/ /は⾬/ /だ」× 
...
Ngramトークナイザーをさ 
らに⾼速化するために 
✓ 
これを追加実装したのが以下の 
トークナイザー 
TokenYaBigram 
TokenYaTrigram 
~SplitSymbolAlphaもあり 
Groonga改良型Ngr...
TokenBigram/ 
TokenYaBigramの速度 
Wikipedia(ja)で1000回検索 
トークナイザー検索秒数平均 
TokenBigram 0.0508sec 
TokenYaBigra 
0.0325sec 
m 
G...
TokenTrigram/ 
TokenYaTrigramの速度 
Wikipedia(ja)で1000回検索 
トークナイザー検索秒数平均 
TokenTrigram 0.0146sec 
TokenYaTrigr 
0.0063sec 
a...
TokenYaBigram/ 
TokenYaTrigramの速度 
YaBigramはBigramに⽐べ1.5 
倍ほど速い 
✓ 
YaTrigramはTrigramに対し 
て2倍ほど速い 
✓ 
✓ 
NgramのNのサイズが大きい 
...
TokenBigram/ 
TokenTrigramのキー 
Wikipedia(ja) 
トークナイ 
ザー 
キーの数キーサイズ 
TokenBi 
gram 
576747 
4 
136.047 
MiB 
TokenTri 
gram...
TokenTrigramのデメリッ 
ト 
TokenTrigramは 
TokenBigramに⽐べキー数と 
キーサイズが増大 
✓ 
メモリ使用量が増大 
✓キーサイズは⼩さいほうが望ましい 
✓ 
Groonga改良型Ngramトークナ...
Bigramトークナイザーの出 
現頻度と検索速度例(再褐) 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
Ngramトークナイザーを効 
率化するために 
✓ 
トークンの出現頻度は大きく偏 
っている 
✓ 
大半のトークンは出現頻度が⾼ 
くなく⼗分な検索速度が得られ 
ている 
Bigramの出現頻度が⾼い部分 
さえTrigramにできれば...
Ngramトークナイザーを効 
率化するために 
これを追加実装したのが以下の 
トークナイザー 
TokenYaVgram 
TokenYaVgramBoth 
±~SplitSymbolAlphaもあり 
✓ 
✓ 
Groonga改良型N...
TokenYaVgram 
管理テーブルのキーと⼀致する 
Bigramトークンのみを後ろに 
伸ばしてTrigramにする 
✓ 
管理テーブルにあらかじめ出現 
頻度に応じたBigramトークン 
を登録しておく 
✓ 
Groonga改良...
TokenYaVgram 
✓ 
「画像/増処/処理装/理装/装 
置/置」 
「画像処理装置」で「処理」を 
管理テーブルに登録 
✓ 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
TokenYaVgram 
検索クエリの末尾では、 
Trigram対象のBigramトーク 
ンであっても後ろに伸ばせない 
✓ 
✓ 
この場合は強制的に前⽅⼀致検 
索させる 
✓ 
「画像処理」で「処理」を登録 
⇒「画像/ /処理*」...
TokenYaVgram/ 
TokenBigramの速度 
Wikipedia(ja)で1000回検索 
トークナイザー検索秒数平均 
TokenBigram 0.0444sec 
TokenYaVgra 
0.0166sec 
m 
Gro...
TokenYaVgram/ 
TokenBigramのキー 
Wikipedia(ja) 
トークナイ 
ザー 
キーの数キーサイズ 
TokenBi 
gram 
576747 
4 
136.047 
MiB 
TokenYa 
Vgram...
TokenYaVgramの効果 
キーサイズの増大を抑えつつ、 
検索速度の⾼速化を実現 
✓ 
しかし、検索クエリ末尾のもの 
は後ろに伸ばすことができない 
✓ 
✓ 
「画像処理装置」で「装置」を 
登録 
⇒「画像/増処/処理/理装/装...
TokenYaVgramBoth 
管理テーブルのキーと⼀致する 
Bigramトークンのみを後ろに 
伸ばしてTrigramにする 
✓ 
1つ後ろのBigramトークンが 
管理テーブルのキーと⼀致する 
トークンも後ろに伸ばして 
Tri...
TokenYaVgramBoth 
管理テーブルにはあらかじめ出 
現頻度に応じたBigramトーク 
ンを登録 
✓ 
「画像処理装置」で「処理」を 
登録 
⇒「画像/増処理/処理装/理装/ 
装置/置」 
✓ 
Groonga改良型Ngr...
TokenYaVgramBoth 
この場合、検索クエリでは伸ば 
せないケースが非常に多く発⽣ 
する 
✓ 
✓ 
「画像処」で「処理」を登録 
⇒「画像/増処*」 
全ての場合で強制的に前⽅⼀致 
検索させるを得ない 
✓ 
Groong...
TokenYaVgramBoth/ 
TokenBigramの速度 
Wikipedia(ja)で1000回検索 
トークナイザー検索秒数平均 
TokenBigram 0.0444sec 
TokenYaVgra 
0.0065sec 
mB...
TokenYaVgramBoth/ 
TokenBigramのキー 
Wikipedia(ja) 
トークナイ 
ザー 
キーの数キーサイズ 
TokenBi 
gram 
576747 
4 
136.047 
MiB 
TokenYa 
V...
TokenYaVgramBothの効 
果 
出現頻度が⾼いもののみ 
Trigramにすることでキーサイ 
ズの増大を抑えつつ、検索速度 
の⾼速化を実現 
✓ 
TokenYaTrigram並の検索速 
度ながらもキーサイズを 
Token...
既知フレーズのグループ化 
あらかじめ既知のフレーズを管 
理テーブルに登録 
✓ 
そのフレーズのみグループ化し 
てトークナイズ 
パトリシアトライのLCPサーチを利 
用して⾼速にフレーズ抽出 
✓ 
✓ 
Groonga改良型Ngram...
既知フレーズのグループ化 
「12⽉は寒い」で「12⽉」 
を登録 
⇒「12⽉/は寒/寒い」 
✓ 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
既知フレーズのグループ化の 
効果 
✓検索ノイズの低減 
✓ 
⾒出しタグや頻出語を含む複合 
語などを登録することにより頻 
出トークン数を低減 
Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
まとめ検索速度を⾼速に保つのために 
はポスティングリストが⻑くな 
りすぎないようにする 
✓ 
✓ 
Ngramの検索時はオーバラッ 
プさせなくても良い 
✓トークンの出現頻度は偏る 
✓ 
これらの特性から検索を⾼速 
化、効率化するた...
おまけnその他のプラグイン 
groonga-token-filter-yatof https://github.com/naoa/groonga-token-filter-yatof 
✓適当なトークンフィルター集 
LengthとかSymb...
おまけnその他のプラグイン 
groonga-command-token-count 
https://github.com/naoa/groonga-command-token-count 
ポスティングリストをたどってトー 
クン数を数える...
おまけnその他のプラグイン 
groonga-function-snippet̲tritonn 
https://github.com/naoa/groonga-function-snippet̲tritonn 
フルスペックスニペット関数± ...
おまけnその他のプラグイン 
groonga-tokenizer-tinysegmenter 
https://github.com/naoa/groonga-tokenizer-tinysegmenter 
TinySegmenterを使った...
おまけnその他のプラグイン 
groonga-tokenizer-yadelimit https://github.com/naoa/groonga-tokenizer-yadelimit 
✓TokenDelimitのバリエーション 
✓使お...
おまけnその他のプラグイン 
groonga-function-regex https://github.com/naoa/groonga-function-regex 
✓ 
Onigumoバンドルされたからそれ 
使えばいい気がする 
RE...
おまけnその他のプラグイン 
groonga-normalizer-yamysql 
https://github.com/naoa/groonga-normalizer-yamysql 
ハイフンとか漢字の異体字とかヴァ 
とかを正規化 
✓...
おまけnその他のプラグイン 
groonga-column-hole https://github.com/naoa/groonga-column-hole 
✓ 
カラムにデータをいれたらデータが 
消えるかも 
✓転置索引はつくられる 
✓...
おまけnその他のプラグイン 
groonga-word2vec https://github.com/naoa/groonga-word2vec 
✓ 
✓自動的にクエリ展開とかあるかも 
✓使っていない 
コピペしただけGroongaのプラグ...
Vous avez terminé ce document.
Télécharger et lire hors ligne.
Prochain SlideShare
Raspberry Pi 2 誤自宅サーバー移行日記
Suivant
Prochain SlideShare
Raspberry Pi 2 誤自宅サーバー移行日記
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

Partager

Groonga改良型Ngramトークナイザー

Télécharger pour lire hors ligne

全文検索エンジンGroongaを囲む夕べ5
http://groonga.doorkeeper.jp/events/15816

Groonga改良型Ngramトークナイザー

  1. 1. Groonga 改良型Ngram トークナイザー Naoya(@naoa̲y) 全⽂検索エンジンGroongaを囲む⼣べ5 2014/11/29 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  2. 2. 自⼰紹介 Naoya(@naoa̲y) ✓数年ほど特許事務所勤務 ✓前は数年ほどユーザSIでインフラSE ✓Groongaでプログラミングを学ぶ ✓GroongaのCプラグインなら書ける ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  3. 3. 制作物 特許の全⽂検索サービス を個⼈で制作(中) ✓ 専門家以外でも有用な知財情報へ迅 速にアクセスできるように 権利の死活情報でも絞込みができ 侵害調査やフリーな技術調査が可能 ✓ 知財流通促進・フリーな技術流用に よる産業の発達促進 ✓ ✓ 今回紹介する改良もフリーな技術情 報をヒントに発想を取り⼊れたもの ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  4. 4. 制作物 ✓ ⼀番大きな⽇本語のデータベー スで数百GiB超(カラム非圧縮) ✓ 数百GiB規模のDBを⼩規模で できるだけ実用的な速度で検索 したい Ngramトークナイザーを⾼速 化、効率化したプラグイン作成(したけど時間が⾜りなくてまだ反映できてない) ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  5. 5. 改良型Ngramトークナイザ ー YaNgram-Yetanother Ngramtokenizerplugin https://github.com/naoa/groonga-tokenizer-yangram ✓ ✓検索時のオーバラップスキップ 静的な頻度情報に応じた可変 Ngram(Vgram) ✓ ✓既知フレーズのグループ化 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  6. 6. Groongaの全⽂検索の流れ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  7. 7. Groongaのトークナイザー Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  8. 8. Ngramトークナイザー 所定の⻑さのユニットサイズで 1⽂字ずつずらす 1:Unigram2:Bigram 3:Trigram ✓ ✓ 例:「今⽇は⾬だ」⇒ 「今⽇/⽇は/は⾬/⾬だ/だ」 ✓ Groongaは1⽂字でも検索でき るように末尾1⽂字も含まれる Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  9. 9. Ngramトークナイザー デフォルトではアルファベッ ト、記号、数字はグループ化 ✓ 検索ノイズ低減、検索速度向上のた め ✓ アルファベット、記号、数字も Ngramにしたいのであれば、 TokenBigramSplit〜系を使う ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  10. 10. Ngramトークナイザーのメ リット ✓漏れのない検索が可能 新語、造語に対応特許⽂献の場合、権利解釈の範囲を狭めないように固有 ✓ ✓メンテナンスコスト不要 名詞があまり使われず商標も使えないので造語だらけ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  11. 11. Ngramトークナイザーのデ メリット 1⽂字ずつずらすためトークン の総数が多くなり転置索引のサ イズが大きくなる転置索引のサイズはほぼトークンの総数によって決まる ✓ ✓ 検索ノイズが含まれることがあ る例:東京都に対して京都でヒットする ✓ ⽇本語の場合、あまり大きな影 響ではない要件による Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  12. 12. 形態素解析トークナイザー 形態素解析器を使って⽂脈に応 じて単語単位に分かち書き TokenMecab ✓ ✓ 例:「今⽇は⾬だ」⇒ 「今⽇/は/⾬/だ」 分割ルールは学習モデルと辞書 によるUnidicであれば短く分かち書き ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  13. 13. 形態素解析トークナイザーの メリット ✓ 検索ノイズの低減例:東京都に対して京都がヒットしない 単語ごとにずらせるため転置索 引のサイズがコンパクト形態素解析の場合「転置索引」⇒「転置索引」1つ Bigramの場合「転置索引」⇒「転置/置索/索引/引」4つ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  14. 14. 形態素解析トークナイザーの デメリット ✓検索漏れ有 辞書の追加やモデルの再学習な どメンテナンスコスト大 ✓ ✓ 検索クエリと⽂章中では⽂脈が 異なり分割ルールが異なること がまれによくあるチューニングが大変 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  15. 15. キー探索 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  16. 16. キー探索 ハッシュ表やパトリシアトライ などを使って語彙表のキーとし て登録されたトークンを探す ✓ ✓いわゆる辞書引き・KVS Groongaではインデックス≠キ ー ✓ ✓ キー探索は非常に速くμsecオ ーダーKVSが速いのは知っているはず Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  17. 17. キーの種類数が増える要因 ⽂字の種類数が多いこと組み合わせが増えるためキーの種類数は多くなる ✓ ⽇本語の⽂字の種類は多いひらがなカタカナ50種›漢字いっぱい ✓ 英語の⽂字の種類は非常に少な いアルファベット26種 ✓ ✓⽇本語はキーの種類が多い Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  18. 18. キーの種類数が増える要因 ✓ ⽂字数が多いこと組み合わせが増えるためキーの種類数は多くなる ✓ NgramのNが大きいほどキー の種類数が多い Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  19. 19. キーの種類数増によるキー探 索速度への影響 パトリシアトライ(ADD後⇒GET) キー種類数キー1件取得秒数 1万21μsec 1千万37μsec Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  20. 20. キーの種類数増によるキー探 索速度への影響 ✓ キー探索はキーの種類が増えて も線形的に時間が増えない 例:ハッシュ表O(1)、パトリシアトライO(k) ✓ キー種類増の検索速度への影響 は非常に軽微 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  21. 21. ポスティング探索 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  22. 22. ポスティング探索 キー探索によって取得したポス ティングリスト中のトークンの 出現位置と検索クエリのトーク ンの出現位置の相対的な並びが ⼀致するかどうかを⽐較 ✓ トークンの出現頻度が増えると ポスティングリストが⻑くなる ⼀番時間がかかるところ シーケンシャルサーチを除く✓ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  23. 23. トークンの出現頻度が増える 要因 ⽂字の種類数が少ないほどキー の種類数は少ない ⇒トークン1個あたりの出現頻 度は大きい ✓ ⽇本語はキーの種類が多い ⇒トークンの出現頻度が少ない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  24. 24. トークンの出現頻度が増える 要因 ⽂字数が少ないほどキーの種類 数は少ない ⇒トークン1個あたりの出現頻 度は大きい ✓ NgramのNが大きいとキーの 種類数が多い ⇒トークンの出現頻度が少な い ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  25. 25. Bigramトークナイザーの出 現頻度と検索速度例 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  26. 26. トークンの出現頻度増による ポスティング探索速度への影 響 ⽂書数/サイズが多くなるとト ークンの出現頻度が増えポステ ィングリストが非常に⻑くなる ✓ トークンの出現頻度に応じてほ ぼ線形的に検索時間が伸びる 大抵の場合、ポスティングリストの 探索でCPUがボトルネック ✓ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  27. 27. 検索速度を⾼速に保つために 重要なこと ✓ ✓CPUクロック数を上げる キーの種類数よりもポスティン グリストが⻑くなりすぎないよ うにする Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  28. 28. 形態素解析トークナイザーの 出現頻度例 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  29. 29. 形態素解析トークナイザーの ⾼速化 ✓ 助詞などの頻出語をストップワ ードにする ✓頻出語を含む複合語を辞書登録 ✓ ⾒出しタグ等⽂書に必ず含まれ るフレーズを除去もしくは辞書 登録 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  30. 30. Ngramトークナイザーの⾼ 速化 ✓ Nのサイズを大きくする Bigram⇒Trigram ✓ トークンの種類が増えて1つご とのポスティングリストは短く なる Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  31. 31. Trigramトークナイザーの 出現頻度と検索速度例 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  32. 32. Bigramトークナイザーの出 現頻度と検索速度例(再褐) Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  33. 33. Ngramトークナイザーの⾼ 速化 ✓ ⽇本語は⽂字種も多いため Trigramであればかなり速い Trigramにすれば基本的に3⽂ 字以上の検索速度が速くなる ✓ ✓が、まだ速くする⽅法がある Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  34. 34. Ngramトークナイザーをさ らに⾼速化するために Ngramの⽂書追加時は1⽂字ず らしでキーを登録する必要あ ✓ 「今⽇は⾬だ」⇒ 「今⽇/⽇は/は⾬/⾬だ/だ」 ⽇本語は⽂章中の単語境界が判断で きないため ✓ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  35. 35. Ngramトークナイザーをさ らに⾼速化するために 検索時は開始位置が決まってい るので1⽂字ずらしする必要は ない ⇒オーバラップ部分をスキップ ✓ 「今⽇は⾬」⇒「今⽇/⽇は/は⾬」 × ✓ 「今⽇は⾬」⇒「今⽇/ /は⾬」 ○ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  36. 36. Ngramトークナイザーをさ らに⾼速化するために ✓ 末尾で短くなるところは短い奴 を採用するのではなく1つ⼿前 の⻑い⽅を採用する短いやつはポスティングリストが⻑く検索が遅い 「今⽇は⾬だ」 ⇒「今⽇/ /は⾬/ /だ」× ⇒「今⽇/ /は⾬/⾬だ」○ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  37. 37. Ngramトークナイザーをさ らに⾼速化するために ✓ これを追加実装したのが以下の トークナイザー TokenYaBigram TokenYaTrigram ~SplitSymbolAlphaもあり Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  38. 38. TokenBigram/ TokenYaBigramの速度 Wikipedia(ja)で1000回検索 トークナイザー検索秒数平均 TokenBigram 0.0508sec TokenYaBigra 0.0325sec m Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  39. 39. TokenTrigram/ TokenYaTrigramの速度 Wikipedia(ja)で1000回検索 トークナイザー検索秒数平均 TokenTrigram 0.0146sec TokenYaTrigr 0.0063sec am Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  40. 40. TokenYaBigram/ TokenYaTrigramの速度 YaBigramはBigramに⽐べ1.5 倍ほど速い ✓ YaTrigramはTrigramに対し て2倍ほど速い ✓ ✓ NgramのNのサイズが大きい ほどオーバーラップを⾶ばす量 が大きくなるためより速くなる Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  41. 41. TokenBigram/ TokenTrigramのキー Wikipedia(ja) トークナイ ザー キーの数キーサイズ TokenBi gram 576747 4 136.047 MiB TokenTri gram 286918 83 684.047 MiB Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  42. 42. TokenTrigramのデメリッ ト TokenTrigramは TokenBigramに⽐べキー数と キーサイズが増大 ✓ メモリ使用量が増大 ✓キーサイズは⼩さいほうが望ましい ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  43. 43. Bigramトークナイザーの出 現頻度と検索速度例(再褐) Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  44. 44. Ngramトークナイザーを効 率化するために ✓ トークンの出現頻度は大きく偏 っている ✓ 大半のトークンは出現頻度が⾼ くなく⼗分な検索速度が得られ ている Bigramの出現頻度が⾼い部分 さえTrigramにできれば良い ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  45. 45. Ngramトークナイザーを効 率化するために これを追加実装したのが以下の トークナイザー TokenYaVgram TokenYaVgramBoth ±~SplitSymbolAlphaもあり ✓ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  46. 46. TokenYaVgram 管理テーブルのキーと⼀致する Bigramトークンのみを後ろに 伸ばしてTrigramにする ✓ 管理テーブルにあらかじめ出現 頻度に応じたBigramトークン を登録しておく ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  47. 47. TokenYaVgram ✓ 「画像/増処/処理装/理装/装 置/置」 「画像処理装置」で「処理」を 管理テーブルに登録 ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  48. 48. TokenYaVgram 検索クエリの末尾では、 Trigram対象のBigramトーク ンであっても後ろに伸ばせない ✓ ✓ この場合は強制的に前⽅⼀致検 索させる ✓ 「画像処理」で「処理」を登録 ⇒「画像/ /処理*」 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  49. 49. TokenYaVgram/ TokenBigramの速度 Wikipedia(ja)で1000回検索 トークナイザー検索秒数平均 TokenBigram 0.0444sec TokenYaVgra 0.0166sec m Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  50. 50. TokenYaVgram/ TokenBigramのキー Wikipedia(ja) トークナイ ザー キーの数キーサイズ TokenBi gram 576747 4 136.047 MiB TokenYa Vgram 742519 8 172.047 MiB Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  51. 51. TokenYaVgramの効果 キーサイズの増大を抑えつつ、 検索速度の⾼速化を実現 ✓ しかし、検索クエリ末尾のもの は後ろに伸ばすことができない ✓ ✓ 「画像処理装置」で「装置」を 登録 ⇒「画像/増処/処理/理装/装 置/置」 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  52. 52. TokenYaVgramBoth 管理テーブルのキーと⼀致する Bigramトークンのみを後ろに 伸ばしてTrigramにする ✓ 1つ後ろのBigramトークンが 管理テーブルのキーと⼀致する トークンも後ろに伸ばして Trigramにする ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  53. 53. TokenYaVgramBoth 管理テーブルにはあらかじめ出 現頻度に応じたBigramトーク ンを登録 ✓ 「画像処理装置」で「処理」を 登録 ⇒「画像/増処理/処理装/理装/ 装置/置」 ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  54. 54. TokenYaVgramBoth この場合、検索クエリでは伸ば せないケースが非常に多く発⽣ する ✓ ✓ 「画像処」で「処理」を登録 ⇒「画像/増処*」 全ての場合で強制的に前⽅⼀致 検索させるを得ない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  55. 55. TokenYaVgramBoth/ TokenBigramの速度 Wikipedia(ja)で1000回検索 トークナイザー検索秒数平均 TokenBigram 0.0444sec TokenYaVgra 0.0065sec mBoth Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  56. 56. TokenYaVgramBoth/ TokenBigramのキー Wikipedia(ja) トークナイ ザー キーの数キーサイズ TokenBi gram 576747 4 136.047 MiB TokenYa VgramB oth 856077 9 200.047 MiB Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  57. 57. TokenYaVgramBothの効 果 出現頻度が⾼いもののみ Trigramにすることでキーサイ ズの増大を抑えつつ、検索速度 の⾼速化を実現 ✓ TokenYaTrigram並の検索速 度ながらもキーサイズを TokenTrigramの1/3以下に抑 えられた ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  58. 58. 既知フレーズのグループ化 あらかじめ既知のフレーズを管 理テーブルに登録 ✓ そのフレーズのみグループ化し てトークナイズ パトリシアトライのLCPサーチを利 用して⾼速にフレーズ抽出 ✓ ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  59. 59. 既知フレーズのグループ化 「12⽉は寒い」で「12⽉」 を登録 ⇒「12⽉/は寒/寒い」 ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  60. 60. 既知フレーズのグループ化の 効果 ✓検索ノイズの低減 ✓ ⾒出しタグや頻出語を含む複合 語などを登録することにより頻 出トークン数を低減 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  61. 61. まとめ検索速度を⾼速に保つのために はポスティングリストが⻑くな りすぎないようにする ✓ ✓ Ngramの検索時はオーバラッ プさせなくても良い ✓トークンの出現頻度は偏る ✓ これらの特性から検索を⾼速 化、効率化するためにNgram トークナイザーを改良 Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  62. 62. おまけnその他のプラグイン groonga-token-filter-yatof https://github.com/naoa/groonga-token-filter-yatof ✓適当なトークンフィルター集 LengthとかSymbolとかSynonym とか ✓ ✓使おうとしている ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  63. 63. おまけnその他のプラグイン groonga-command-token-count https://github.com/naoa/groonga-command-token-count ポスティングリストをたどってトー クン数を数える ✓ 別にコマンドプラグインである必要 はなかった ✓ ✓使っている ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  64. 64. おまけnその他のプラグイン groonga-function-snippet̲tritonn https://github.com/naoa/groonga-function-snippet̲tritonn フルスペックスニペット関数± Mroonga(Tritonn)±Like ✓ ✓地獄のシンタックス ✓使っている ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  65. 65. おまけnその他のプラグイン groonga-tokenizer-tinysegmenter https://github.com/naoa/groonga-tokenizer-tinysegmenter TinySegmenterを使った形態素解 析トークナイザー±態素解析用の辞 書を持たないのでコンパクト ✓ 学習ツール公開している⼈がいるの でそれ使えば簡単に学習できる ✓ ✓使っていない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  66. 66. おまけnその他のプラグイン groonga-tokenizer-yadelimit https://github.com/naoa/groonga-tokenizer-yadelimit ✓TokenDelimitのバリエーション ✓使おうとしている ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  67. 67. おまけnその他のプラグイン groonga-function-regex https://github.com/naoa/groonga-function-regex ✓ Onigumoバンドルされたからそれ 使えばいい気がする RE2ライブラリを使って正規表現で outputを整形 ✓ ✓使っていない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  68. 68. おまけnその他のプラグイン groonga-normalizer-yamysql https://github.com/naoa/groonga-normalizer-yamysql ハイフンとか漢字の異体字とかヴァ とかを正規化 ✓ ✓フレーズ除去とか ✓ 盛大にバグっている±なおったら使 う予定 ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  69. 69. おまけnその他のプラグイン groonga-column-hole https://github.com/naoa/groonga-column-hole ✓ カラムにデータをいれたらデータが 消えるかも ✓転置索引はつくられる ✓ hook±apiがあることを知ったので試 しただけ使っていない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  70. 70. おまけnその他のプラグイン groonga-word2vec https://github.com/naoa/groonga-word2vec ✓ ✓自動的にクエリ展開とかあるかも ✓使っていない コピペしただけGroongaのプラグ インである意味はない ✓ Groonga改良型NgramトークナイザーPoweredbyRabbit2.1.2
  • kiyoshikobayashi1971

    Mar. 20, 2015
  • KitaitiMakoto

    Mar. 20, 2015
  • yoku0825

    Nov. 30, 2014

全文検索エンジンGroongaを囲む夕べ5 http://groonga.doorkeeper.jp/events/15816

Vues

Nombre de vues

1 250

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

7

Actions

Téléchargements

10

Partages

0

Commentaires

0

Mentions J'aime

3

×