Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Big dictionary matching

Plus De Contenu Connexe

Big dictionary matching

  1. 1. Big Dictionary Matching R&Dチーム セーヨー・サンティ
  2. 2. 解きたい問題 数百万単語を搭載した辞書が与えられたとする 任意の文章の中に辞書に登録された単語をしっかり特定せよ みなさんならどうします?
  3. 3. 基本的なツール 正規表現 Trie Aho–Corasick Patricia Trie Directed acyclic word graph (DAWG) その他は割愛 (&知らない)
  4. 4. Trie K={"aaac#","aab#", "ab#", "abb#", "abba#"}
  5. 5. Aho-Corasick 文字列を1-Passでマッチング完了!速い!(データはTrieと失敗時のジャンプ先)
  6. 6. Patricia Trie
  7. 7. DAWG K = {“aaa”, “aba”,“bbc”, “cbc”, “cc”} Trieをさらに圧縮:Suffixも共有
  8. 8. 2015年の辞書体験談(Linked List/.NET) 中国語辞書:約350万語 正規表現 → 破たん Trie → 破たん Patricia Trie → 破たん Aho–Corasick → 破たん Directed acyclic word graph (DAWG) → やっとなんとか収まった
  9. 9. 分かったこと .NETのオバーヘッドが大きい DAWGはすごい さらに調べて分かったこと データの持ち方次第で速度・メモリ使用量が改善できる
  10. 10. Trie実装の系統 Linked List Table Tripple-Array Double-Array
  11. 11. Table Trie
  12. 12. Tripple-Array Trie check[base[s] + c] = s next[base[s] + c] = t
  13. 13. Aoe et. al 1989 Jun-ichi Aoe: “An Efficient Digital Search Algorithm by Using a Double-Array Structure” IEEE Transactions on Software Engineering archive Volume 15 Issue 9, September 1989 Page 1066-1077 check[base[s] + c] = s base[s] + c = t
  14. 14. Double Array Trie t = BASE[s] + CODE[c] CHECK[t] = s
  15. 15. 一般的には Data Structure Size: Trie,Aho-Corasick > (Patricia?) > DAWG Implementation Size: Table > Linked List > Double Array Speed: Table > Double Array > Linked List
  16. 16. 世界のMecab 一般的なCRF Tokenizer, Pos Taggingの10倍速(精度は90%前半) 圧倒的な速さの秘密の一つは辞書マッチングにある Double Array Trie を採用した
  17. 17. スピード・メモリのTrade offで Double Array TrieのJava版のオープンソースを利用 でも、せめて、Double Array DAWGが欲しいなあ 理想的には できればTable DAWG
  18. 18. Aoe et. al 1989 Jun-ichi Aoe: “An Efficient Digital Search Algorithm by Using a Double-Array Structure” IEEE Transactions on Software Engineering archive Volume 15 Issue 9, September 1989 Page 1066-1077 2016 Masao Fuketa, Kazuhiro Morita, and Jun-ichi Aoe: “Comparisons of Efficient Implementations for DAWG” International Journal of Computer Theory and Engineering, Vol. 8, No. 1, February 2016 DAWGを持っている前提 orz
  19. 19. DAWGの実装 単語リスト → Linked List DAWG → Double Array Python の分かりやすいオープンソース http://stevehanov.ca/blog/index.php?id=115
  20. 20. Double Array DAWG完成 Python勉強がてら、Juliaをマスターする作戦 Python→Juliaのポーティング ChineseToolsのDouble Arrayの実装を参考 ついにDouble Array DAWGを手に入れた!
  21. 21. 気になるサイズとスピード 中国語350万語→Linked List DAWG 137 sec. Double Array 生成 12 min. Array+Character List 24 MB ちなみにdouble array trie: 94MB 中国語350万語(UTF8) 44 MB 中国語350万語(UTF8)のZIPファイル 18 MB double array読み込み 初回:2 sec. キャッシュ後:0.18 sec. Weibo 8万文での辞書マッチング速度 (書き込みなし) 31,548 文/sec/cpu (中央値)
  22. 22. 万歳!?
  23. 23. 待て! Table はとてもsparseなのでsparse matrixを使ってみよう Double Array 作る手間省ける Sparse matrix は標準技術: Compressed Sparse Columns (CSC) スピード的には期待できるかもしれない!
  24. 24. 気になるサイズと速度 中国語350万語→Linked List DAWG 137 sec. SparseMatrixの生成 58 sec. SparseMatrix+Character List 52 MB (Double-Arrayより大きい) 中国語350万語(UTF8) 44 MB 中国語350万語(UTF8)のZIPファイル 18 MB SparseMatrix読み込み 初回:2.1 sec. キャッシュ後:0.19 sec. Weibo 8万文での辞書マッチング速度 (書き込みなし) 55,212 文/sec/cpu (中央値) (予想通り速い!)
  25. 25. 参考資料 1. Comparisons of Efficient Implementations for DAWG: Masao Fuketa, Kazuhiro Morita, and Jun- ichi Aoe, International Journal of Computer Theory and Engineering, Vol. 8, No. 1, February 2016 2. A Retrieval Method for Double Array Structures by Using Byte N-Gram: Masao Fuketa, Kazuhiro Morita, and Jun-Ichi Aoe, International Journal of Computer Theory and Engineering, Vol. 6, No. 2, April 2014 3. Importance of Aho-Corasick String Matching Algorithm in Real World Applications: Saima Hasib, Mahak Motwani, Amit Saxena, International Journal of Computer Science and Information Technologies, Vol. 4 (3) , 2013, 467-469 4. Compressing dictionaries with a DAWG: Steve Hanov’s Blog , http://stevehanov.ca/blog/index.php?id=115

×