rabbit-slide-naoa-groonga-night-5-naoa 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9a0e53a3ea3df0f409158945556aca35e4fa65cd
4
+ data.tar.gz: dc7935d321d75dd01c7617e59ed84114c1396b99
5
+ SHA512:
6
+ metadata.gz: f9dc7787b0bfa7a8140a655337b4a07c6b9751b5a1229e687ad8bf2fdb3e55c677419ea792f2962979ca506e2c3fcd56248f8fe36ea8a81bad2591c0db11bd92
7
+ data.tar.gz: aff29905b075fdab0364316bd7027d50aff6b0a9dadf6d03a9ca65978ee5b23db4b099e65f9776b07db28686f80550265de3552397aed8ac70460af37cf1447c
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ groonga-night-5-naoa.rab
@@ -0,0 +1,24 @@
1
+ = Groonga改良型Ngramトークナイザー
2
+
3
+ Groonga改良型Ngramトークナイザー Groonga改良型Ngramトークナイザー
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide-naoa-groonga-night-5-naoa
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide-naoa-groonga-night-5-naoa.gem
24
+
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # task.spec.files += Dir.glob("doc/**/*.*")
9
+ # task.spec.files -= Dir.glob("private/**/*.*")
10
+ # task.spec.add_runtime_dependency("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
Binary file
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: groonga-night-5-naoa
3
+ base_name: groonga-night-5-naoa
4
+ tags:
5
+ - rabbit
6
+ presentation_date:
7
+ version: 1.0.0
8
+ licenses: []
9
+ slideshare_id:
10
+ speaker_deck_id:
11
+ ustream_id:
12
+ vimeo_id:
13
+ youtube_id:
14
+ author:
15
+ markup_language: :rd
16
+ name: Naoya Murakami
17
+ email: naoya@createfield.com
18
+ rubygems_user: naoa
19
+ slideshare_user: naoa_y
20
+ speaker_deck_user: naoa_y
@@ -0,0 +1,456 @@
1
+ = Groonga\n改良型Ngram\nトークナイザー
2
+
3
+ : author
4
+ Naoya (@naoa_y)
5
+ : institution
6
+ : content-source
7
+ 全文検索エンジンGroongaを囲む夕べ5
8
+ : date
9
+ 2014/11/29
10
+ : allotted-time
11
+ 15m
12
+ : theme
13
+ clear-blue
14
+
15
+ = 自己紹介
16
+
17
+ # image
18
+ # src = icon.jpg
19
+ # relative-height = 25
20
+ # align = right
21
+ # relative-margin-top = -32
22
+ # relative-margin-right = -10
23
+
24
+ * Naoya (@naoa_y)
25
+ * 数年ほど特許事務所勤務
26
+ * 前は数年ほどユーザSIでインフラSE
27
+ * Groongaでプログラミングを学ぶ
28
+ * GroongaのCプラグインなら書ける
29
+
30
+ = 制作物
31
+
32
+ # image
33
+ # src = patentfield.svg
34
+ # relative-height = 15
35
+ # align = right
36
+ # relative-margin-top = -28
37
+ # relative-margin-right = 63
38
+
39
+ * 特許の全文検索サービス\n     を個人で制作(('note:(中)'))
40
+ * 専門家以外でも有用な知財情報へ迅速にアクセスできるように
41
+ * 権利の死活情報でも絞込みができ\n侵害調査やフリーな技術調査が可能
42
+ * 知財流通促進・フリーな技術流用による産業の発達促進
43
+ * 今回紹介する改良もフリーな技術情報をヒントに発想を取り入れたもの
44
+
45
+ = 制作物
46
+ * 一番大きな((*日本語*))のデータベースで数百GiB超(カラム非圧縮)
47
+ * 数百GiB規模のDBを小規模でできるだけ実用的な速度で検索したい
48
+ * Ngramトークナイザーを高速化、効率化したプラグイン作成\n(('note:(したけど時間が足りなくてまだ反映できてない)'))
49
+
50
+ = 改良型Ngramトークナイザー
51
+ * YaNgram - Yet another Ngram tokenizer plugin\n
52
+ (('note:https://github.com/naoa/groonga-tokenizer-yangram'))
53
+ * 検索時のオーバラップスキップ
54
+ * 静的な頻度情報に応じた可変Ngram(Vgram)
55
+ * 既知フレーズのグループ化
56
+
57
+ = Groongaの全文検索の流れ
58
+
59
+ # image
60
+ # src = search.png
61
+ # relative-height = 100
62
+ # align = center
63
+ # relative-margin-top = 0
64
+ # relative-margin-right = 0
65
+
66
+ = Groongaのトークナイザー
67
+
68
+ # image
69
+ # src = search_tk.png
70
+ # relative-height = 100
71
+ # align = center
72
+ # relative-margin-top = 0
73
+ # relative-margin-right = 0
74
+
75
+
76
+ = Ngramトークナイザー
77
+ * 所定の長さのユニットサイズで1文字ずつずらす \n1:Unigram 2:Bigram 3:Trigram
78
+ * 例:「今日は雨だ」⇒\n「今日/日は/は雨/雨だ/((*だ*))」
79
+ * Groongaは1文字でも検索できるように末尾1文字も含まれる
80
+
81
+ = Ngramトークナイザー
82
+ * デフォルトではアルファベット、記号、数字はグループ化
83
+ * 検索ノイズ低減、検索速度向上のため
84
+ * アルファベット、記号、数字もNgramにしたいのであれば、TokenBigramSplit~系を使う
85
+
86
+ = Ngramトークナイザーのメリット
87
+ * 漏れのない検索が可能
88
+ * 新語、造語に対応\n(('note:特許文献の場合、権利解釈の範囲を狭めないように固有名詞があまり使われず商標も使えないので造語だらけ'))
89
+ * メンテナンスコスト不要
90
+
91
+ = Ngramトークナイザーのデメリット
92
+ * 1文字ずつずらすためトークンの総数が多くなり転置索引のサイズが大きくなる\n(('note:転置索引のサイズはほぼトークンの総数によって決まる'))
93
+ * 検索ノイズが含まれることがある (('note:例:東京都に対して京都でヒットする'))
94
+ * 日本語の場合、あまり大きな影響ではない (('note:要件による'))
95
+
96
+ = 形態素解析トークナイザー
97
+ * 形態素解析器を使って文脈に応じて単語単位に分かち書き\nTokenMecab
98
+ * 分割ルールは学習モデルと辞書による (('note:Unidicであれば短く分かち書き'))
99
+ * 例:「今日は雨だ」⇒\n「今日/は/雨/だ」
100
+
101
+ = 形態素解析トークナイザーのメリット
102
+ * 検索ノイズの低減\n(('note:例:東京都に対して京都がヒットしない'))
103
+ * 単語ごとにずらせるため転置索引のサイズがコンパクト\n(('note:形態素解析の場合「転置索引」⇒「転置索引」1つ'))\n(('note:Bigramの場合「転置索引」⇒「転置/置索/索引/引」4つ'))
104
+
105
+
106
+ = 形態素解析トークナイザーのデメリット
107
+ * 検索漏れ有
108
+ * 辞書の追加やモデルの再学習などメンテナンスコスト大
109
+ * 検索クエリと文章中では文脈が異なり分割ルールが異なることがまれによくある (('note:チューニングが大変'))
110
+
111
+ = キー探索
112
+
113
+ # image
114
+ # src = search_key.png
115
+ # relative-height = 100
116
+ # align = center
117
+ # relative-margin-top = 0
118
+ # relative-margin-right = 0
119
+
120
+ = キー探索
121
+ * ハッシュ表やパトリシアトライなどを使って語彙表のキーとして登録されたトークンを探す
122
+ * いわゆる辞書引き・KVS
123
+ * Groongaではインデックス≠キー
124
+ * キー探索は非常に速くμsecオーダー (('note:KVSが速いのは知っているはず'))
125
+
126
+ = キーの種類数が増える要因
127
+ * 文字の種類数が多いこと\n(('note:組み合わせが増えるためキーの種類数は多くなる'))
128
+ * 日本語の文字の種類は多い\n(('note:ひらがなカタカナ50種 漢字いっぱい'))
129
+ * 英語の文字の種類は非常に少ない\n(('note:アルファベット26種'))
130
+ * 日本語はキーの種類が多い
131
+
132
+ = キーの種類数が増える要因
133
+ * 文字数が多いこと\n(('note:組み合わせが増えるためキーの種類数は多くなる'))
134
+ * NgramのNが大きいほどキーの種類数が多い
135
+
136
+ = キーの種類数増によるキー探索速度への影響
137
+ # RT
138
+ caption = パトリシアトライ(ADD後⇒GET)
139
+
140
+ キー種類数, キー1件取得秒数
141
+
142
+ 1万, 21 μsec
143
+ 1千万, 37 μsec
144
+
145
+ = キーの種類数増によるキー探索速度への影響
146
+ * キー探索はキーの種類が増えても線形的に時間が増えない \n(('note:例:ハッシュ表O(1)、パトリシアトライO(k)'))
147
+ * キー種類増の検索速度への影響は非常に軽微
148
+
149
+ = ポスティング探索
150
+
151
+ # image
152
+ # src = search_post.png
153
+ # relative-height = 100
154
+ # align = center
155
+ # relative-margin-top = 0
156
+ # relative-margin-right = 0
157
+
158
+ = ポスティング探索
159
+ * キー探索によって取得したポスティングリスト中のトークンの出現位置と検索クエリのトークンの出現位置の相対的な並びが一致するかどうかを比較
160
+ * トークンの出現頻度が増えるとポスティングリストが長くなる
161
+ * 一番時間がかかるところ\n(('note:シーケンシャルサーチを除く'))
162
+
163
+ = トークンの出現頻度が増える要因
164
+ * 文字の種類数が少ないほどキーの種類数は少ない\n⇒ トークン1個あたりの出現頻度は大きい
165
+ * 日本語はキーの種類が多い\n⇒トークンの出現頻度が少ない
166
+
167
+ = トークンの出現頻度が増える要因
168
+ * 文字数が少ないほどキーの種類数は少ない\n⇒ トークン1個あたりの出現頻度は大きい
169
+ * NgramのNが大きいとキーの種類数が多い\n⇒ トークンの出現頻度が少ない
170
+
171
+ = Bigramトークナイザーの出現頻度と検索速度例
172
+ # image
173
+ # src = bigram_hindo.png
174
+ # relative-height = 100
175
+ # align = right
176
+ # relative-margin-top = 0
177
+ # relative-margin-right = 0
178
+
179
+ = トークンの出現頻度増によるポスティング探索速度への影響
180
+ * 文書数/サイズが多くなるとトークンの出現頻度が増えポスティングリストが非常に長くなる
181
+ * トークンの出現頻度に応じてほぼ線形的に検索時間が伸びる
182
+ * 大抵の場合、ポスティングリストの探索でCPUがボトルネック
183
+
184
+ = 検索速度を高速に保つために重要なこと
185
+ * キーの種類数よりもポスティングリストが長くなりすぎないようにする
186
+ * (('note:CPUクロック数を上げる'))
187
+
188
+ = 形態素解析トークナイザーの出現頻度例
189
+ # image
190
+ # src = keitai_hindo.png
191
+ # relative-height = 100
192
+ # align = right
193
+ # relative-margin-top = 0
194
+ # relative-margin-right = 0
195
+
196
+ = 形態素解析トークナイザーの高速化
197
+ * 助詞などの頻出語をストップワードにする
198
+ * 頻出語を含む複合語を辞書登録
199
+ * 見出しタグ等文書に必ず含まれるフレーズを除去もしくは辞書登録
200
+
201
+ = Ngramトークナイザーの高速化
202
+ * Nのサイズを大きくする \nBigram ⇒ Trigram
203
+ * トークンの種類が増えて1つごとのポスティングリストは短くなる
204
+
205
+ = Trigramトークナイザーの出現頻度と検索速度例
206
+ # image
207
+ # src = trigram_hindo.png
208
+ # relative-height = 100
209
+ # align = right
210
+ # relative-margin-top = 0
211
+ # relative-margin-right = 0
212
+
213
+ = Bigramトークナイザーの出現頻度と検索速度例(再褐)
214
+ # image
215
+ # src = bigram_hindo.png
216
+ # relative-height = 100
217
+ # align = right
218
+ # relative-margin-top = 0
219
+ # relative-margin-right = 0
220
+
221
+ = Ngramトークナイザーの高速化
222
+ * Trigramにすれば基本的に3文字以上の検索速度が速くなる
223
+ * 日本語は文字種も多いためTrigramであればかなり速い
224
+ * が、まだ速くする方法がある
225
+
226
+ = Ngramトークナイザーをさらに高速化するために
227
+ * Ngramの文書追加時は1文字ずらしでキーを登録する必要あ
228
+ * 日本語は文章中の単語境界が判断できないため
229
+ * 「今日は雨だ」⇒\n「今日/日は/は雨/雨だ/だ」
230
+
231
+ = Ngramトークナイザーをさらに高速化するために
232
+ * 検索時は開始位置が決まっているので1文字ずらしする必要はない\n⇒オーバラップ部分をスキップ
233
+ * 「今日は雨」⇒「今日/日は/は雨」((*×*))
234
+ * 「今日は雨」⇒「今日/  /は雨」((*○*))
235
+
236
+ = Ngramトークナイザーをさらに高速化するために
237
+ * 末尾で短くなるところは短い奴を採用するのではなく1つ手前の長い方を採用する\n(('note:短いやつはポスティングリストが長く検索が遅い'))
238
+ * 「今日は雨だ」\n⇒「今日/  /は雨/ /だ」((*×*))\n⇒「今日/  /は雨/雨だ」((*○*))
239
+
240
+ = Ngramトークナイザーをさらに高速化するために
241
+ * これを追加実装したのが以下のトークナイザー
242
+
243
+ TokenYaBigram \nTokenYaTrigram \n ~SplitSymbolAlphaもあり
244
+
245
+ = TokenBigram/TokenYaBigramの速度
246
+ # RT
247
+ caption = Wikipedia(ja)で1000回検索
248
+
249
+ トークナイザー, 検索秒数平均
250
+
251
+ TokenBigram, 0.0508sec
252
+ TokenYaBigram, 0.0325sec
253
+
254
+ = TokenTrigram/TokenYaTrigramの速度
255
+ # RT
256
+ caption = Wikipedia(ja)で1000回検索
257
+
258
+ トークナイザー, 検索秒数平均
259
+
260
+ TokenTrigram, 0.0146sec
261
+ TokenYaTrigram, 0.0063sec
262
+
263
+ = TokenYaBigram/TokenYaTrigramの速度
264
+ * YaBigramはBigramに比べ1.5倍ほど速い
265
+ * YaTrigramはTrigramに対して2倍ほど速い
266
+ * NgramのNのサイズが大きいほどオーバーラップを飛ばす量が大きくなるためより速くなる
267
+
268
+ = TokenBigram/TokenTrigramのキー
269
+ # RT
270
+ caption = Wikipedia(ja)
271
+
272
+ トークナイザー, キーの数, キーサイズ
273
+
274
+ TokenBigram, 5767474, 136.047MiB
275
+ TokenTrigram, 28691883, 684.047MiB
276
+
277
+ = TokenTrigramのデメリット
278
+
279
+ * TokenTrigramはTokenBigramに比べキー数とキーサイズが増大
280
+ * メモリ使用量が増大
281
+ * キーサイズは小さいほうが望ましい
282
+
283
+ = Bigramトークナイザーの出現頻度と検索速度例(再褐)
284
+ # image
285
+ # src = bigram_hindo.png
286
+ # relative-height = 100
287
+ # align = right
288
+ # relative-margin-top = 0
289
+ # relative-margin-right = 0
290
+
291
+ = Ngramトークナイザーを効率化するために
292
+
293
+ * トークンの出現頻度は大きく偏っている
294
+ * 大半のトークンは出現頻度が高くなく十分な検索速度が得られている
295
+ * Bigramの出現頻度が高い部分さえTrigramにできれば良い
296
+
297
+ = Ngramトークナイザーを効率化するために
298
+ * これを追加実装したのが以下のトークナイザー
299
+ * TokenYaVgram\nTokenYaVgramBoth\n ~SplitSymbolAlphaもあり
300
+
301
+ = TokenYaVgram
302
+
303
+ * 管理テーブルのキーと一致するBigramトークンのみを後ろに伸ばしてTrigramにする
304
+ * 管理テーブルにあらかじめ出現頻度に応じたBigramトークンを登録しておく
305
+
306
+ = TokenYaVgram
307
+ * 「画像処理装置」で「処理」を管理テーブルに登録
308
+ * 「画像/増処/処理装/理装/装置/置」
309
+
310
+ = TokenYaVgram
311
+
312
+ * 検索クエリの末尾では、Trigram対象のBigramトークンであっても後ろに伸ばせない
313
+ * この場合は強制的に前方一致検索させる
314
+ * 「画像処理」で「処理」を登録\n⇒「画像/  /処理*」
315
+
316
+ = TokenYaVgram/TokenBigramの速度
317
+ # RT
318
+ caption = Wikipedia(ja)で1000回検索
319
+
320
+ トークナイザー, 検索秒数平均
321
+
322
+ TokenBigram, 0.0444 sec
323
+ TokenYaVgram, 0.0166 sec
324
+
325
+ = TokenYaVgram/TokenBigramのキー
326
+ # RT
327
+ caption = Wikipedia(ja)
328
+
329
+ トークナイザー, キーの数, キーサイズ
330
+
331
+ TokenBigram, 5767474, 136.047MiB
332
+ TokenYaVgram, 7425198, 172.047MiB
333
+
334
+ = TokenYaVgramの効果
335
+
336
+ * キーサイズの増大を抑えつつ、検索速度の高速化を実現
337
+ * しかし、検索クエリ末尾のものは後ろに伸ばすことができない
338
+ * 「画像処理装置」で「装置」を登録\n⇒「画像/増処/処理/理装/装置/置」
339
+
340
+ = TokenYaVgramBoth
341
+
342
+ * 管理テーブルのキーと一致するBigramトークンのみを後ろに伸ばしてTrigramにする
343
+ * 1つ後ろのBigramトークンが管理テーブルのキーと一致するトークンも後ろに伸ばしてTrigramにする
344
+
345
+ = TokenYaVgramBoth
346
+ * 管理テーブルにはあらかじめ出現頻度に応じたBigramトークンを登録
347
+ * 「画像処理装置」で「処理」を登録\n⇒「画像/増処理/処理装/理装/装置/置」
348
+
349
+ = TokenYaVgramBoth
350
+
351
+ * この場合、検索クエリでは伸ばせないケースが非常に多く発生する
352
+ * 全ての場合で強制的に前方一致検索させる(('note:を得ない'))
353
+ * 「画像処」で「処理」を登録\n⇒「画像/増処*」
354
+
355
+ = TokenYaVgramBoth/TokenBigramの速度
356
+ # RT
357
+ caption = Wikipedia(ja)で1000回検索
358
+
359
+ トークナイザー, 検索秒数平均
360
+
361
+ TokenBigram, 0.0444 sec
362
+ TokenYaVgramBoth, 0.0065 sec
363
+
364
+ = TokenYaVgramBoth/TokenBigramのキー
365
+ # RT
366
+ caption = Wikipedia(ja)
367
+
368
+ トークナイザー, キーの数, キーサイズ
369
+
370
+ TokenBigram, 5767474, 136.047MiB
371
+ TokenYaVgramBoth, 8560779, 200.047MiB
372
+
373
+ = TokenYaVgramBothの効果
374
+ * 出現頻度が高いもののみTrigramにすることでキーサイズの増大を抑えつつ、検索速度の高速化を実現
375
+ * TokenYaTrigram並の検索速度ながらもキーサイズをTokenTrigramの1/3以下に抑えられた
376
+
377
+ = 既知フレーズのグループ化
378
+ * あらかじめ既知のフレーズを管理テーブルに登録
379
+ * そのフレーズのみグループ化してトークナイズ
380
+ * パトリシアトライのLCPサーチを利用して高速にフレーズ抽出
381
+
382
+ = 既知フレーズのグループ化
383
+ * 「12月は寒い」で「12月」を登録\n⇒「12月/は寒/寒い」
384
+
385
+ = 既知フレーズのグループ化の効果
386
+ * 検索ノイズの低減
387
+ * 見出しタグや頻出語を含む複合語などを登録することにより頻出トークン数を低減
388
+
389
+
390
+ = まとめ
391
+ * 検索速度を高速に保つのためにはポスティングリストが長くなりすぎないようにする
392
+ * Ngramの検索時はオーバラップさせなくても良い
393
+ * トークンの出現頻度は偏る
394
+ * これらの特性から検索を高速化、効率化するためにNgramトークナイザーを改良
395
+
396
+ = おまけ その他のプラグイン
397
+ * groonga-token-filter-yatof\n
398
+ (('note:https://github.com/naoa/groonga-token-filter-yatof'))
399
+ * 適当なトークンフィルター集
400
+ * LengthとかSymbolとかSynonymとか
401
+ * 使おうとしている
402
+
403
+ = おまけ その他のプラグイン
404
+ * groonga-command-token-count\n
405
+ (('note:https://github.com/naoa/groonga-command-token-count'))
406
+ * ポスティングリストをたどってトークン数を数える
407
+ * 別にコマンドプラグインである必要はなかった
408
+ * 使っている
409
+
410
+ = おまけ その他のプラグイン
411
+ * groonga-function-snippet_tritonn\n
412
+ (('note:https://github.com/naoa/groonga-function-snippet_tritonn'))
413
+ * フルスペックスニペット関数 Mroonga(Tritonn) Like
414
+ * 地獄のシンタックス
415
+ * 使っている
416
+
417
+ = おまけ その他のプラグイン
418
+ * groonga-tokenizer-tinysegmenter\n
419
+ (('note:https://github.com/naoa/groonga-tokenizer-tinysegmenter'))
420
+ * TinySegmenterを使った形態素解析トークナイザー 態素解析用の辞書を持たないのでコンパクト
421
+ * 学習ツール公開している人がいるのでそれ使えば簡単に学習できる
422
+ * 使っていない
423
+
424
+ = おまけ その他のプラグイン
425
+ * groonga-tokenizer-yadelimit\n
426
+ (('note:https://github.com/naoa/groonga-tokenizer-yadelimit'))
427
+ * TokenDelimitのバリエーション
428
+ * 使おうとしている
429
+
430
+ = おまけ その他のプラグイン
431
+ * groonga-function-regex\n
432
+ (('note:https://github.com/naoa/groonga-function-regex'))
433
+ * RE2ライブラリを使って正規表現でoutputを整形
434
+ * Onigumoバンドルされたからそれ使えばいい気がする
435
+ * 使っていない
436
+
437
+ = おまけ その他のプラグイン
438
+ * groonga-normalizer-yamysql\n
439
+ (('note:https://github.com/naoa/groonga-normalizer-yamysql'))
440
+ * ハイフンとか漢字の異体字とかヴァとかを正規化
441
+ * フレーズ除去とか
442
+ * 盛大にバグっている なおったら使う予定
443
+
444
+ = おまけ その他のプラグイン
445
+ * groonga-column-hole\n
446
+ (('note:https://github.com/naoa/groonga-column-hole'))
447
+ * カラムにデータをいれたらデータが消えるかも
448
+ * 転置索引はつくられる
449
+ * hook apiがあることを知ったので試しただけ使っていない
450
+
451
+ = おまけ その他のプラグイン
452
+ * groonga-word2vec\n
453
+ (('note:https://github.com/naoa/groonga-word2vec'))
454
+ * コピペしただけGroongaのプラグインである意味はない
455
+ * 自動的にクエリ展開とかあるかも
456
+ * 使っていない