文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す...

32
文字列探索

Upload: others

Post on 28-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

文字列探索

Page 2: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

文字列探索

• データベース(構造化データ) キーを指定→そのキーを持つレコード検索

• テキスト(非構造データ) 検索したい文字の並び(string):パターン 探査される文字列を含む情報:テキスト →腕ずくの方法 KMP(Knuth-Morris-Pratt)法 BM(Boyer-Moore)法

Page 3: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

腕ずくの方法

a c

a c

a c

a b a c d

a b a c d

Patten

Text

Pattern

Text

Pattern

Text

照合失敗

照合失敗

照合成功

a b a c d

Page 4: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

腕ずくの方法

①パターンをテキストの先頭に合わせる

②パターンとテキストを照合 一致→探索の成功 不一致→パターンを1文字ずらす,②へ

③上記手順を繰り返し,パターンがテキスト 末尾に来れば不一致と判断→探索の失敗

Page 5: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

文字列照合の例

text: M abcabababccbacabcabb ->t[0-19] N ababc pattern: ababc -> p[0-4] oox ababc x ababc x ababc oooox ababc x ababc ooooo -> t[5] 照合に成功したらtext先頭位置を返す

Page 6: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

start

i=0

j=0

j=j+1 i=i+1

text[i+j]:pattern[j]

return=-1

returnを返す

return=i

腕ずくの文字列照合フローチャート

textからpatternを探索する

text, pattern は文字型配列

M:textの文字列長

N :patternの文字列長

出力(戻り値)はpatternが

含まれる場合→textの先頭位置,

含まれない場合→-1 を返す

(文字列型配列要素添え字)

i:比較しているtext文字型配列要素添え字

j:比較しているpattern文字型配列要素添え字

M

N

=

=/

>=

<

>

<=

探索終了条件

照合成功時は

textとpatternを同時に

右へ1シフト

照合失敗時は

textのみを右へ1シフト

patternはリセットして先頭へ戻す

patternの文字列を

すべて調べたか?

j:N i:M-N

M abcabababccbacabcabb N ababc

Page 7: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

腕ずくの方法の計算量

テキスト:aaaa….aaa (100文字) パターン:aaaaab(6文字) ①の回数(先頭文字に合わせる回数)? ②の回数(照合回数)? よって,文字比較回数は? テキスト1000文字,10000文字の場合は? よってオーダーは? 単純ソートと比較すると?

100-6+1=95

6

6x95=570

Page 8: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

腕ずくの方法の計算量

• テキスト:n文字,パターンm文字

• 最大計算量 テキスト:aaaaaaaaaaaaaaaaaaaaaaaaab パターン:aaaab ①の回数(先頭文字に合わせる回数):(n-m+1)

②の回数(照合回数):m

よって,文字比較回数は m(n-m+1)

テキスト長n>>パターン長mなので,

n-m+1 nearly= n

O(mn) nearly = O(n)

Page 9: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

KMP(クヌース,モーリス,プラット)法

• 腕ずくの方法 →照合失敗時に毎回右へ1シフト →失敗状況に合わせてジャンプできる筈

• 失敗関数の導入 パターンu-1番目の文字まで一致, u番目の文字で不一致が発生した時の

移動量(パターンを何文字右へ移動すべきか)を調べて表にしておく

Page 10: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

KMP法, 失敗関数の作成

パターン:tartar, テキスト:????? 4文字目で失敗 tartar, tarb????

tartar

→パターンを4文字分ずらして,パターンの1文字目から比較

5文字目で失敗 tartar, tart?????

→パターンを5文字分ずらして,パターンの1文字目から比較

6文字目で失敗 tartar, tarta???

→パターンを6文字分ずらして,パターンの1文字目から比較

Page 11: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

KMP法の適用例

text: abcabababccbacabcabb ->t[0-19]

pattern: ababc -> p[0-4]

上記をKMP法により照合せよ.

※KMP法は,文字列前半が一致,後半が不一致の場合に効果が現れるが,実際は,不一致が多く発生しており効果が小さく,腕ずくの方法より遅いこともあり,実際にはあまり利用されていない.

Page 12: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

BM (Boyer-Moore)法

テキスト文字列の最後から照合し不一致文字に注目

→一致ではなく,不一致の状況に合わせて, ずらす量を決める

(ケース1:dはパターンにないので3ずらす)

パターン: abc abc

