SlideShare a Scribd company logo
1 of 18
Download to read offline
FM-Indexによる全文検索
計算機実習E 自由課題
• 文書から文字列を検索する方法は2通りに分類できる
A. 前処理が不要な方法 (力任せな方法, KMP法, BM法)
B. 前処理が必要な方法 (転置インデックス, 接尾辞配列)
• Bは前処理の時間が必要なかわりに,

同じ文書から何回も検索する場合はAよりも高速
• FM-IndexはBに分類される方法で,

文書の長さに依存しない時間で検索できる
前処理1:接尾辞配列の構築
文書
mississippi
mississippi$
エンドマーカ$を追加
mississippi$
ississippi$
ssissippi$
sissippi$
issippi$
ssippi$
sippi$
ippi$
ppi$
pi$
i$
$
接尾辞の列挙
前処理1:接尾辞配列の構築
0 mississippi$
1 ississippi$
2 ssissippi$
3 sissippi$
4 issippi$
5 ssippi$
6 sippi$
7 ippi$
8 ppi$
9 pi$
10 i$
11 $
11 $
10 i$
7 ippi$
4 issippi$
1 ississippi$
0 mississippi$
9 pi$
8 ppi$
6 sippi$
3 sissippi$
5 ssippi$
2 ssissippi$
辞書順でソートする
※$は任意のアルファベットよりも

順位が小さいとする
接尾辞配列SA
前処理2:BWT

(Burrows-Wheeler Transform)
11 $
10 i$
7 ippi$
4 issippi$
1 ississippi$
0 mississippi$
9 pi$
8 ppi$
6 sippi$
3 sissippi$
5 ssippi$
2 ssissippi$
元の文字列における

ひとつ前の文字にする
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T
検索処理
• BWT文字列T = ipssm$pissii について,

次の関数を定義する
• Rank(c,p) : T[0,p)の範囲で,

アルファベットcの出現数を返す
• RankLT(c) : T全体で, cよりも順位が小さい

アルファベットの出現数を返す
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
'i'+"ppi$"の

接尾辞配列上での

出現位置は?
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
'i'+"ppi$"の

接尾辞配列上での

出現位置は?
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
'i'+"ppi$"の

接尾辞配列上での

出現位置は?
LF-mapping
c=T[p] に続く文字列の

SA上での出現位置は

RankLT(c)+Rank(c,p)
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
"ssi"の検索
[RankLT('i')+Rank('i', 0),

RankLT('i')+Rank('i', 12))
'i'で始まる

文字列
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
"ssi"の検索
[RankLT('s')+Rank('s', 1),

RankLT('s')+Rank('s', 5))
's'+"i"で始まる

文字列
検索処理
$
i$
ippi$
issippi$
ississippi$
mississippi$
pi$
ppi$
sippi$
sissippi$
ssippi$
ssissippi$
i
p
s
s
m
$
p
i
s
s
i
i
BWT文字列T 接尾辞配列SA
"ssi"の検索
[RankLT('s')+Rank('s', 8),

RankLT('s')+Rank('s', 10))
's'+"si"で始まる

文字列
検索処理
• FM-indexは, 検索文字列に対応する位置の絞り込みを

LF-mappingの繰り返しによって行う
• LF-mappingは Rank と RankLT で行える
• この2つの処理は, ウェーブレット木やウェーブレット行列を使えば

O(log σ) 時間で可能 (σ はアルファベットの種類数)
• LF-mappingを検索文字列Qの長さ分だけ繰り返すので,

一回の検索がO(m log σ) 時間で可能 (m は Q の文字数)
• 検索時間が文書の長さに依存しない
制作物
• 青空文庫で人気がある図書500冊を対象とした

ウェブブラウザから使えるインクリメンタル検索を制作
• 接尾辞配列の構築はsais.hxx (高速なライブラリ) を使用
• ウェーブレット行列とFM-Indexは自分で実装 (C++),

