rabbit-slide-naoa-groonga-tokenizer-talks-naoa 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +22 -0
- data/Rakefile +17 -0
- data/bigram_hindo.png +0 -0
- data/config.yaml +20 -0
- data/groonga-tokenizer-talks-naoa.rab +480 -0
- data/icon.jpg +0 -0
- data/ipnexus_logo.png +0 -0
- data/keitai_hindo.png +0 -0
- data/logo.png +0 -0
- data/patent.svg +2017 -0
- data/patentfield.png +0 -0
- data/patentfield.svg +264 -0
- data/pdf/groonga-tokenizer-talks-naoa-groonga-tokenizer-talks-naoa.pdf +0 -0
- data/search.png +0 -0
- data/search.svg +1299 -0
- data/search_key.png +0 -0
- data/search_post.png +0 -0
- data/search_post.svg +1475 -0
- data/search_tk.png +0 -0
- data/trigram_hindo.png +0 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c99eb48a154a3658a55b1b7f84fcecd1b73fdc27
|
4
|
+
data.tar.gz: a1c99ea6a3928f06470173bbc966319faae0fb08
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 05c05f5d7f5336e6084fa9b3924cef2695f7ce5d6dfd6f45d59b67ad048ceaffb6498c1da8f1cbc3d178b38f04e9fe95047279af41ed16035f687378bfc1d521
|
7
|
+
data.tar.gz: ecc82418248749fa5b7436d6de3b2e3d51e80b54ad0e5506082cf0a8ea6d357a34220b888ab856be10a9f7b46117d9cc4da4ddabb1cab5ee2e46f94ab47eb016
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
groonga-tokenizer-talks-naoa.rab
|
data/README.rd
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
= Groongaの可変型Ngramトークナイザーについて
|
2
|
+
|
3
|
+
== 作者向け
|
4
|
+
|
5
|
+
=== 表示
|
6
|
+
|
7
|
+
rake
|
8
|
+
|
9
|
+
=== 公開
|
10
|
+
|
11
|
+
rake publish
|
12
|
+
|
13
|
+
== 閲覧者向け
|
14
|
+
|
15
|
+
=== インストール
|
16
|
+
|
17
|
+
gem install rabbit-slide-naoa-gronga-tokneizer-talks-naoa
|
18
|
+
|
19
|
+
=== 表示
|
20
|
+
|
21
|
+
rabbit rabbit-slide-naoa-gronga-tokneizer-talks-naoa.gem
|
22
|
+
|
data/Rakefile
ADDED
@@ -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
|
data/bigram_hindo.png
ADDED
Binary file
|
data/config.yaml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
id: groonga-tokenizer-talks-naoa
|
3
|
+
base_name: groonga-tokenizer-talks-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,480 @@
|
|
1
|
+
= Groongaの可変型Ngramトークナイザー\nについて
|
2
|
+
|
3
|
+
: author
|
4
|
+
Naoya Murakami
|
5
|
+
: institution
|
6
|
+
: content-source
|
7
|
+
Groonga "Tokenizer" Talks
|
8
|
+
: date
|
9
|
+
2015/3/20
|
10
|
+
: allotted-time
|
11
|
+
55m
|
12
|
+
: theme
|
13
|
+
clear-blue
|
14
|
+
|
15
|
+
= (('tag:small:自己紹介'))
|
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 Murakami
|
25
|
+
* (('tag:small:1月から知財のWeb系のスタートアップに転職'))
|
26
|
+
* (('tag:x-small:東京に引っ越しました!'))
|
27
|
+
* (('tag:x-small:その前は数年ほど関西の特許事務所勤務'))
|
28
|
+
* (('tag:x-small:仕事でプログラミングするのは初めて'))
|
29
|
+
(('note: twitter: @naoa_y'))\n
|
30
|
+
(('note: blog: http://blog.createfield.com'))
|
31
|
+
|
32
|
+
= (('tag:x-large:Groongaのおかげで転職ができました'))
|
33
|
+
|
34
|
+
=
|
35
|
+
# image
|
36
|
+
# src = ipnexus_logo.png
|
37
|
+
# relative-height = 16
|
38
|
+
# align = right
|
39
|
+
# relative-margin-top = -37
|
40
|
+
# relative-margin-right = 10
|
41
|
+
|
42
|
+
* (('tag:small:グローバルな知的財産権の流通市場プラットフォーム')) (('note:https://www.ipnexus.com'))
|
43
|
+
* (('tag:small:IPの専門家と顧客とを繋げるサービス'))
|
44
|
+
* (('tag:small:個人発明家やスタートアップでも知財を有効活用できるように'))
|
45
|
+
* (('tag:small:まだ事業を立ち上げている段階'))
|
46
|
+
|
47
|
+
= (('tag:small:最近やっていること'))
|
48
|
+
|
49
|
+
* (('tag:small:Railsとかその辺が多い'))\n(('note:仕事ではまだGroongaを使っていない'))
|
50
|
+
* (('tag:small:圧倒的に人材不足'))
|
51
|
+
* (('tag:small:事業内容や開発に興味がある方は気軽に声をかけてください'))
|
52
|
+
* (('tag:small:個人的には検索技術やデータマイニングとかに興味がある'))
|
53
|
+
|
54
|
+
= (('tag:small:個人でやっていたこと'))
|
55
|
+
|
56
|
+
# image
|
57
|
+
# src = patentfield.svg
|
58
|
+
# relative-height = 15
|
59
|
+
# align = right
|
60
|
+
# relative-margin-top = -30
|
61
|
+
# relative-margin-right = -23
|
62
|
+
|
63
|
+
* (('tag:small:特許の全文検索サービス'))\n(('note:http://patentfield.com'))
|
64
|
+
* (('tag:x-small:特許検索では内容を絞り込むための分類体系がたくさんある')) (('note:IPC, FI, FTERM, UC, CPC ...'))
|
65
|
+
* (('tag:x-small:特許文献では固有名詞はほとんど使われずあまり特徴的なワードを取ることはできない'))\n (('note:パソコン⇒情報処理装置, バイオリン⇒弦楽器 etc'))
|
66
|
+
* (('tag:x-small:検索してすぐにそれっぽいものが見つかるよりも検索漏れ防止のが重要'))\n(('tag:x-small:⇒Ngramのトークナイザーが使いたい'))
|
67
|
+
|
68
|
+
= (('tag:small:個人でやっていたこと'))
|
69
|
+
|
70
|
+
* (('tag:small:一番大きな((*日本語*))のデータベースで'))
|
71
|
+
* (('tag:small:数百GiB超(カラム非圧縮時)'))
|
72
|
+
* (('tag:small:一千万レコード超'))
|
73
|
+
* (('tag:small:Ngramトークナイザーは検索漏れに強いが '))(('note:一般的に'))(('tag:small:((*速度DOWN*)) サイズUP'))\n(('tag:small:⇒Ngramのトークナイザーを高速化'))
|
74
|
+
|
75
|
+
= (('tag:small:改良型Ngramトークナイザー'))
|
76
|
+
* YaNgram - Yet another Ngram tokenizer plugin\n
|
77
|
+
(('note:https://github.com/naoa/groonga-tokenizer-yangram'))
|
78
|
+
* (('tag:small:検索時のオーバラップスキップ'))
|
79
|
+
* (('tag:small:静的な頻度情報に応じた可変Ngram(Vgram)'))
|
80
|
+
* (('tag:small:既知フレーズのグループ化'))
|
81
|
+
|
82
|
+
= (('tag:small:Groongaの全文検索の流れ'))
|
83
|
+
|
84
|
+
# image
|
85
|
+
# src = search.png
|
86
|
+
# relative-height = 100
|
87
|
+
# align = center
|
88
|
+
# relative-margin-top = 0
|
89
|
+
# relative-margin-right = 0
|
90
|
+
|
91
|
+
= (('tag:small:キー探索'))
|
92
|
+
|
93
|
+
# image
|
94
|
+
# src = search_key.png
|
95
|
+
# relative-height = 100
|
96
|
+
# align = center
|
97
|
+
# relative-margin-top = 0
|
98
|
+
# relative-margin-right = 0
|
99
|
+
|
100
|
+
= (('tag:small:キー探索'))
|
101
|
+
* (('tag:small:ハッシュ表やパトリシアトライなどを使って語彙表のキーとして登録されたトークンを探す'))
|
102
|
+
* (('tag:small:いわゆる辞書引き・KVS'))
|
103
|
+
* (('tag:small:Groongaではインデックス≠キー'))
|
104
|
+
* (('tag:small:キー探索は非常に速くμsecオーダー'))
|
105
|
+
|
106
|
+
= (('tag:small:キーの種類数が増える要因'))
|
107
|
+
* (('tag:small:文字の種類数が多いこと'))\n(('note:組み合わせが増えるためキーの種類数は多くなる'))
|
108
|
+
* (('tag:x-small:日本語の文字の種類は多い'))\n(('note:ひらがなカタカナ50種 漢字いっぱい'))
|
109
|
+
* (('tag:x-small:英語の文字の種類は非常に少ない'))\n(('note:アルファベット26種'))
|
110
|
+
* (('tag:small:文字数が多いこと'))\n(('note:組み合わせが増えるためキーの種類数は多くなる'))
|
111
|
+
* (('tag:x-small:NgramはNが大きいほどキーの種類数が多い'))
|
112
|
+
|
113
|
+
= (('tag:small:キーの種類数増によるキー探索速度への影響'))
|
114
|
+
# RT
|
115
|
+
caption = パトリシアトライ(ADD後⇒GET)
|
116
|
+
|
117
|
+
(('tag:x-small:キー種類数')), (('tag:x-small:キー1件取得秒数'))
|
118
|
+
|
119
|
+
(('tag:x-small:1万')), (('tag:x-small:21 μsec'))
|
120
|
+
(('tag:x-small:1千万')), (('tag:x-small:37 μsec'))
|
121
|
+
|
122
|
+
|
123
|
+
= (('tag:small:キーの種類数増によるキー探索速度への影響'))
|
124
|
+
* (('tag:small:キー探索はキーの種類が増えても線形的に時間が増えない')) \n(('note:例:ハッシュ表O(1)、パトリシアトライO(k)'))
|
125
|
+
* (('tag:small:キー種類増による検索速度への影響は非常に軽微'))
|
126
|
+
|
127
|
+
= (('tag:small:ポスティング探索'))
|
128
|
+
|
129
|
+
# image
|
130
|
+
# src = search_post.png
|
131
|
+
# relative-height = 100
|
132
|
+
# align = center
|
133
|
+
# relative-margin-top = 0
|
134
|
+
# relative-margin-right = 0
|
135
|
+
|
136
|
+
= (('tag:small:ポスティング探索'))
|
137
|
+
* (('tag:small:キー探索によって取得したポスティングリスト中のトークンの出現位置と検索クエリのトークンの出現位置の並びが一致するかどうかを比較'))
|
138
|
+
* (('tag:small:トークンの出現頻度が増えるとポスティングリストが長くなる'))
|
139
|
+
* 一番時間がかかるところ\n(('note:シーケンシャルサーチを除く'))
|
140
|
+
|
141
|
+
= (('tag:small:トークンの出現頻度が増える要因'))
|
142
|
+
* (('tag:small:キーの種類数が少ないほどトークン1個あたりの出現頻度は大きくなる'))
|
143
|
+
* (('tag:x-small:Unigramや英語の文章をBigramでトークナイズするとトークン1個あたりの出現頻度は非常に大きい'))
|
144
|
+
* (('tag:small:「((*の、が、は*))」などの助詞は1文書中にたくさん出現する'))
|
145
|
+
|
146
|
+
= (('tag:small:頻出トークンのポスティング探索速度への影響'))
|
147
|
+
* (('tag:small:トークンの出現頻度の増加に応じて検索時間が伸びる'))\n(('note:できるだけ飛ばせるところはとばしているが、規模が大きくなってくるとほぼ線形に検索速度に影響してくる'))
|
148
|
+
* (('tag:small:大抵の場合、ポスティングリストの探索でCPUがボトルネック'))
|
149
|
+
* (('tag:small:文書数/サイズに応じて頻出トークンのポスティングリストが長くなる'))
|
150
|
+
* (('tag:small:クエリ間の検索速度の差が広がる'))
|
151
|
+
|
152
|
+
= (('tag:small:Bigramトークナイザーの検索速度例'))
|
153
|
+
|
154
|
+
# image
|
155
|
+
# src = bigram_hindo.png
|
156
|
+
# relative-height = 100
|
157
|
+
# align = center
|
158
|
+
# relative-margin-top = 0
|
159
|
+
# relative-margin-right = 0
|
160
|
+
|
161
|
+
= (('tag:small:検索速度を高速に保つために重要なこと'))
|
162
|
+
* (('tag:small:キーの種類数よりもポスティングリストが長くなりすぎないようにする'))
|
163
|
+
* (('note:CPUクロック数を上げる'))
|
164
|
+
* (('note:なお、最新のGroongaでは頻出トークンとレアトークンの組み合わせ時に一部の探索をスキップする高速化処理が組み込まれているが、このスライドの実験結果には反映されていない'))\n(('note:http://sourceforge.jp/projects/groonga/lists/archive/dev/2015-February/003097.html'))
|
165
|
+
|
166
|
+
= (('tag:small:Groongaのトークナイザー'))
|
167
|
+
|
168
|
+
# image
|
169
|
+
# src = search_tk.png
|
170
|
+
# relative-height = 100
|
171
|
+
# align = center
|
172
|
+
# relative-margin-top = 0
|
173
|
+
# relative-margin-right = 0
|
174
|
+
|
175
|
+
= (('tag:small:Ngramトークナイザー'))
|
176
|
+
* (('tag:small:所定の長さのユニットサイズで1文字ずつずらす')) \n(('tag:small:1:Unigram 2:Bigram 3:Trigram'))
|
177
|
+
* (('tag:x-small:「今日は雨だ」'))⇒(('tag:x-small:「今日/日は/は雨/雨だ/((*だ*))」'))
|
178
|
+
* (('tag:small:Groongaでは1文字でも検索できるように末尾1文字も含まれる'))\n(('note:検索時は末尾1文字は含まれない'))
|
179
|
+
|
180
|
+
= (('tag:small:Ngramトークナイザー'))
|
181
|
+
* (('tag:small:デフォルトではアルファベット、記号、数字はグループ化'))
|
182
|
+
* (('tag:x-small:検索ノイズ低減、検索速度向上のため'))
|
183
|
+
* (('tag:small:アルファベット、記号、数字もNgramにしたいのであれば、TokenBigramSplit系を使う'))
|
184
|
+
|
185
|
+
= (('tag:small:Ngramトークナイザーのメリット'))
|
186
|
+
* (('note:原則')) 漏れのない検索が可能
|
187
|
+
* 辞書のメンテナンスコスト不要
|
188
|
+
|
189
|
+
= (('tag:small:Ngramトークナイザーのデメリット'))
|
190
|
+
* (('tag:small:1文字ずつずらすためトークンの総数が多くなり転置索引のサイズが大きくなる'))\n(('note:転置索引のサイズはほぼトークンの総数によって決まる'))
|
191
|
+
* (('tag:small:検索ノイズが含まれることがある')) \n(('note:例:東京都に対して京都でヒットする'))
|
192
|
+
* (('tag:small:トークンの比較回数が多く形態素解析よりも検索速度が遅くなることがある'))
|
193
|
+
|
194
|
+
= (('tag:small:形態素解析トークナイザー'))
|
195
|
+
* (('tag:small:形態素解析器を使って文脈に応じて単語単位に分かち書き TokenMecab'))
|
196
|
+
* (('tag:small:分割ルールは学習モデルと辞書による')) (('note:Unidicであれば短く分かち書き'))
|
197
|
+
* (('tag:x-small:例:「今日は雨だ」'))(('tag:x-small:⇒「今日/は/雨/だ」'))
|
198
|
+
|
199
|
+
= (('tag:small:形態素解析トークナイザーのメリット'))
|
200
|
+
* (('tag:small:検索ノイズの低減'))\n(('note:例:東京都に対して京都がヒットしない'))
|
201
|
+
* (('tag:small:単語ごとにずらせるため転置索引のサイズがコンパクト'))\n(('note:形態素解析の場合「転置索引」⇒「転置索引」1つ'))\n(('note:Bigramの場合「転置索引」⇒「転置/置索/索引/引」4つ'))
|
202
|
+
* (('tag:small:おおむね検索が高速'))\n(('note:基本的に比較するトークンの数がNgramよりも少ない'))
|
203
|
+
|
204
|
+
= (('tag:small:形態素解析トークナイザーのデメリット'))
|
205
|
+
* (('tag:x-small:検索漏れ有'))
|
206
|
+
* (('tag:x-small:辞書の追加やモデルの再学習などメンテナンスコスト大'))
|
207
|
+
* (('tag:x-small:検索クエリと文章中では文脈が異なり分割ルールが異なることがまれによくある'))\n(('note:チューニングが大変。検索クエリでは左の文脈がない'))
|
208
|
+
* (('tag:x-small:クエリによって検索速度にムラがでやすい'))\n(('note:形態素解析では1文字トークンもあり出現頻度の最大値がNgramよりもかなり大きくなりやすい'))\n(('note:⇒ストップワードが重要'))
|
209
|
+
|
210
|
+
= (('tag:small:Bigramトークナイザーの出現頻度例'))
|
211
|
+
|
212
|
+
# image
|
213
|
+
# src = bigram_hindo.png
|
214
|
+
# relative-height = 100
|
215
|
+
# align = center
|
216
|
+
# relative-margin-top = 0
|
217
|
+
# relative-margin-right = 0
|
218
|
+
|
219
|
+
= (('tag:small:形態素解析トークナイザーの出現頻度例'))
|
220
|
+
|
221
|
+
# image
|
222
|
+
# src = keitai_hindo.png
|
223
|
+
# relative-height = 100
|
224
|
+
# align = center
|
225
|
+
# relative-margin-top = 0
|
226
|
+
# relative-margin-right = 0
|
227
|
+
|
228
|
+
= (('tag:small:Ngramトークナイザーの高速化1'))\n(('tag:small:検索時のオーバーラップスキップ'))
|
229
|
+
* (('tag:small:Ngramの文書追加時は1文字ずらしですべてのポジションのキーを登録'))
|
230
|
+
* (('tag:small:検索時も1文字ずらしでキー探索、ポスティングリスト比較'))
|
231
|
+
* (('tag:x-small:例:「今日は雨だ」'))⇒(('tag:x-small:「今日/日は/は雨/雨だ」'))
|
232
|
+
* (('tag:small:トークンの比較回数が多い'))
|
233
|
+
* (('tag:small:検索速度が((*劣化*))'))
|
234
|
+
|
235
|
+
= (('tag:small:Ngramトークナイザーの高速化1'))\n(('tag:small:検索時のオーバーラップスキップ'))
|
236
|
+
* (('tag:small:Ngramの文書追加時は1文字ずらしですべてのポジションのキーを登録'))
|
237
|
+
* (('tag:small:検索時も1文字ずらしでキー探索、ポスティングリスト比較'))
|
238
|
+
* (('tag:x-small:例:「今日は雨だ」'))⇒(('tag:x-small:「今日/日は/は雨/雨だ」'))
|
239
|
+
* (('tag:small:トークンの比較回数が多い'))
|
240
|
+
* (('tag:small:検索速度が((*劣化*))'))
|
241
|
+
|
242
|
+
= (('tag:small:Ngramトークナイザーの高速化1'))\n(('tag:small:検索時のオーバーラップスキップ'))
|
243
|
+
* (('tag:small:検索時は開始位置が決まっているので1文字ずらしする必要はない'))
|
244
|
+
* (('tag:small:原則:オーバラップ部分をスキップ'))
|
245
|
+
(('tag:x-small:従来:「今日は雨」⇒「今日/日は/は雨」'))
|
246
|
+
\n(('tag:x-small:改良:「今日は雨」⇒「今日/ /は雨」'))
|
247
|
+
* (('tag:small:トークンの比較回数が3回から2回に減る'))
|
248
|
+
* (('tag:x-small:((*高速化*))'))
|
249
|
+
|
250
|
+
= (('tag:small:Ngramトークナイザーの高速化1'))\n(('tag:small:検索時のオーバーラップスキップ'))
|
251
|
+
* (('tag:small:例外:末尾や字種境界で短くなるところは1つ手前の長い方を採用する'))
|
252
|
+
* (('tag:x-small:短いやつはポスティングリストが長く検索が遅い'))
|
253
|
+
(('tag:x-small:「今日は雨だ」⇒「今日/ /は雨/ /だ」 ((*×*))'))
|
254
|
+
\n(('tag:x-small:「今日は雨だ」⇒「今日/ /は雨/雨だ」 ((*○*))'))
|
255
|
+
|
256
|
+
|
257
|
+
= (('tag:small:Ngramトークナイザーの高速化1'))\n(('tag:small:検索時のオーバーラップスキップ'))
|
258
|
+
* (('tag:x-small:これを追加実装したのが以下のトークナイザー'))
|
259
|
+
* TokenYaBigram
|
260
|
+
* TokenYaTrigram
|
261
|
+
|
262
|
+
= (('tag:small:TokenBigram/TokenYaBigram'))\n(('tag:small:の速度比較'))
|
263
|
+
# RT
|
264
|
+
caption = Wikipedia(ja)で1000回検索
|
265
|
+
|
266
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:検索秒数平均'))
|
267
|
+
|
268
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:0.0508 sec'))
|
269
|
+
(('tag:x-small:((*TokenYaBigram*))')), (('tag:x-small:((*0.0325 sec*))'))
|
270
|
+
|
271
|
+
|
272
|
+
(('tag:x-small:※5文字以上の日本語のみのカテゴリ'))
|
273
|
+
|
274
|
+
= (('tag:small:TokenTrigram/TokenYaTrigram'))\n(('tag:small:の速度比較'))
|
275
|
+
# RT
|
276
|
+
caption = Wikipedia(ja)で1000回検索
|
277
|
+
|
278
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:検索秒数平均'))
|
279
|
+
|
280
|
+
(('tag:x-small:TokenTrigram')), (('tag:x-small:0.0146 sec'))
|
281
|
+
(('tag:x-small:((*TokenYaTrigram*))')), (('tag:x-small:((*0.0063 sec*))'))
|
282
|
+
|
283
|
+
= (('tag:small:TokenYaBigram/TokenYaTrigram'))\n(('tag:small:の速度比較'))
|
284
|
+
* (('tag:small:YaBigramはBigramに比べ1.5倍ほど速い'))
|
285
|
+
* (('tag:small:YaTrigramはTrigramに比べ2倍ほど速い'))
|
286
|
+
* (('tag:x-small:オーバーラップ部分を飛ばせる量が増える'))
|
287
|
+
(('tag:xx-small:Bigram「今日は雨だな」⇒「今日/ /は雨/ /だな」((*3*))'))
|
288
|
+
\n(('tag:xx-small:Trigram「今日は雨だな」⇒「今日は/ / /雨だな」((*2*))'))
|
289
|
+
|
290
|
+
= (('tag:small:Ngramトークナイザーの高速化2'))\n(('tag:small:静的な頻度情報に応じた可変Ngram(Vgram)'))
|
291
|
+
* (('tag:small:原則、Nのサイズが大きくほどトークンの種類が増えてトークン1つあたりのポスティングリストは短くなる'))
|
292
|
+
* (('tag:small:BigramをTrigramにすれば3文字以上の検索で((*速くなる*))'))
|
293
|
+
* (('note:2文字以下で検索する場合は速くはならない'))
|
294
|
+
|
295
|
+
= (('tag:small:Bigramトークナイザーの検索速度例'))
|
296
|
+
|
297
|
+
# image
|
298
|
+
# src = bigram_hindo.png
|
299
|
+
# relative-height = 100
|
300
|
+
# align = center
|
301
|
+
# relative-margin-top = 0
|
302
|
+
# relative-margin-right = 0
|
303
|
+
|
304
|
+
= (('tag:small:Trigramトークナイザーの検索速度例'))
|
305
|
+
|
306
|
+
# image
|
307
|
+
# src = trigram_hindo.png
|
308
|
+
# relative-height = 100
|
309
|
+
# align = center
|
310
|
+
# relative-margin-top = 0
|
311
|
+
# relative-margin-right = 0
|
312
|
+
|
313
|
+
= (('tag:small:TokenTrigramのデメリット'))
|
314
|
+
|
315
|
+
* (('tag:small:TokenTrigramはTokenBigramに比べキー数とキーサイズが増大'))
|
316
|
+
* (('tag:small:メモリ使用量が増大'))
|
317
|
+
* (('tag:small:キーサイズは小さいほうが望ましい'))
|
318
|
+
|
319
|
+
= (('tag:small:TokenBigram/TokenTrigramのキー'))
|
320
|
+
# RT
|
321
|
+
caption = Wikipedia(ja)
|
322
|
+
|
323
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:キーの数')), (('tag:x-small:キーサイズ'))
|
324
|
+
|
325
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:5767474')), (('tag:x-small:136.047MiB'))
|
326
|
+
(('tag:x-small:TokenTrigram')), (('tag:x-small:28691883')), (('tag:x-small:684.047MiB'))
|
327
|
+
|
328
|
+
= (('tag:small:Bigramトークナイザーの出現頻度例'))
|
329
|
+
|
330
|
+
# image
|
331
|
+
# src = bigram_hindo.png
|
332
|
+
# relative-height = 100
|
333
|
+
# align = center
|
334
|
+
# relative-margin-top = 0
|
335
|
+
# relative-margin-right = 0
|
336
|
+
|
337
|
+
= (('tag:small:Ngramトークナイザーの高速化2'))\n(('tag:small:静的な頻度情報に応じた可変Ngram(Vgram)'))
|
338
|
+
|
339
|
+
* (('tag:small:トークンの出現頻度はNgramといえ大きく偏っている'))
|
340
|
+
* (('tag:small:大半のトークンは出現頻度が高くなく十分な検索速度が得られている'))
|
341
|
+
* (('tag:small:Bigramでの((*出現頻度が高いトークンだけ*))をTrigramにすれば良い'))
|
342
|
+
|
343
|
+
= (('tag:small:Ngramトークナイザーの高速化2'))\n(('tag:small:静的な頻度情報に応じた可変Ngram(Vgram)'))
|
344
|
+
* (('tag:x-small:これを追加実装したのが以下のトークナイザー'))
|
345
|
+
* TokenYaVgram
|
346
|
+
* TokenYaVgramBoth
|
347
|
+
* TokenYaVgramQuad
|
348
|
+
|
349
|
+
= (('tag:small:TokenYaVgram'))
|
350
|
+
|
351
|
+
* (('tag:x-small:(*原則*):管理テーブルのキーと一致するBigramトークンのみを後ろに伸ばしてTrigramにする'))
|
352
|
+
* (('tag:x-small:「処理」を登録'))\n(('tag:x-small:「画像処理装置」をトークナイズ'))
|
353
|
+
* (('tag:x-small:「画像/像処/((*処理装*))/理装/装置/置」'))
|
354
|
+
* (('tag:x-small:「処理装」が出現する頻度は「処理」よりも低い'))
|
355
|
+
* (('tag:x-small:((*高速化*))'))
|
356
|
+
* (('tag:x-small:検索時は上記と同様にオーバラップを飛ばす'))
|
357
|
+
|
358
|
+
= (('tag:small:TokenYaVgram'))
|
359
|
+
|
360
|
+
* (('tag:x-small:管理テーブルに出現頻度の高いBigramトークンのみを登録しておく'))
|
361
|
+
* (('tag:xx-small:あらかじめ、ある程度の文章量が必要'))
|
362
|
+
* (('tag:xx-small:同分野であれば頻出トークンの傾向はほぼ同じ'))
|
363
|
+
* (('tag:xx-small:通常のBigramトークナイザーでインデックスを構築しAPIを使えばBigramの出現頻度を取得できる'))
|
364
|
+
* (('note: Rroonga: https://gist.github.com/naoa/fac2cff05fa9113bf5d6'))\n
|
365
|
+
* (('note: C-API: https://gist.github.com/naoa/8d862028e23e45e23304'))\n
|
366
|
+
|
367
|
+
= (('tag:small:TokenYaVgram'))
|
368
|
+
|
369
|
+
* (('tag:x-small:(*例外*):検索クエリの末尾ではTrigram対象のBigramトークンであっても後ろに伸ばせない'))
|
370
|
+
* (('tag:x-small:本文中では伸ばされている可能性がある'))
|
371
|
+
* (('tag:x-small:この場合は強制的に前方一致検索させる'))
|
372
|
+
* (('tag:x-small:vgram対象でも2文字で検索が可能'))\n(('note:ただしTokenBigramのときより速くはならない'))
|
373
|
+
* (('tag:xx-small:「処理」を登録'))\n(('tag:xx-small:文書登録:「画像処理装置」 検索クエリ:「画像処理」'))
|
374
|
+
* (('tag:xx-small:文書登録:「画像/像処/((*処理装*))/理装/装置/置」'))
|
375
|
+
* (('tag:xx-small:検索クエリ:「画像/ /処理*」'))
|
376
|
+
|
377
|
+
= (('tag:small:TokenYaVgraの速度'))
|
378
|
+
# RT
|
379
|
+
caption = Wikipedia(ja)で1000回検索
|
380
|
+
|
381
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:検索秒数平均'))
|
382
|
+
|
383
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:0.0444 sec'))
|
384
|
+
(('tag:x-small:TokenYaBigram')), (('tag:x-small:0.0325 sec'))
|
385
|
+
(('tag:x-small:TokenYaTrigram')), (('tag:x-small:0.0063 sec'))
|
386
|
+
(('tag:x-small:((*TokenYaVgram*))')), (('tag:x-small:((*0.0166 sec*))'))
|
387
|
+
|
388
|
+
= (('tag:small:TokenYaVgramのキー'))
|
389
|
+
# RT
|
390
|
+
caption = Wikipedia(ja)
|
391
|
+
|
392
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:キーの数')), (('tag:x-small:キーサイズ'))
|
393
|
+
|
394
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:5767474')), (('tag:x-small:136.047MiB'))
|
395
|
+
(('tag:x-small:TokenTrigram')), (('tag:x-small:28691883')), (('tag:x-small:684.047MiB'))
|
396
|
+
(('tag:x-small:((*TokenYaVgram*))')), (('tag:x-small:((*7425198*))')), (('tag:x-small:((*172.047MiB*))'))
|
397
|
+
|
398
|
+
= (('tag:small:TokenYaVgramの効果'))
|
399
|
+
|
400
|
+
* (('tag:small:キーサイズの増大を抑えつつ、検索の高速化を実現'))
|
401
|
+
* (('tag:small:TokenYaTrigramほど速くはならなかった'))
|
402
|
+
* (('tag:x-small:検索クエリ末尾がVgram対象の場合、2文字トークンで前方一致探索する必要がある'))
|
403
|
+
|
404
|
+
= (('tag:small:TokenYaVgramBoth'))
|
405
|
+
|
406
|
+
* (('tag:x-small:((*原則*)):管理テーブルのキーと一致するBigramトークンのみを後ろに伸ばしてTrigramにする'))
|
407
|
+
* (('tag:x-small:((*さらに*)):1つ後ろのBigramトークンが管理テーブルのキーと一致するトークンも後ろに伸ばしてTrigramにする'))
|
408
|
+
* (('tag:xx-small:「処理」を登録'))\n(('tag:xx-small:文書登録:「画像処理装置」 検索クエリ:「画像処理」'))
|
409
|
+
* (('tag:xx-small:文書登録:「画像/((*像処理*))/((*処理装*))/理装/装置/置」'))
|
410
|
+
* (('tag:xx-small:検索クエリ:「画像/像処理」'))
|
411
|
+
* (('tag:xx-small:「処理」じゃなく「像処理」で探索できる⇒((*高速化*))'))
|
412
|
+
|
413
|
+
= (('tag:small:TokenYaVgramBoth'))
|
414
|
+
|
415
|
+
* (('tag:x-small:((*例外*)):検索クエリの末尾では次のトークンがないため判断できない'))
|
416
|
+
* (('tag:x-small:全ての場合で検索クエリ末尾のトークンは強制的に前方一致検索させる'))(('note:せざるを得ない'))
|
417
|
+
* (('tag:x-small:前方一致が必要のないケースで前方一致をしたとしてもあまり影響はない'))\n(('note:vgram対象でないやつはもとより遅くないという想定'))
|
418
|
+
* (('tag:xx-small:「理装」を登録'))\n(('tag:xx-small:文書登録:「画像処理装置」 検索クエリ:「画像処理」'))
|
419
|
+
* (('tag:xx-small:文書登録:「画像/像処/((*処理装*))/((*理装置*))/装置/置」'))
|
420
|
+
* (('tag:xx-small:検索クエリ:「画像/ /処理*」'))
|
421
|
+
|
422
|
+
= (('tag:small:TokenYaVgramBotの速度'))
|
423
|
+
|
424
|
+
# RT
|
425
|
+
caption = Wikipedia(ja)で1000回検索
|
426
|
+
|
427
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:検索秒数平均'))
|
428
|
+
|
429
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:0.0444 sec'))
|
430
|
+
(('tag:x-small:TokenYaBigram')), (('tag:x-small:0.0325 sec'))
|
431
|
+
(('tag:x-small:TokenYaTrigram')), (('tag:x-small:0.0063 sec'))
|
432
|
+
(('tag:x-small:TokenYaVgram')), (('tag:x-small:0.0166 sec'))
|
433
|
+
(('tag:x-small:((*TokenYaVgramBoth*))')), (('tag:x-small:((*0.0065 sec*))'))
|
434
|
+
|
435
|
+
= (('tag:small:TokenYaVgramBothのキー'))
|
436
|
+
# RT
|
437
|
+
caption = Wikipedia(ja)
|
438
|
+
|
439
|
+
(('tag:x-small:トークナイザー')), (('tag:x-small:キーの数')), (('tag:x-small:キーサイズ'))
|
440
|
+
|
441
|
+
(('tag:x-small:TokenBigram')), (('tag:x-small:5767474')), (('tag:x-small:136.047MiB'))
|
442
|
+
(('tag:x-small:TokenTrigram')), (('tag:x-small:28691883')), (('tag:x-small:684.047MiB'))
|
443
|
+
(('tag:x-small:TokenYaVgram')), (('tag:x-small:7425198')), (('tag:x-small:172.047MiB'))
|
444
|
+
(('tag:x-small:((*TokenYaVgramBoth*))')), (('tag:x-small:((*8560779*))')), (('tag:x-small:((*200.047MiB*))'))
|
445
|
+
|
446
|
+
= (('tag:small:TokenYaVgramBothの効果'))
|
447
|
+
* (('tag:small:出現頻度が高いもののみTrigramにすることでキーサイズの増大を抑えつつ、検索速度の高速化を実現'))
|
448
|
+
* (('tag:small:TokenYaTrigram並の検索速度ながらもキーサイズをTokenTrigramの1/3以下に抑えられた'))
|
449
|
+
|
450
|
+
= (('tag:small:TokenYaVgramQuad'))
|
451
|
+
|
452
|
+
* (('tag:small:3文字にしてもまだ速度が満足いかなかったケースがあったのでつくってみた'))
|
453
|
+
* (('tag:small:管理テーブルに3文字のキーを登録しておくと、その対象のみを4文字トークンにする'))
|
454
|
+
* (('tag:small:現在はこのトークナイザーを適用中'))
|
455
|
+
|
456
|
+
= (('tag:small:既知フレーズのグループ化'))
|
457
|
+
* (('tag:x-small:あらかじめ既知のフレーズを管理テーブルに登録しておき、そのフレーズのみをグループ化してトークナイズ'))
|
458
|
+
* (('tag:x-small:パトリシアトライのLCPサーチを利用して高速にフレーズ抽出'))
|
459
|
+
* (('tag:x-small:「12月は寒い」で「12月」を登録'))
|
460
|
+
* (('tag:x-small:「12月/は寒/寒い」'))
|
461
|
+
|
462
|
+
= (('tag:small:既知フレーズのグループ化の効果'))
|
463
|
+
* (('tag:small:検索ノイズの低減'))
|
464
|
+
* (('tag:small:見出しタグや頻出語を含む複合語を登録することにより頻出トークン数低減'))
|
465
|
+
* (('tag:small:((*高速化*))'))
|
466
|
+
|
467
|
+
= (('tag:small:まとめ'))
|
468
|
+
* (('tag:x-small:検索速度を高速に保つのためにはポスティングリストが長くなりすぎないようにする'))
|
469
|
+
* (('tag:x-small:Ngram検索時はオーバラップさせなくても良い'))
|
470
|
+
* (('tag:x-small:Ngramといえどトークンの出現頻度は偏る'))
|
471
|
+
* (('tag:x-small:検索速度に影響のある頻出トークンのみを選択的に伸ばすVgramトークナイザーを作った'))
|
472
|
+
|
473
|
+
= (('tag:small:今後の課題'))
|
474
|
+
* (('tag:x-small:Vgramは検索クエリが3文字以上のときは高速化できるが2文字以下の場合の高速化にはならない'))\n(('note:前方一致検索しないといけないのでむしろ少し遅くなる'))
|
475
|
+
* (('tag:x-small:前処理でいらないフレーズ除去、一部フレーズ化やストップワードという対応方法もあるがどれも制約が発生'))
|
476
|
+
* (('tag:x-small:1文字、2文字があまり遅くならないように特化したインデックスを別につくり検索クエリに応じてそちらのインデックスを使うようにできないかと検討中'))
|
477
|
+
* (('tag:x-small:形態素解析をスコアリングに特化した形でVgramとハイブリッドで使えないか検討中'))
|
478
|
+
|
479
|
+
= TokenBigramとTokenYaVgramQuadの速度差デモ\n(時間があれば)
|
480
|
+
|