テキスト: abdefgh abdefgh

(ケース2:aはパターン1文字目にあるので2ずらす)

パターン: abc abc

テキスト: abaabcd abaabcd

Page 13: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

BM法(2)

(ケース3:zはパターンにないので5ずらすと駄目.注目点zを5ずらしてそこを最終文字列とする(3ずらす))

パターン: abcab abcab

テキスト: xyzabcabcde xyzabcabcde

(ケース4:aは2回目出現のパターン4文字目にあるので1ずらす)

パターン: abcab abcab

テキスト: aabcabcabc aabcabcabc

Page 14: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

BM法の改良

テキスト:xabcxabcx…

xoo

パターン:xbacx

bはパターンに含まれるので最右のbまで1文字

ずらす.でも末尾cxで終わらないから,cxのある

箇所まで3文字ずらす.

Page 15: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

例題(1) TOKKYOKYOKAKYOKU (テキスト)

KYOKU (パターン) (Yはパターンに含まれているので、そこまで3文字ずらす。)

TOKKYOKYOKAKYOKU

KYOKU (Yはパターンに含まれているので、そこまで3文字ずらす。)

TOKKYOKYOKAKYOKU

KYOKU

(Aはパターンに含まれていないので、そこを超えて5文字ずらす。)

TOKKYOKYOKAKYOKU

KYOKU (照合成功)

Page 16: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

例題(2)

TOKKYOKYOKAKYOKU (テキスト) KYOKU (パターン) ※移動量(パターンの末尾文字の照合時) K 1 Y 3 O 2 U 0 Others 5 上記の表は不完全。末尾でなければ補正必要 ※末尾から2文字目で不一致が検出されれば (移動量ー1)が移動量となる。

Page 17: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

検索エンジン 索引ファイル

Page 18: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

・・・

・・・ ・・・

・・・

ウェブ検索には、マッチングとランキングの2段階がある。第1(マッチング)段階終了後は、 マッチした数干~数百万ものページが残される。第2(ランキング)段階では、これらが関連性 の高さ順にソートされる。

検索要求発行

ロンドン バス 時刻表 マッチング ランキング

マッチしたページ ランク付け されたページ

マッチング→ランキング

Page 19: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

1 2 3 the cat sat on the mat

the dog stood on the mat

the cat stood while a dog sat

1,2,3のWebページから成るWWW

a 3 cat 1 3 dog 2 3 mat 1 2 on 1 2 sat 1 3 stood 2 3 the 1 2 3 while 3

Webページ番号だけから成る索引(インデックス)ファイル

フレーズ検索“cat sat“を実現できるか?

Page 20: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

2 3 the cat sat on the mat

the dog stood on the mat

the cat stood while a dog sat

a 3-5 (ページ番号3の5番目) cat 1-2 3-2 dog 2-2 3-6 mat 1-6 2-6 on 1-4 2-4 sat 1-3 3-7 stood 2-3 3-3 the 1-1 1-5 2-1 2-5 3-1 while 3-4

1 2 1 3 4

6 5

2 1 3

4 6 5

2 1 3

4 6 5 7

Webページ番号+単語位置情報から成る 索引(インデックス)ファイル

(ページ番号-位置情報)

Page 21: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

By far the most common cause of malaria is being bitten by an infected mosquito, but there are also other ways to contract the disease.

Our cause was not helped by the poor health of the troops, many of whom were suffering from malaria and other tropical diseases.

2 1

also 1-19 ・・・ cause 1-6 2-2 ・・・ malaria 1-8 2-19 ・・・ whom 2-15

マラリアを引き起こす原因について説明しているページはどっち? →コンピュータに判断させる方法は? →文章の意味を理解させる人工知能を作る →もっと簡単は方法は? →索引ファイルだけを使う方法がある(精度は落ちるかもしれない)

マラリアに関連するWebページ

Page 22: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

1 2 3

the cat sat on the mat

the dog stood on the mat

the cat stood while a dog sat

my cat my dog my pets

タイトルと本文を持つWebページ

2 3

<body> the cat sat on the mat </body>

<body> the dog stood on the mat </body>

the cat stood while a dog sat </body>

<title> my cat </title>

1 <title> my dog </title>

<title> my pets </title> <body>

ブラウザー表示

HTMLライクな表示:<>メタワード,タグ

Page 23: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

a cat dog mat my on pets sat stood the while </body> <body> </title> <title>