boost-pythonによりPython用の拡張モジュールに変換
• Flask (Web App Framework@Python) から呼び出す
うまくいかなかったところ
• あいまい検索を実装しようとして文献を探してみた

→ 編集距離に対して指数時間かかるらしい…
• 作成した索引をファイルから読み込む処理で,

既存のライブラリを使ったら使用メモリの量が爆発

(原因不明)
まとめ
• 高速な文字列検索のアルゴリズムを実装してみた
• ブラウザから使えるようにしてみた
!
• 参考文献
• 岡野原 大輔. 高速文字列解析の世界. 岩波書店. 2012.
(補足) ウェーブレット木
3101212213
1000101101
10111 32223
10111 10001
下位2ビット目 →
下位1ビット目 →
0 1111 222 33
0 1
0 1 0 1

More Related Content

What's hot

20170112 srws第六回メタ・アナリシス
20170112 srws第六回メタ・アナリシス20170112 srws第六回メタ・アナリシス
20170112 srws第六回メタ・アナリシスSR WS
 
居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おうHiroshi Nakagawa
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係Nagi Teramo
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Yusuke Fujimoto
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
負の二項分布について
負の二項分布について負の二項分布について
負の二項分布についてHiroshi Shimizu
 
機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計Takahiro Kubo
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)Ayako_Hasegawa
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!Hirotaka Sato
 
MN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFMN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFPreferred Networks
 
RandomForestとR package
RandomForestとR packageRandomForestとR package
RandomForestとR packageShuma Ishigami
 
2015年度GPGPU実践プログラミング 第7回 総和計算
2015年度GPGPU実践プログラミング 第7回 総和計算2015年度GPGPU実践プログラミング 第7回 総和計算
2015年度GPGPU実践プログラミング 第7回 総和計算智啓 出川
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話Ryota Kamoshida
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道uchan_nos
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~Hideki Tsunashima
 

What's hot (20)

Rの高速化
Rの高速化Rの高速化
Rの高速化
 
20170112 srws第六回メタ・アナリシス
20170112 srws第六回メタ・アナリシス20170112 srws第六回メタ・アナリシス
20170112 srws第六回メタ・アナリシス
 
居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
負の二項分布について
負の二項分布について負の二項分布について
負の二項分布について
 
機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!
 
MN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFMN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOF
 
RandomForestとR package
RandomForestとR packageRandomForestとR package
RandomForestとR package
 
論文の書き方入門 2017
論文の書き方入門 2017論文の書き方入門 2017
論文の書き方入門 2017
 
2015年度GPGPU実践プログラミング 第7回 総和計算
2015年度GPGPU実践プログラミング 第7回 総和計算2015年度GPGPU実践プログラミング 第7回 総和計算
2015年度GPGPU実践プログラミング 第7回 総和計算
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~
 

More from Sho IIZUKA

HDDの返品保証を使ってみた
HDDの返品保証を使ってみたHDDの返品保証を使ってみた
HDDの返品保証を使ってみたSho IIZUKA
 
円と円の外接線の求め方
円と円の外接線の求め方円と円の外接線の求め方
円と円の外接線の求め方Sho IIZUKA
 
円と円の交点の求め方
円と円の交点の求め方円と円の交点の求め方
円と円の交点の求め方Sho IIZUKA
 
勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinker勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinkerSho IIZUKA
 
grepについて
grepについてgrepについて
grepについてSho IIZUKA
 

More from Sho IIZUKA (6)

HDDの返品保証を使ってみた
HDDの返品保証を使ってみたHDDの返品保証を使ってみた
HDDの返品保証を使ってみた
 
円と円の外接線の求め方
円と円の外接線の求め方円と円の外接線の求め方
円と円の外接線の求め方
 
円と円の交点の求め方
円と円の交点の求め方円と円の交点の求め方
円と円の交点の求め方
 
About Pointer
About PointerAbout Pointer
About Pointer
 
勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinker勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinker
 
grepについて
grepについてgrepについて
grepについて
 

FM-indexによる全文検索