220 likes | 368 Vues
重複レコードの多い 大規模トライ辞書の圧縮. 矢田 晋 † , 森田 和宏 泓田 正雄,青江 順一 徳島大学工学部 † 学術振興会 特別研究員. はじめに. 重複レコードの多い辞書 レコードを必要としないもの (例:キーワードのリスト) 統計量をレコードとするもの (例: N-gram 言語モデル) etc…. トライ辞書. DAWG 辞書. 圧縮. 木構造. グラフ構造. 検索性能 そのまま. ポイント. どのように有効なのか トライの共通部分木をマージ 重複レコードが多いほど小さくなる どうやって構築するのか
E N D
重複レコードの多い大規模トライ辞書の圧縮 矢田 晋†,森田 和宏 泓田 正雄,青江 順一 徳島大学工学部 †学術振興会 特別研究員 重複レコードの多い大規模トライ辞書の圧縮
はじめに • 重複レコードの多い辞書 • レコードを必要としないもの (例:キーワードのリスト) • 統計量をレコードとするもの (例:N-gram 言語モデル) • etc… トライ辞書 DAWG 辞書 圧縮 木構造 グラフ構造 検索性能 そのまま 重複レコードの多い大規模トライ辞書の圧縮
ポイント • どのように有効なのか • トライの共通部分木をマージ • 重複レコードが多いほど小さくなる • どうやって構築するのか • 整列済みのキー集合から DAWG を構築 • 構築時間は辞書の規模に比例 (トライと同じ) • どのくらい有効なのか • Google N-gram データで実験 • 辞書サイズ:頻度 1/3, 対数頻度 1/5, レコードなし 1/7 応用は限定的 意外と簡単 検索性能は同等 重複レコードの多い大規模トライ辞書の圧縮
DAWG は… 「どのように有効なのか」 重複レコードの多い大規模トライ辞書の圧縮
トライと DAWG トライ (Fredkin 1960) DAWG (Adel’son-Vel’skii and Landis 1962) グラフ構造 共通部分木をマージする • 木構造 • 文字を遷移ラベルとする d # a d a l l # b e # b e d # l l l # c a l l # c a l l # e e l l # 状態数:23 ⇒ 9 遷移数:22 ⇒ 12 bad, ball, bed, bell, call, cell 重複レコードの多い大規模トライ辞書の圧縮
DAWG とレコード 重複レコードなし 重複レコードあり マージできないことがある • まったくマージできない a d d # b e # a l l # l b e d # c a l l # l l # e c a l l # e l l # bad = ■, ball = ■, bed = ■ bell = ■, call = ■, cell = ■ 状態数:23 ⇒ 10 遷移数:22 ⇒ 12 bad = ■, ball = ■, bed = ■ bell = ■, call = ■, cell = ■ 重複レコードの多い大規模トライ辞書の圧縮
DAWG の有効性 • 特長 • 重複レコードの多いトライ辞書の圧縮に有効 • トライと同等の検索性能 • 応用例 はてなキーワードや Wikipedia の記事タイトル デモ (Yoshinaga and Kitsuregawa 2009) 重複レコードの多い大規模トライ辞書の圧縮
DAWG は… 「どうやって構築するのか」– 概要と従来手法 – 重複レコードの多い大規模トライ辞書の圧縮
DAWG の構築方法 • 従来手法 • 基本戦略 • 等価な をマージ • 実現方法 • 二段階手法:トライをDAWG に変換 • 逐次手法:整列済みのキー集合から DAWG を構築(Daciuk et al. 2000, Ciura and Deorowicz 2001) • 提案手法 • 基本戦略 • 等価な をマージ 状態 大規模化が難しい 逐次手法で 簡単に実装できる 効率的な実装は 手間がかかる 遷移 重複レコードの多い大規模トライ辞書の圧縮
二段階手法(状態をマージ) • トライを介して DAWG を構築する • 欠点:作業領域が大きい トライをメモリ上に 展開するため d # a l l # b e d # a d l l # b e # l c a l l # c a l l # e l l # e まずはトライを構築 完成図 重複レコードの多い大規模トライ辞書の圧縮
二段階手法(状態をマージ) • トライを介して DAWG を構築する • 欠点:作業領域が大きい トライをメモリ上に 展開するため d # a l l # e b e d # a d l l # b e # l l c a l 完成 l # c a l l # e e l l # e トライを DAWG に変換 完成図 重複レコードの多い大規模トライ辞書の圧縮
逐次手法(状態をマージ) • キーを辞書順に登録 • 確定した順に をマージ 状態 トライを介さず DAWG を構築 d # a l l # e b e d # a d l l l # b e # l c a l 完成 l # c a l l # e e l l # e キー集合から DAWG を構築 完成図 重複レコードの多い大規模トライ辞書の圧縮
DAWG は… 「どうやって構築するのか」– データ構造と提案手法 – 重複レコードの多い大規模トライ辞書の圧縮
DAWG のデータ構造 隣接行列 (却下) 隣接リスト (採用) メモリ消費が小さい DAWG の構築に最適 • メモリ消費が大きい 0 c, 4 b, 1 1 e, 2 a, 2 2 l, 6 d, 3 3 #, ■ … … a d b e # 1 2 3 DAWG を構築してから別の データ構造に変換できる 0 c l a l # 4 5 6 7 e 重複レコードの多い大規模トライ辞書の圧縮
マージ対象の変更 状態をマージ 遷移をマージ 遷移を個別にマージ • 状態単位でマージ 0 c, 4 b, 1 0 c, 4 b, 1 1 e, 2 a, 2 1 e, 2 a, 2 … … … … これまでの完成図 状態と遷移の置き換え a d b e # a d # l b e l l # c a l l # a l e c e 重複レコードの多い大規模トライ辞書の圧縮
逐次手法(遷移をマージ) • キーを辞書順に登録 • 確定した順に をマージ 遷移 視点の切り替え による単純化 d # a l l # a d # b e d # b e l l # l l # a l c e c a l l # 完成 完成図 e l l # 重複レコードの多い大規模トライ辞書の圧縮
うれしいポイント 状態をマージするには 遷移をマージするには Dawg: HashMap<Transition> Transition: Child, Sibling, Label Child: Reference (矢印) Sibling: Reference (矢印) Label: Alphabet (文字) • Dawg: HashMap<State> • State: List<Transition> • Transition: Child, Label • Child: Reference (矢印) • Label: Alphabet (文字) 見つけやすい a a b b c c 等価 等価 d d a a e e 重複レコードの多い大規模トライ辞書の圧縮
DAWG は… 「どのくらい有効なのか」 重複レコードの多い大規模トライ辞書の圧縮
実験設定 • 実験環境 • Dell Optiplex 760 • CPU: Pentium® Dual-Core 2.50GHz • RAM: 8GB DDR2 SDRAM • OS: 64bit Ubuntu 8.10 Desktop • コーパス • Google N-gramデータ(Kudo and Kazawa 2007) • キー: 約 4 億件の 3-gram • 遷移数の上限:約 4 億 394,482,216 件 作業領域は約 5.6GB 重複レコードの多い大規模トライ辞書の圧縮
実験結果 トライと同じ 同じ遷移数 キー数 3 倍 すべて登録 5.73μs/key 3.43 μs/key 2.62μs/key 2.15μs/key time コマンドによる構築時間の計測結果 重複レコードの多い大規模トライ辞書の圧縮
実験結果(レコード) • ランダムに生成したレコードで実験 • キー数は 1 億件に固定 レコード (固有 ID) 約 5.3 億 ハッシュ表 拡張 レコード (頻度) レコード (対数頻度) 重複レコードの多い大規模トライ辞書の圧縮
おわりに • トライの圧縮(DAWG) • 重複レコードが多いほど小さくなる • 検索性能は劣化しない • 簡単に実装できる • 研究成果 • 公開ライブラリ • http://code.google.com/p/darts-clone/ • http://code.google.com/p/dawgdic/ 限定的ながらも 十分に応用可能 BSD ライセンス 重複レコードの多い大規模トライ辞書の圧縮