Levenshtein Automata

2,763 views
2,610 views

Published on

An introduction of Levenshtein Automata to implement fuzzy search with common RDBMSs.

The original of blog entry is here;
http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,763
On SlideShare
0
From Embeds
0
Number of Embeds
1,138
Actions
Shares
0
Downloads
4
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Levenshtein Automata

  1. 1. オートマトン初歩の初歩 2012.7.19 hiratara
  2. 2. オートマトンとは普通は有限オートマトンのこと DFA(Deterministic Finite Automaton) NFA(Nondeterministic Finite Automaton)プッシュダウン・オートマトン、生け垣オートマトンなど
  3. 3. DFA文字の列を入力にとる入力した列を受理するか否か判定する有限個の状態を持ち、入力された文字に応じて順次遷移する
  4. 4. DFA 0 0 1A B C 1 10001, 101, 10110 → 受理000, 010, 10000 → 受理しない
  5. 5. DFAの構成要素状態 (A, B, C)アルファベット (0, 1)遷移関数 ( (A, 0) → A, (A, 1) → B, ...)開始状態 (A)受理状態 (B, C)
  6. 6. NFADFAの拡張遷移先が1つではなく複数空文字(ε)による遷移を許す
  7. 7. NFA ε 0A B C 1 110, 1010, 111010 → 受理01, 1111, 10100 → 受理しない
  8. 8. NFAの構成要素状態 (A, B, C)アルファベット (0, 1)遷移関数 ( (A, 0) → Φ, (A, 1) → (A, B), (A, ε)→ Φ, ...)開始状態 (A)
  9. 9. DFAとNFAの特徴DFAは単純でシミュレーションしやすいNFAは表現力が高く人間が作りやすいDFAとNFAは等価である
  10. 10. DFAとNFAの特徴DFAは単純でシミュレーションしやすいNFAは表現力が高く人間が作りやすいDFAとNFAは等価である
  11. 11. NFAをDFAに変換する 1 1 0 A A, B A,C 1 0 0状態集合のベキ集合を とるとよい 0, 1
  12. 12. 正規表現アルファベット (ε, 0, 1)選択 ( 0|1 )結合 ( 01 )繰り返し (1*)
  13. 13. ふつうの正規表現ほとんどは先ほどの演算で書ける [01] → 0|1 0? → 0| 1+ → 11* . → [01]書けないもの → 後方参照 (.+)(1)
  14. 14. 正規表現の特徴人間にわかりやすい記述で言語を指定できる(言語 = 文字列の集合)NFA、DFAと等価
  15. 15. 正規表現の特徴人間にわかりやすい記述で言語を指定できる(言語 = 文字列の集合)NFA、DFAと等価
  16. 16. 正規表現をNFAに0 0 0|1 0 ε ε1 1 1
  17. 17. 正規表現をNFAに01 0 ε 1 ε0* ε 0
  18. 18. 正規表現をNFAに ε(01|0)* 0 ε 1 ε ε ε 0 ε
  19. 19. DFAを正規表現にGNFA(Generalized Nondeterministic FiniteAutomaton) を経由する 遷移を正規表現で書いたもの
  20. 20. DFAを正規表現へ 0 0 1 1 10
  21. 21. DFAを正規表現へ 開始状態と受理状態を加える 0 0ε 1 1 ε ε 1 0
  22. 22. DFAを正規表現へ 同じ状態間の遷移をまとめる 0|1 0ε 1 1 ε ε 0
  23. 23. DFAを正規表現へ 00*1 0|1 0*1 1 ε ε状態を減らしていく
  24. 24. DFAを正規表現へ 0|1 0*1(00*1)* 1 ε0*1(00*1)*
  25. 25. DFAを正規表現へ0*1(00*1)*| 0*1(00*1)* 1(0|1)*
  26. 26. ここまでのまとめDFAとNFAと正規表現は等価DFAは実装が容易でパフォーマンスも良いNFAや正規表現は表現力があり人間に優しい
  27. 27. DFAの限界正規 (DFA)文脈自由 (バッカス・ナウア記法)判定可能 (チューリングマシンが停止する)認識可能 (ループしてもよい)
  28. 28. 応用1: 逆FizzBuzz問題: FizzBuzz の逆写像を作りなさい例えば、{‘fizz’, ‘buzz’, ‘fizz’} が入力されたら、 {3, 4, 5, 6} を返す
  29. 29. NFAで表現できる buzz fizz 3 5 6 fizz buzz fizz fizzfizz fizz buzz fizzbuzz fizz 9 fizzbuzz fizz buzz 15 12 10
  30. 30. 応用1: 逆FizzBuzz受理される経路で、もっとも距離が小さい物を求めれば良いただし、DFAに変換すると距離情報が捨てられるのでNG
  31. 31. 応用2: 曖昧検索の高速化 問: 単語辞書の中から、ユーザが入力した文字 列に近い文字列を選び出す 力づくで計算する場合は、全単語について編 集距離を求めて最小値をとる
  32. 32. 応用2: 曖昧検索の高速化 例: 辞書が「Python、Perl、PHP」で入力が Phone だった場合 Phone → Pyhone → Pythone → Python Phone → Peone → Perne → Perle → Perl Phone → Phpne → Phpn → Php Perlだけ編集距離が4、後は3
  33. 33. 応用2: 曖昧検索の高速化【辞書】 ユーザの入力 “photo”basiccc++javahaskellperlphppythonruby
  34. 34. 応用2: 曖昧検索の高速化【辞書】 ユーザの入力 “photo”basiccc++javahaskell photoと編集距離がn以下の単語perlphp を受理するオートマトンを作るpythonruby
  35. 35. 応用2: 曖昧検索の高速化【辞書】 ユーザの入力 “photo”cc++ basicjavahaskellperlphp 辞書の最初の単語をpython オートマトンに入力するruby
  36. 36. 応用2: 曖昧検索の高速化【辞書】 ユーザの入力 “photo”cc++ basic bhotojavahaskellperlphp バックトラックにより次に受理python されるはずの単語を求めるruby
  37. 37. 応用2: 曖昧検索の高速化【辞書】 ユーザの入力 “photo”basicc++ cjavahaskellperlphp “bhoto”より大きい次の候補をpython 辞書から取り出し、続けるruby
  38. 38. Levenshtein Automata c m s . ε, . . ε, . . ε, . c m s . ε, . . ε, . . ε, . c m s
  39. 39. NFAをDFAにする s m m[^c] c c 複雑なので略
  40. 40. 受理される単語を探す例: “ocn”の次に受理される単語 s m m [^c] c c 複雑なので略
  41. 41. 受理される単語を探す “oc”の後、nは駄目。 o,p,q,r,...も駄目 s m m [^c] c c 複雑なので略
  42. 42. 受理される単語を探す バックトラックする s m m [^c] c c 複雑なので略
  43. 43. 受理される単語を探す “oc”が駄目だったので、 “od”, “oe”, “of” ... s m m [^c] c c 複雑なので略
  44. 44. 受理される単語を探す “om” であればOK s m m [^c] c c 複雑なので略
  45. 45. 受理される単語を探す “oms” は受理される s m m [^c] c c 複雑なので略
  46. 46. 受理される単語を探す“ocn”から”oms”までの単語は受理されない→つまり編集距離が遠い→編集距離を求めず、飛ばしてよい
  47. 47. まとめオートマトンは様々な理論の基礎知っておけば読める情報が増えるDFAへ変換することで、ロジックの見直しやパフォーマンスの改善に繋がる

×