3-10 1-3 1-7 3-7 2-3 2-7 3-11 1-11 2-11 1-2 2-2 3-2 1-9 2-9 3-3 1-8 3-12 2-8 3-8 1-6 1-10 2-6 2-10 3-6 3-9 1-12 2-12 3-13 1-5 2-5 3-5 1-4 2-4 3-4 1-1 2-1 3-1

dog: 2-3 2-7 3-11 <title>: 1-1 2-1 3-1 </title>: 1-4 2-4 3-4

<title End>

<title End>

<title End>

タグと文字を含んだインデックスファイル タイトルにdogを含むページを検索したい

Page 24: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

Webページランキング (Googleの基本的アイデア)

Page 25: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

アーニーのスクランブル エッグレシピ

ボウルで4個の卵と 塩胡椒少々を混ぜる・・・

バートのスクランブル エッグレシピ

まず大さじ1杯のバターを 溶かす・・・

アーニーのレシピ はよい

バートのレシピは とてもいい

私はバートのレシピが本当に気に入った

バートのレシピは すばらしい

パートのページを参照しているリンクが3つ アーニーのページを参照しているリンクが1つ →バートのページ評価>アーニーのページ評価

ハイパーリンク トリック

Page 26: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

アーニーのスクランブル エッグレシピ

ボウルで4個の卵と 塩胡椒少々を混ぜる・・・

バートのスクランブル エッグレシピ

まず大さじ1杯のバターを 溶かす・・・

ジョン・マコーミックの ホームページ

私は一度アーニーのレシピ を試してみたが、決して悪い ものではなかった。

アリス・ウォーターズの ホームページ

バートのレシピは、間違いなく 最良のレシピの1つだ。

ジョン・マコーミック:コンピュータ科学者 アリス・ウォーターズ:有名なシェフ →バートのページ評価>アーニーのページ評価 でも,コンピュータはどちらが権威をもつページなのか分からない

オーソリティ トリック

Page 27: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

アーニーのスクランブル エッグレシピ

ボウルで4個の卵と 塩胡椒少々を混ぜる・・・

バートのスクランブル エッグレシピ

まず大さじ1杯のバターを 溶かす・・・

ジョン・マコーミックの ホームページ

私は一度アーニーのレシピ を試してみたが、決して悪い ものではなかった。

アリス・ウォーターズの ホームページ

バートのレシピは、間違いなく 最良のレシピの1つだ。

2

2

100

100

1 1 1 1

1 1

1 1

1 1

・・・100pages・・・

オーソリティトリックの近似計算

Page 28: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

A B

C D E

ハイパーリンクの循環参照の例.A、B、Eページは、Aからスタートして、B、続いてEに移動し, 最後に出発点であるAに戻ってこれてしまうので循環参照を形成している。

A 2 2

B

1 C

1 D

2 E

A 4 4

B

1 C

1 D

4 E

循環参照によって起きる問題。 A、B、Eのスコアはいつも修正が必要になり、無限に大きくなっていってしまう。

循環参照問題

Page 29: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

濃い色:サーファーが訪れたページ 破線の矢印:ランダムな再スタート サーファーは、Aからスタートし、2回のランダムな再スタートをはさんで, ランダムにハイパーリンクを選択している。

B

A

C

D

ランダムサーファーモデル

Page 30: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

A

B

C

D 118 126 144 101

109

55 55

74

32

58

16

46

15

21

17

13

A

B

C

D 13% 14% 10%

10%

4%

7% 5%

2%

4%

2%

4% 4%

2%

2%

2%

15%

1000回 (訪問回数)

100万回 (訪問割合)

ランダムサーファーモデルの シミュレーション

Page 31: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

アーニーのスクランブル エッグレシピ

バートのスクランブル エッグレシピ

1%

ジョン・マコーミックの ホームページ

アリス・ウォーターズの ホームページ

0.4%

・・・100pages・・・

28%

1% 32%

0.4% 0.4% 0.4%

0.4% 0.4%

0.4% 0.4%

0.4% 0.4%

サーファーオーソリティ(1)

Page 32: 文字列探索«–...2012/11/28  · 含まれない場合→-1 を返す (文字列型配列要素添え字) i:比較しているtext文字型配列要素添え字 j:比較しているpattern文字型配列要素添え字

A 33% 31%

B

3% 30% 3%

C D E

サーファーオーソリティ(2)