29
検索エンジンのための転置インデックス構築 #hadoopreading @nokuno Data-Intensive Text Processing with MapReduce 4

検索エンジンのための転置インデックス作成 #hadoopreading

Embed Size (px)

Citation preview

Page 1: 検索エンジンのための転置インデックス作成 #hadoopreading

検索エンジンのための転置インデックス構築

#hadoopreading

@nokuno

Data-Intensive Text Processing with MapReduce第4章

Page 2: 検索エンジンのための転置インデックス作成 #hadoopreading

Twitter: @nokuno

はてな:id:nokuno

自然言語処理 / 機械学習 / 並列分散処理に興味

TokyoNLP主催 第4回は1/22(土)

自己紹介 2

2002~2006:ゲームプログラミングに没頭2007~2008:未踏でSocial IMEを開発2009~現在:Web系エンジニア(←今ここ)

Page 3: 検索エンジンのための転置インデックス作成 #hadoopreading

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)

Page 4: 検索エンジンのための転置インデックス作成 #hadoopreading

テキストの収集

Web検索の場合はクローラ

転置インデックス構築

MapReduce向きのバッチ処理

圧縮方法いろいろ

検索クエリ処理

ユーザの入力をオンラインで検索

検索エンジンのうち転置インデックス構築を扱う

概要 4

Page 5: 検索エンジンのための転置インデックス作成 #hadoopreading

クロール先に過大な負荷をかけてはいけない

クロール先の優先順位を決めなければならない

分散クロールにおいて重複を避ける必要がある

複製されたページに対処しなければならない

多言語に対応しなければならない

スパムに対処しなければならない

Webクローラには非常に複雑な処理が必要

Webクローラ 5

Page 6: 検索エンジンのための転置インデックス作成 #hadoopreading

検索エンジンの構造 6

DocumentsQuery

Hits

RepresentationFunction

RepresentationFunction

Query Representation Document Representation

ComparisonFunction Index

offlineonline

Page 7: 検索エンジンのための転置インデックス作成 #hadoopreading

単語から文書IDと頻度を検索可能にしたもの

転置インデックスとは 7

Page 8: 検索エンジンのための転置インデックス作成 #hadoopreading

転置インデックス構築 8

Documents

InvertedIndex

Bag of

Words

形態素解析(単語分割+活用形処理)ストップワード削除

文法 意味 知識ベース

Page 9: 検索エンジンのための転置インデックス作成 #hadoopreading

擬似コード:最初の実装9

Page 10: 検索エンジンのための転置インデックス作成 #hadoopreading

擬似コード:最初の実装10

Page 11: 検索エンジンのための転置インデックス作成 #hadoopreading

動作例

Page 12: 検索エンジンのための転置インデックス作成 #hadoopreading

Postingリストをメモリ内に保持する必要がある

Postingリストを自前でソートする必要がある

スケーラビリティに重大なボトルネックがある

何が問題か

Page 13: 検索エンジンのための転置インデックス作成 #hadoopreading

フレームワーク側にソートを任せることができる

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

Page 14: 検索エンジンのための転置インデックス作成 #hadoopreading

擬似コード:value-to-key conversionパターン

Page 15: 検索エンジンのための転置インデックス作成 #hadoopreading

パラメータなし

ユナリィ符号

ガンマ符号

デルタ符号

パラメータあり

ライス符号

大規模な転置インデックスは圧縮する必要がある

インデックスの圧縮 15

Page 16: 検索エンジンのための転置インデックス作成 #hadoopreading

文書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そのものではなく、差分を保持する• このままでは何の圧縮にもなっていないが・・・

Page 17: 検索エンジンのための転置インデックス作成 #hadoopreading

ユナリィ符号

x ( 1) を x-1 個の1と1つの0ビットで表す

3 = 110

4 = 1110

小さい数には有効だが…

他の符号化の部品として使われる

Page 18: 検索エンジンのための転置インデックス作成 #hadoopreading

アイデア:x を 指数部とオフセットの2つに分ける 指数部:ユナリィ符号で符号化

オフセット:2進数で符号化

例: 9 をガンマ符号で圧縮 9は2進数で1001

オフセット=001

指数部=4 、ユナリィ符号:1110

ガンマ符号 = 1110:001

ガンマ符号

x = 2n-1 + r

xn 2log1 xxr 2log

2

Page 19: 検索エンジンのための転置インデックス作成 #hadoopreading

ガンマ符号に似ているが、指数部も再帰的にガンマ符号で符号化する

例: 9をデルタ符号で圧縮

9は2進数で1001

オフセット = 001

指数部 = 4, ガンマ符号で11000

デルタ符号 = 11000:001

ガンマ符号:小さい値に対して有効

デルタ符号:大きい値に対して有効

デルタ符号

Page 20: 検索エンジンのための転置インデックス作成 #hadoopreading

アイデア:可変長符号+固定長符号

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も許す(ゴロム符号)

ライス符号

Page 21: 検索エンジンのための転置インデックス作成 #hadoopreading

符号化方式のまとめ 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

Page 22: 検索エンジンのための転置インデックス作成 #hadoopreading

インデックス圧縮のパフォーマンス

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)

Page 23: 検索エンジンのための転置インデックス作成 #hadoopreading

転置インデックス検索(ブーリアン) 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

Page 24: 検索エンジンのための転置インデックス作成 #hadoopreading

転置インデックス検索(スコア付き) 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

Page 25: 検索エンジンのための転置インデックス作成 #hadoopreading

転置インデックス検索(位置付き) 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

Page 26: 検索エンジンのための転置インデックス作成 #hadoopreading

分散検索における2つの方式

T

D

T1

T2

T3

D

T…

D1 D2 D3

単語で分割

文書で分割

Page 27: 検索エンジンのための転置インデックス作成 #hadoopreading

Webクローラは難しい

転置インデックス構築

MapReduce向きのバッチ処理

Value-to-conversionパターンが有効

ガンマ符号、デルタ符号、ライス符号、ゴロム符号…

検索クエリ処理

文書または単語で分散

転置インデックス構築はMapReduce向きのバッチ処理

まとめ 27

Page 28: 検索エンジンのための転置インデックス作成 #hadoopreading

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

28

Presentation by

Page 29: 検索エンジンのための転置インデックス作成 #hadoopreading

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

ゴロム符号