Compact, Efficient and
Unlimited Capacity:
Language Modeling with
Compressed SuffixTrees
Ehsan Shareghi, Matthias Petri,Gholamreza Haffari and
Trevor Cohn
2015/10/24 EMNLP読み会
自己紹介(jnishi)
• 西鳥羽 二郎(にしとば じろう)
• アルゴリズム
• 情報検索
• 機械学習
• 自然言語処理
• 音声認識
• 所属: 株式会社Preferred Infrastructure
• エンジニア
• プリセールス
• サポート
N-gram言語モデル
• 言語モデル: 単語列や文字列の言語らしさを表す確率モデル
• N-gram言語モデル: 直前のN-1個単語が与えられた時に、その次に単語
xが連なる確率を直前N-1個の条件付き確率で表す
• 「EMNLP読み会で発表した」vs.「EMNLP読み会で絶叫した」
• P(発表した | EMNLP, 読み会, で) > P(絶叫した | EMNLP, 読み会, で)
• 論文中ではm-gramと表記されていますが、(日本では?) N-gramの方が
馴染み深いと思うので今後N-gramと表記します
N-gram言語モデルの課題
• N-gram言語モデルを効率的に計算できるNの値は小さい
• N-gramの計算をするためにはコーパスの中の単語の出現頻度を計算する必要が
ある
• 毎回文書中で出現頻度を計算するのは時間がかかるため、予め単語の組み合わ
せの出現頻度をインデックスとして保持している
• EMNLP -> 10
• 読み -> 1000
• EMNLP 読み -> 4
• …
• そのため、Nの値に対して指数的にインデックスが大きくなる
Compact, Efficient and Unlimited Capacity:
Language Modeling with Compressed SuffixTrees
• 素敵なN-gram 言語モデル!
• Compact : Compressedなのでインデックスサイズ小!
• Efficient : SuffixTreeなので速い!
• Unlimited Capacity: 10-gramや∞-gramでも大丈夫!
• そう、 Compressed SuffixTrees(CST)ならね!!
SuffixTree(ST)
• 文書中に出てくる全てのsuffix(接尾辞)を格納したパトリシア木
11
$
a bra
cadabra$ dabra$
4 6
10 3 5 8 1 9 2
$
bra
ra
$ cadabra$ $ cadabra$
dabra$
cadabra$
7 0
$ cadabra
abracadabra$のST
葉には接尾辞のpositionを入れる
枝には文字を割り当てる
子が一つしか無い頂点は集約し
て枝に複数の文字を割り当てる
SuffixTree(ST)上の検索
• 文書中に出てくる全てのsuffix(接尾辞)を格納したパトリシア木
11
$
a bra
cadabra$ dabra$
4 6
10 3 5 8 1 9 2
$
bra
ra
$ cadabra$ $ cadabra$
dabra$
cadabra$
7 0
$ cadabra
abracadabra$のST
検索するときはルートか
ら葉までたどる
bra はインデックス8に存在
SuffixTree(ST)上の検索
• 文書中に出てくる全てのsuffix(接尾辞)を格納したパトリシア木
11
$
a bra
cadabra$ dabra$
4 6
10 3 5 8 1 9 2
$
bra
ra
$ cadabra$ $ cadabra$
dabra$
cadabra$
7 0
$ cadabra
abracadabra$のST
検索するときはルートか
ら葉までたどる
bra はインデックス1にも存在
SuffixTree(ST)の性質
• SuffixTree(ST)は長さnの文字列に対してO(n)のインデックスサイズと
なる
• 節点の数は高々n個
• 枝に付随する文字列は(開始位置, 長さ)の組で保持する
• 元の文字列とパトリシア木と上記インデックスで実現できる
• SuffixTree(ST)は長さnの文字列に対してO(n)の時間及び空間計算量で
求められる
• SuffixTree(ST)はFM-Indexという形式のデータ構造を用いて小さいイン
デックスにより実現することができる(Compressed SuffixTree, ST)
Kneser Ney 言語モデル
• 今回はInterpolated Kneser-Ney言語モデルを用いる
(N-1)個の単語列の出現数
Nにより固定のパラメー
タ(前処理で求める)
(N-1)個の単語列の後に続く単
語の種類数 次スライドで定義
Kneser Ney 言語モデル(2)
(k-1)個の単語列の前に
出現する単語の種類数
kにより固定のパラメー
タ(前処理で求める)
(k-1)個の単語列の前後に
出現する単語の種類数
単語列を1つ削って再帰
Kneser Ney 言語モデルの計算に必要な操作
:単語列の出現回数
:パターンαの前に出現する単語の種類数
:パターンαの後に出現する単語の種類数
:パターンαの前後に出現する単語の種類数
言語モデルの計算に用いるCST
• 言語モデルの計算をするため
に以下のCSTを構築する
• CST
• テキストT
• アルファベットΣ = {テキスト中
に出現する単語}
• reversed CST
• テキストTの単語の出現順番を
逆にしたreversed テキスト
• アルファベットΣ = {テキスト中
に出現する単語}
Σ={the, old, night, keeper, keeps, keep, in, town, #}
T =“#the old night keeper keeps the keep in the town# the night keeper keeps the keep in the night#$”
CSTを用いた計算
1. CST上で単語列を辿る
:単語列の出現回数
CSTを用いた計算
1. CST上で単語列を辿る
2. 単語列を表す頂点または枝まで
辿ったら、それ以下の歯の数を
探索して数え上げる
:単語列の出現回数
CSTを用いた計算
1. CST上で単語列を辿る
:パターンαの後に出現する単語の種類数
CSTを用いた計算
1. CST上で単語列を辿る
2. その頂点の子の数を取得する
:パターンαの後に出現する単語の種類数
CSTを用いた計算
1. reverse CST上でパターンαの逆順に辿る
2. その頂点の子の数を取得する
:パターンαの前に出現する単語の種類数
CSTを用いた計算
1. CST上でパターンαを辿る
2. その頂点の子Sを列挙する
3. reverse CST上でパターン
{αs | s ∈S}を辿る
4. 全てのパターンの子の数
を足し合わせる
:パターンαの前後に出現する単語の種類数
実験: perplexity
ヨーロッパ系言語でN-gramの
perplexityを計算
5-gramまでは劇的に小さくな
るが、それ以降は余り変化し
ない…
実験: インデックス構築性能比較
提案アルゴリズムとSRILMと
でインデックス構築の時間計
算量と空間計算量を比較
提案手法はSRIMLの
3-gramから4-gramの間くらい
ただし、提案手法はNによら
ないのでNが大きい場合は圧
倒的に優位
実験: クエリ性能
提案アルゴリズムとSRILMと
でN-gramを計算するときの時
間計算量と空間計算量を比較
提案手法はSRIMLと比較して圧
倒的に時間がかかっているが、
提案手法はNの値によらない
(N=2の場合は除く)
考察
• SRIMLではインデックスサイズの爆発が原因で計算できなかった大き
いNのN-gramを計算することができるようになった
• 一方でInterpolated Kneser-NeyではNを増やしてもperplexityは改善しな
かったので、他のスムージングを試してみたい(our future work !)
補足
• 今回説明した手法はCSTを2個必要としたが、FM-Indexを用いれば一つ
で済む
• 空間計算量は半分になる
• 時間計算量はFM-Index特有の処理を用いれば早くなる
実験: FM-Index版による高速化
FM-Index版だと
2〜3倍程度高速化している
まとめ
• 素敵なN-gram 言語モデル!
• Compact : Compressedなのでインデックスサイズ小!
• Efficient : SuffixTreeなので速い!
• Unlimited Capacity: 10-gramや∞-gramでも大丈夫!
• そう、 Compressed SuffixTrees(CST)ならね!!
3,4 gramと同じ位
Nが大きければね
KNではN=5で十分な
気はするけどね

Emnlp読み会資料