Google n-gram に索引を
Google n-gram のデータが大きすぎて,簡単には使えないとのことで,索引を付けてほしいと依頼されました.AND 検索ができれば OK とのことでしたが,規模が大きいので何か良い方法がないか模索中です.
まとまっていませんが,以下,考えている方法です.
- Google n-gram のデータ
- http://googlejapan.blogspot.com/2007/11/n-gram.html
- 総単語数: 255,198,240,937 (2550億)
- 総文数: 20,036,793,177 (200億)
- 異なり 1-gram 数: 2,565,424
- 異なり 2-gram 数: 80,513,289
- 異なり 3-gram 数: 394,482,216
- 異なり 4-gram 数: 707,787,333
- 異なり 5-gram 数: 776,378,943
- 異なり 6-gram 数: 688,782,933
- 異なり 7-gram 数: 570,204,252
- 圧縮した状態で約 26GB,復元すると約 100GB
- http://googlejapan.blogspot.com/2007/11/n-gram.html
文書検索として考えると,1-gram が Word,各 n-gram が Doc となります.つまり,語彙数 2.5M,文書数 3.3G となり,各文書は短い(1-7 語)という特徴があります.
さらに,各 n-gram には prefix となる (n-1)-gram が必ず存在するという仮定が(おそらく)可能です.そのため,各ノードが各 n-gram と対応する木構造(ノード数 3.3G)を構築可能であり,Succinct Tree Structure(BP, DFUDS, LOUDS)を使用すれば,かろうじてメモリ上に展開できます(ラベルや頻度は除く).
※ ただし,私の使っている PC はメモリが 1GB しかないので無理です.次は最低でも 4GB を確保しようと思います. :D
- 参考文献
- Engineering the LOUDS Succinct Tree Representation
- http://www.mcs.le.ac.uk/~ond1/XMLcomp/confersWEA06_LOUDS.pdf
ラベル(1-gram)と頻度については,外部記憶に並べておけば良さそうです.Tx はそんな風にしてありそうだという情報がありましたし….
- 参考資料
- Tx: Succinct Trie Data structure
- http://www-tsujii.is.s.u-tokyo.ac.jp/~hillbig/tx-j.htm
- 射撃しつつ前転
- http://d.hatena.ne.jp/tkng/20070805
索引は,各 1-gram に対して,その 1-gram をラベルとして持つノード番号の差分を並べたものを使います.このとき,深さ優先の木構造を採用する場合は,当該ノードからの差分ではなく,兄弟ノードからの差分を使用します.
- 残る課題
- AND 検索用のマージを効率良く実現できるか検証する必要があります.
- マージ:ノードの組が与えられたとき,先祖と子孫の関係になるかどうかを確認する処理です.
- 任意のノードから木を root 方向に辿りつつ,効率的に n-gram を復元できるかどうか検証する必要があります.
- AND 検索用のマージを効率良く実現できるか検証する必要があります.
- 修正
- 書くのを忘れていた BP, DFUDS を追加しました.