検索エンジンのための転置インデックス作成 #hadoopreading
TRANSCRIPT
検索エンジンのための転置インデックス構築
#hadoopreading
@nokuno
Data-Intensive Text Processing with MapReduce第4章
Twitter: @nokuno
はてな:id:nokuno
自然言語処理 / 機械学習 / 並列分散処理に興味
TokyoNLP主催 第4回は1/22(土)
自己紹介 2
2002~2006:ゲームプログラミングに没頭2007~2008:未踏でSocial IMEを開発2009~現在:Web系エンジニア(←今ここ)
Data-Intensive Text Processing with MapReduce
大規模テキスト処理の教科書
Hadoopに限らずMapReduceの使い方を紹介
PDF:http://www.umiacs.umd.edu/~jimmylin/book.html
前回の3章に続いて4章を紹介します
MapReduceで転置インデックスを構築する話
圧縮とかMR関係ない話も
教科書 3
Jimmy Lin (@lintool)
テキストの収集
Web検索の場合はクローラ
転置インデックス構築
MapReduce向きのバッチ処理
圧縮方法いろいろ
検索クエリ処理
ユーザの入力をオンラインで検索
検索エンジンのうち転置インデックス構築を扱う
概要 4
クロール先に過大な負荷をかけてはいけない
クロール先の優先順位を決めなければならない
分散クロールにおいて重複を避ける必要がある
複製されたページに対処しなければならない
多言語に対応しなければならない
スパムに対処しなければならない
Webクローラには非常に複雑な処理が必要
Webクローラ 5
検索エンジンの構造 6
DocumentsQuery
Hits
RepresentationFunction
RepresentationFunction
Query Representation Document Representation
ComparisonFunction Index
offlineonline
単語から文書IDと頻度を検索可能にしたもの
転置インデックスとは 7
転置インデックス構築 8
Documents
InvertedIndex
Bag of
Words
形態素解析(単語分割+活用形処理)ストップワード削除
文法 意味 知識ベース
擬似コード:最初の実装9
擬似コード:最初の実装10
動作例
Postingリストをメモリ内に保持する必要がある
Postingリストを自前でソートする必要がある
スケーラビリティに重大なボトルネックがある
何が問題か
フレームワーク側にソートを任せることができる
valueをkeyに含めてMapReduce
value-to-key conversionパターン
1fish 2
9 1
21 3
(values)(key)
34 1
35 2
80 3
1fish
9
21
(values)(keys)
34
35
80
fish
fish
fish
fish
fish
2
1
3
1
2
3
擬似コード:value-to-key conversionパターン
パラメータなし
ユナリィ符号
ガンマ符号
デルタ符号
パラメータあり
ライス符号
大規模な転置インデックスは圧縮する必要がある
インデックスの圧縮 15
文書IDの差分を取れば値は小さくなる
差分符号化 16
1fish 2 9 1 21 3 34 1 35 2 80 3 …
1fish 2 8 1 12 3 13 1 1 2 45 3 …
実現したいこと:
実装上:
•文書IDそのものではなく、差分を保持する• このままでは何の圧縮にもなっていないが・・・
ユナリィ符号
x ( 1) を x-1 個の1と1つの0ビットで表す
3 = 110
4 = 1110
小さい数には有効だが…
他の符号化の部品として使われる
アイデア:x を 指数部とオフセットの2つに分ける 指数部:ユナリィ符号で符号化
オフセット:2進数で符号化
例: 9 をガンマ符号で圧縮 9は2進数で1001
オフセット=001
指数部=4 、ユナリィ符号:1110
ガンマ符号 = 1110:001
ガンマ符号
x = 2n-1 + r
xn 2log1 xxr 2log
2
ガンマ符号に似ているが、指数部も再帰的にガンマ符号で符号化する
例: 9をデルタ符号で圧縮
9は2進数で1001
オフセット = 001
指数部 = 4, ガンマ符号で11000
デルタ符号 = 11000:001
ガンマ符号:小さい値に対して有効
デルタ符号:大きい値に対して有効
デルタ符号
アイデア:可変長符号+固定長符号
q = ( x - 1 ) / bとする(bは2の指数)
q + 1 をユナリィ符号化(可変長)
r = x - qb - 1をバイナリ符号化(固定長)
rは常にlog bビット
例:
x = 9 = 1001(binary) , b=4 のとき
q = 2 = 110(unary)
r = 0 = 00(binary)
出力: 110:00
拡張:2のべき乗以外のbも許す(ゴロム符号)
ライス符号
符号化方式のまとめ 21
1 0 0 0 0:0 0:00
2 10 10:0 100:0 0:10 0:01
3 110 10:1 100:1 0:11 0:100
4 1110 110:00 101:00 10:0 0:101
5 11110 110:01 101:01 10:10 0:110
6 111110 110:10 101:10 10:11 0:111
7 1111110 110:11 101:11 110:0 10:00
8 11111110 1110:000 11000:000 110:10 10:01
9 111111110 1110:001 11000:001 110:11 10:100
10 1111111110 1110:010 11000:010 1110:0 10:101
Unary Golomb
b=3 b=6
インデックス圧縮のパフォーマンス
Witten, Moffat, Bell, Managing Gigabytes (1999)
Unary 262 1918
Binary 15 20
6.51 6.63
6.23 6.38
Golomb 6.09 5.84
Bible TREC
Bible: King James version of the Bible; 31,101 verses (4.3 MB)
TREC: TREC disks 1+2; 741,856 docs (2070 MB)
Comparison of Index Size (bits per
pointer)
転置インデックス検索(ブーリアン) 23
one fish, two fishDoc 1
red fish, blue fishDoc 2
cat in the hatDoc 3
1
1
1
1
1
1
1 2 3
1
1
1
4
blue
cat
egg
fish
green
ham
hat
one
3
4
1
4
4
3
2
1
blue
cat
egg
fish
green
ham
hat
one
2
green eggs and hamDoc 4
1red
1two
2red
1two
転置インデックス検索(スコア付き) 24
one fish, two fishDoc 1
red fish, blue fishDoc 2
cat in the hatDoc 3
green eggs and hamDoc 4
2
1
2
1
1
1
1 2 3
1
1
1
4
1
1
1
1
1
1
2
1
tf
df
blue
cat
egg
fish
green
ham
hat
one
3,1
4,1
1,2
4,1
4,1
3,1
2,1
1,1
1
1
1
1
1
1
2
1
blue
cat
egg
fish
green
ham
hat
one
2,2
1 1red
1 1two
2,11red
1,11two
転置インデックス検索(位置付き) 25
one fish, two fishDoc 1
red fish, blue fishDoc 2
cat in the hatDoc 3
green eggs and hamDoc 4
3,1,[1]
4,1,[2]
1,2,[2,4]
4,1,[3]
4,1,[1]
3,1,[2]
2,1,[3]
1,1,[1]
1
1
1
1
1
1
2
1
blue
cat
egg
fish
green
ham
hat
one
2,1,[1]1red
1,1,[3]1two
1,2,[2,4]
3,1
4,1
1,2
4,1
4,1
3,1
2,1
1,1
1
1
1
1
1
1
2
1
blue
cat
egg
fish
green
ham
hat
one
2,2
2,11red
1,11two
分散検索における2つの方式
…
T
D
T1
T2
T3
D
T…
D1 D2 D3
単語で分割
文書で分割
Webクローラは難しい
転置インデックス構築
MapReduce向きのバッチ処理
Value-to-conversionパターンが有効
ガンマ符号、デルタ符号、ライス符号、ゴロム符号…
検索クエリ処理
文書または単語で分散
転置インデックス構築はMapReduce向きのバッチ処理
まとめ 27
ご清聴ありがとうございました
28
Presentation by
x ( 1), パラメータ b:
q + 1 をユナリィ符号化, ただし q = ( x - 1 ) / b
r = x - qb - 1を2進数表現で符号化 log bまたは log bビット
例:
b = 3, r = 0, 1, 2 (0, 10, 11)
b = 6, r = 0, 1, 2, 3, 4, 5 (00, 01, 100, 101, 110, 111)
x = 9, b = 3: q = 2, r = 2, code = 110:11
x = 9, b = 6: q = 1, r = 2, code = 10:100
ゴロム符号