Forward filtering-Backward samplingによる単語分割でアンダーフローを防ぐ

2017年04月15日

概要

  • NPYLMの小ネタ

はじめに

前回実装したNPYLMですが、実装上の問題点が1つあります。

それはForward filtering-Backward samplingで単語分割をサンプリングする際に、前向き確率$\alpha[t][k][j]$が$t>200$程度でアンダーフローを起こすために、長さ200文字を超える文を学習できないというものです。

実際に$t>200$付近の値を見てみると、

alpha[205][15][7] = 2.02827e-311
alpha[205][15][8] = 3.98249e-311
alpha[205][15][9] = 3.9813e-310
alpha[205][15][10] = 7.44059e-310
alpha[205][15][11] = 1.23668e-309
alpha[205][15][12] = 6.73723e-309
alpha[205][15][13] = 2.6388e-308
alpha[205][15][14] = 8.32609e-308
alpha[205][15][15] = 1.4417e-307
alpha[205][15][16] = 1.28921e-307
alpha[205][16][1] = 1.97701e-312
alpha[205][16][2] = 3.46545e-312
alpha[205][16][3] = 2.48975e-311
alpha[205][16][4] = 1.39693e-310
alpha[205][16][5] = 6.21847e-311
alpha[205][16][6] = 8.80382e-311
alpha[205][16][7] = 1.72863e-310
alpha[205][16][8] = 1.72811e-309
alpha[205][16][9] = 3.22963e-309
alpha[205][16][10] = 5.36791e-309
alpha[205][16][11] = 2.92434e-308
alpha[205][16][12] = 1.14539e-307
alpha[205][16][13] = 3.614e-307
alpha[205][16][14] = 6.25781e-307
alpha[205][16][15] = 5.5959e-307
alpha[205][16][16] = 1.3631e-307

double型の限界に来ていることがわかります。

これはHMMのforward backwardでも起こるらしく、スケーリング係数を用いて正規化を行うことで回避できるようです。

そこでNPYLMでも$\alpha[t][k][j]$を$t$について正規化(つまり$k$と$j$に関する総和で割る)するとアンダーフローを回避できるのではないかと考えました。

NPYLMでは$\alpha[t][k][j]$を以下のように求めます。($L$は可能な単語の最大長)

\[\begin{align} \alpha[t][k][j]=\sum_{i=1}^{L}p(c^t_{t-k+1} \mid c^{t-k-j}_{t-k-j-i+1}c^{t-k}_{t-k-j+1})\cdot \alpha[t-k][j][i] \end{align}\\]

正規化定数を以下のように求めます。

\[\begin{align} z[t]=\sum_{k=1}^{L}\sum_{j=1}^{L}\alpha[t][k][j] \end{align}\\]

正規化後の前向き確率を以下のように求めます。

\[\begin{align} \hat{\alpha}[t][k][j]=\frac{\alpha[t][k][j]}{z[t]} \end{align}\\]

この\(\hat{\alpha}[t][k][j]\)を用いて前向き確率を以下のように計算します。

\[\begin{align} \alpha[t][k][j]=\sum_{i=1}^{L}p(c^t_{t-k+1} \mid c^{t-k-j}_{t-k-j-i+1}c^{t-k}_{t-k-j+1})\cdot \hat{\alpha}[t-k][j][i] \end{align}\\]

こうすることで$\alpha[t][k][j]$のアンダーフローを回避できると当初考えていましたが、このやり方は実際にはうまくいきません。

(手計算すると分かります)

これはなぜかというと、式(3)を式(1)に代入すると以下のようになりますが、

\[\begin{align} \alpha[t][k][j]=\sum_{i=1}^{L}p(c^t_{t-k+1} \mid c^{t-k-j}_{t-k-j-i+1}c^{t-k}_{t-k-j+1})\cdot \hat{\alpha}[t-k][j][i]\cdot z[t-k] \end{align}\\]

\(\hat{\alpha}[t][k][j]\)は$t$の値が異なると正規化定数も異なります。

従って、異なる$k$間での\(\hat{\alpha}[t-k][j][i]\)の値の大小が、確率\(\alpha[t-k][j][i]\)の大小を反映しなくなります。

(例えば\(\hat{\alpha}[2][1][1] = 0.1\)、\(\hat{\alpha}[1][1][1] = 0.01\)でも\(z[2] = 0.00001\)、\(z[1] = 0.1\)であれば確率としてみると\(\hat{\alpha}[1][1][1]\)の方が大きい)

そのため\(\sum_{i=1}^{L}p(c^t_{t-k+1} \mid c^{t-k-j}_{t-k-j-i+1}c^{t-k}_{t-k-j+1})\cdot \hat{\alpha}[t-k][j][i]\)の部分が確率の加算にならず、正しい前向き確率を求めることができません。

結局前向き確率を計算するには\(\hat{\alpha}[t-k][j][i]\cdot z[t-k]\)のように正規化を元に戻さなければならないため、帳尻を合わせようと$z[t]$がしだいに小さくなっていきます。

同様に$t>200$付近の値を見てみると、

alpha[210][15][1] = 1.0451e-28, z[210] = 1.23516e-322
alpha[210][16][4] = 2.33028e-30, z[210] = 1.23516e-322
alpha[210][16][5] = 1.6131e-29, z[210] = 1.23516e-322
alpha[210][16][6] = 2.01832e-29, z[210] = 1.23516e-322
alpha[210][16][7] = 6.76693e-29, z[210] = 1.23516e-322
alpha[210][16][8] = 3.79315e-30, z[210] = 1.23516e-322
alpha[210][16][9] = 3.36222e-29, z[210] = 1.23516e-322
alpha[210][16][10] = 1.04752e-28, z[210] = 1.23516e-322
alpha[210][16][11] = 6.17396e-29, z[210] = 1.23516e-322
alpha[210][16][12] = 1.78057e-28, z[210] = 1.23516e-322
alpha[210][16][13] = 6.06071e-28, z[210] = 1.23516e-322
alpha[210][16][14] = 3.18137e-27, z[210] = 1.23516e-322
alpha[210][16][15] = 3.28357e-25, z[210] = 1.23516e-322
alpha[210][16][16] = 4.82999e-26, z[210] = 1.23516e-322
alpha[211][1][1] = 3.0484e-12, z[211] = 0
alpha[211][1][2] = 8.24485e-13, z[211] = 0
alpha[211][1][3] = 4.57098e-10, z[211] = 0

$\hat{\alpha}[t][k][j]$が現実的な値の範囲に収まっているのに対し、$z[t]$がアンダーフローを起こしています。

そこで$z[t]$を直接保持するのではなく、$\log(z[t])$を用いて$\hat{\alpha}[t][k][j]$を計算できないかと考えました。

式(3)の正規化後の前向き確率は以下のように変形できます。

\[\begin{align} \hat{\alpha}[t][k][j] &= \frac{\alpha[t][k][j]}{z[t]}\nonumber\\ &= \exp\Bigl(\log\bigl(\frac{\alpha[t][k][j]}{z[t]}\bigr)\Bigr)\\ &= \exp\Bigl(\log\bigl(\alpha[t][k][j]\bigr) - \log\bigl(z[t]\bigr)\Bigr)\\ &= \exp\Bigl(\log\bigl(\sum_{i=1}^Lp(\cdot\mid\cdot)\cdot \hat{\alpha}[t-k][j][i]\bigr) + \log\bigl(z[t-k]\bigr) - \log\bigl(z[t]\bigr)\Bigr)\\ \end{align}\\]

こうすることで$\log(z[\cdot])$と$\hat{\alpha}[\cdot][\cdot][\cdot]$のみを用いてアンダーフローを起こさずに正規化後の前向き確率を計算できます。

ただし、このままでは\(\log(z[t])\)の値がわからないため、以下の手順により求めます。

まず以下の値を定義します。

\[\begin{align} \ddot{\alpha}[t][k][j]:=\sum_{i=1}^{L}p(c^t_{t-k+1} \mid c^{t-k-j}_{t-k-j-i+1}c^{t-k}_{t-k-j+1})\cdot \hat{\alpha}[t-k][j][i] \end{align}\\]

これは正規化されている\(\hat{\alpha}[t-k][j][i]\)から計算される前向き確率を表していますが、\(\ddot{\alpha}[t][k][j]\)の値は正規化されていないことに注意が必要です。($k$と$j$について総和を取っても1になりません)

式(5)より以下が成り立ちます。

\[\begin{align} \alpha[t][k][j]&=\ddot{\alpha}[t][k][j]\cdot z[t-k] \end{align}\\]

次に$\ddot{\alpha}[t][k][j]$を$k$と$j$について全て求めてから、以下の式で正規化定数の対数を求めます。

\[\begin{align} \log(z[t]) &=\log\biggl( \sum_{k=1}^{L}\sum_{j=1}^{L}\alpha[t][k][j] \biggr)\\ &=\log\biggl(\sum_{k=1}^{L}\sum_{j=1}^{L}\exp\Bigl(\log\bigl( \alpha[t][k][j] \bigr) \Bigr)\biggr)\\ &=\log\biggl(\sum_{k=1}^{L}\sum_{j=1}^{L}\exp\Bigl(\log\bigl(\ddot{\alpha}[t][k][j]\bigr) + \log\bigl(z[t-k]\bigr)\Bigr)\biggr)\\ \end{align}\\]

この$\log\left(\sum^N_{i=1}\exp(x_i)\right)$の形はlogsumexpと呼ばれており、以下のように計算できるそうです。

\[\begin{align} \log(\sum^N_{i=1} \exp(x_i)) = \log\{\sum^N_{i=1} \exp(x_i - x_{ {\rm max} })\} + x_{ {\rm max} } \end{align}\\]

$x_{ {\rm max} }$は$\exp$の中の$x_i$の最大値です。

これを式(12)に適用するためには、\(\log\bigl(\ddot{\alpha}[t][k][j]\bigr) + \log\bigl(z[t-k]\bigr)\)の最大値を求めておきます。

この最大値を$\alpha_{ {\rm max} }$とすると、

\[\begin{align} \log(z[t]) = \log\biggl(\sum_{k=1}^{L}\sum_{j=1}^{L}\exp\Bigl(\log\bigl(\ddot{\alpha}[t][k][j]\bigr) + \log\bigl(z[t-k]\bigr) - \alpha_{ {\rm max} }\Bigr)\biggr) + \alpha_{ {\rm max} } \end{align}\\]

となります。

最後に、式(8)を式(7)に代入した以下の式より、正規化後の\(\hat{\alpha}[t][k][j]\)を求めます。

\[\begin{align} \hat{\alpha}[t][k][j] &= \exp\Bigl(\log\bigl( \ddot{\alpha}[t][k][j] \bigr) + \log\bigl(z[t-k]\bigr) - \log\bigl(z[t]\bigr)\Bigr)\\ \end{align}\\]

この部分のコードです

double sum_exp = 0;
// 最大値を求める
double max_log_z = 0;
for(int k = 1;k <= std::min(t, _max_word_length);k++){
  if(t - k == 0){
    double tmp = log(_alpha[t][k][0]) + _log_z[t - k];
    if(max_log_z == 0 || tmp > max_log_z){
      max_log_z = tmp;
    }
  }
  for(int j = 1;j <= std::min(t - k, _max_word_length);j++){
    double tmp = log(_alpha[t][k][j]) + _log_z[t - k];
    if(max_log_z == 0 || tmp > max_log_z){
      max_log_z = tmp;
    }
  }
}
// 求めた最大値をもとにlogsumexp
for(int k = 1;k <= std::min(t, _max_word_length);k++){
  if(t - k == 0){
    sum_exp += exp(log(_alpha[t][k][0]) + _log_z[t - k] - max_log_z);
    continue;
  }
  for(int j = 1;j <= std::min(t - k, _max_word_length);j++){
    sum_exp += exp(log(_alpha[t][k][j]) + _log_z[t - k] - max_log_z);
  }
}
double log_z_t = log(sum_exp) + max_log_z;
// 正規化
for(int k = 1;k <= std::min(t, _max_word_length);k++){
  if(t - k == 0){
    normalized_alpha[t][k][0] = exp(log(_alpha[t][k][0]) + _log_z[t - k] - log_z_t);
    continue;
  }
  for(int j = 1;j <= std::min(t - k, _max_word_length);j++){
    normalized_alpha[t][k][j] = exp(log(_alpha[t][k][j]) + _log_z[t - k] - log_z_t);
  }
}
_log_z[t] = log_z_t;

実際に$t=1000$付近の値を見てみると以下のようになりました。

log(z[980]) = -2124.74
log(z[981]) = -2125
log(z[982]) = -2129.34
log(z[983]) = -2133.35
log(z[984]) = -2137.04
log(z[985]) = -2137.97
log(z[986]) = -2138.25
log(z[987]) = -2140.82
log(z[988]) = -2147.34
log(z[989]) = -2147.76
log(z[990]) = -2148.17
log(z[991]) = -2150.84
log(z[992]) = -2151.11
log(z[993]) = -2156.26
log(z[994]) = -2156.61
log(z[995]) = -2156.97
log(z[996]) = -2161.24
log(z[997]) = -2161.73
log(z[998]) = -2162.66
log(z[999]) = -2170.15
log(z[1000]) = -2172.94
log(z[1001]) = -2173.71

$\exp(-2173)$は1.89e-944なのでdouble型では表現できませんが、常に対数を扱うことでアンダーフローを回避できています。

実験

けものフレンズ実況スレから15万文を収集し、改行を適切に削除して5,000行に圧縮したデータを用意しました。

最も長い行は2,774文字からなる以下の行です。

ああ・・・落ちたときに頭、打ったんだなwたつき「探せ……冷奴はそこに置いてある!」サーバルちゃんの涙・・・プライスレスあれってお母ちゃんだったりしてサーバルちゃんを食べちゃうんですねわかりますさすがにもうかばんちゃんが唯の人ってい線はもうないんかなミライさん達「も」じゃなくてミライさん達「は」隠れたほうがいい指示が来たんだろ、完全退去するようにと「私達は大丈夫だけどミライさんは隠れないと」みたいな部分は今の所不明、だけど博士の言ってた「人間の近くにはセルリアンが寄る」というのが理由かも当初は人間がセルリアンを撒いてる説もあったけど、どうも違ってるようだし考察班の方々へお願い「帽子」や「かばん」は通常は「有機物」ですその点を踏まえて考察お願いいたしますedの歌詞通りだと、この先嫌な予感しかしねぇ・・・普通に考えたら暗い話にならんわなここまで見てバッドエンド考える奴は勘ぐりすぎよ虚淵じゃあるまいしかばんちゃんのナワバリだとか一緒に暮らそうとかサーバルはお別れ考えてないんだろうなってセリフが連絡船に使えそうな小型船舶ぐらいはあるだろう。もしくはセントラルに通信施設。あの3話の観覧車見てからセントラルが離れない。アプリでも決戦の地だったしね。完全退去はどこからの指令なんだろうなアプリだと管理センターみたいなのがあった気がしたが無断引用違法mad作者のエサになるだけ1話でかばんが大型セルリアンに攻撃されてるからかばんセルリアン説は無いと思うなもしかばんがセルリアンなら敵対してこないはず今となってはカワウソでiq溶かしてた頃が懐かしいなあぁ、最終回のサブタイトルがぼくのフレンズにオラン探偵ギロギロってなに野中サーバルと尾崎サーバルどういう事だろうか9話の最後に出た影ってなんやったん?まだボスたちロッジについてないよな???それとも付いた後の描写か?いやむしろ理想的なエンディングだろ得体の知れない敵と認識していたセルリアンとの相互理解の可能性かばんちゃんはストパンのネウ子のような存在になれるんだよ9話まで追いついた~dアニメのフレンズは10話配信はいつなんだろう狐コンビとサーバルが温泉入ってる時、しれっと一緒に入ってたフレンズは何者?オオカミの言ってた夢から出られなくなる話って実際にアプリのイベントであったらしいねまさかこのアニメで有機物と無機物の定義で揉める事になるなんて誰が予想できたか落ち着いて考えたら謎すぎるわたぶんパーク全体が環境汚染でもされてて、フレンズは耐えられるが人には無理とかなんじゃ2人が手を組んでたと思われるミライと初代サーバルの2代目だとしたらこれサーバルちゃんとカバンちゃんの別れずに冒険が続くワンチャンありそう!寝る前は222スレだったはずが帰宅して視聴してから来たら10スレ進んでるとかどんだけ推理回ということもあってキリンさん続出だねぇそういうのもうお腹いっぱいだからなぁ子供でも楽しめるって言ってるしシンプルなハッピー寄りのエンドでいいよね全然あると思うフレンズか人かってのが作品の主張する大筋でしょ「怖いけど確認しよう」のとこかばんちゃんがボスの頭に手おいててわろた二代目サーバルちゃんは初代を見て何か気づいたくさいよねあれからなぜか一緒に暮らそうとか提案してるしあんだけヒトの縄張り探そうって言ってたのに急に変わったのは・・・・木曜のお昼だそういえばサーバルの命名安直過ぎるだろ設定もアプリからだったな自分的にはお別れエンドでもバッドエンドなんだ�「だ、だ、だ、誰だろ~?」と「かばんちゃんなんで知ってるのー!?」可愛すぎたボスかわいいわざわざミライさんcgを新規で作ったって事はスピンオフ作る気まんまんだなあにてれ限定配信がミライさんのけものフレンズな可能性が高くなったedってiq上げて聞くとなんか意味深でずっと再生しちゃうダーウィンが来た!の比較版はすでに出てたな…30分仕様でいつ消えるか物語の中において言葉の定義が正確な意味で使われているという保証はない必要以上にその部分に拘るのはいわゆるアスペルガー的な発想だよ「自分がセリルアンだったら…あっ…はっ、あ、あの…」が怖いンゴオオオオオオかぱんちゃんがただのミライさんの同僚だったら面白いみんなずっこけるわこの頃に戻りたい……ジャングルだのこうざんだのが一番楽しかった生物感で揉めたり、宗教観で揉めたり、物質の定義で揉めたり、忙しいアニメだよなアニメけもフレが豆腐だとすれば大元のけものフレンズプロジェクトはその上醤油にも味噌にもなる大豆日本文化の新たな中核要素が産まれたのかもしれんあっさりバラすかばんちゃんの淡白さ好きちなみにダーウィンのサーバル回のあらすじはこんな感じだったそうでところでロッジの宿泊費は?のけものフレンズプロジェクト今夜7時からの生き物にサンキューは猫&フクロウ特集らしい。サーバルはわからんけどカラカルは出るもようオオカミが漫画描いてたけどそもそもフレンズは文字が読めないから読者がいないんじゃありがと~おいこらhが出て書けない…最終回にかばんちゃんの帽子を被るサーバルちゃん今話題のミライさんのシルエット見たとき一瞬かばんちゃんかと思った放映版も何もそこは原作にもあるんだけど原作をこれでいうと「ジャパリパークの外に行けばヒトが居るって聞いてたけど居心地のいいここに居たいからやめる」と島でずっとキャッキャウフフ生活することに決める主人公が冒険心を捨てるエピソードアニメ版は…はかせがカバンの聞いていないところで助手に「カバンはパーク存続のため外部へ捧げるイケニエなのです。ヒトのフレンズはそのために存在するのです」とか言い出してカバンちゃんが「島の外に出たら人間に襲撃された!」って実際には全く起こっていない妄想をマジトーンで語りながら島に逃げ帰ってキャッキャウフフ。観音が「一視聴者として言わせてもらうと、はかせひどい…」ってブログに書く感じこれは見てみたいサーバルちゃん、質問いいかな……食堂にあったジャパリまん、どこ行った?あれは自分が巡回したところにオバケが出ることに気づいただけやろそうにちがいないしそうであってなくては困る汚染され人が住めなくなったパーク汚染物質を浄化するセルリアン人が戻ってくるまで、ある程度汚染物質に耐性を持つパークの新たな住人フレンズ映画化すれば国民的大ヒットなりそう角川じゃなく徳間と日テレで頼むベルセルクって漫画読んでみ。後半ほとんど字が無いからあと1週間も待たなければいけないのかと思うとつらいわこんな気持ち久しぶりかばんちゃんはラッキービースト拡張パーツ鞄にラッキービーストをセットすることによりラッキービーストの移動による消耗を抑えることができるスグレモノ

どの行も300文字を超えているため、正規化しない通常の実装では確実にアンダーフローを起こすようになっています。

学習はpython-npylmを用いてCore i7-6700KのUbuntuで行いました。

実験結果

Forward Backwardによる単語分割のサンプリング例です。

/ アニメ / に / セルリアン / 設定 / を / 出 / す / 必要 / は / まったく / なかった / と思う / um / nk / は / 原作 / と / 漫画 / で / 終わり方 / 変え / て / た / なあ / 原作 / 有り / だ / と / 色々 / 考え / ちゃ / う / けど / オリジナル / だ / と / 余計な / 事 / 考え / なくていい / ね / 犬 / のフレンズ / だから / さ / 、 / ガキが余計な / レスつけてくんな / って / 言って / る / だろ / ジャパリパーク / 滅亡 / まで / あと / 1 / 4 / 日 / 間 / 。 / まだ / 作品 / は / 完結 / して / ない / し / この / あと / 話 / に / どう / 関わって / くる / か / わから / ない / と思う / んだが / 最終話 / まで / い / って / / そういう / こと / だった / のか / ー / ! / / って / な / った / 後で / 見返すと / また / 唸 / ら / され / そう / な / 場面 / が / 多い / ん / だよ / ね / お別れ / エンド / 想像 / する / だけで / 震え / て / くる / けど / ハッピー / エンド / なら / 受け入れ / る / しかない / よ / ね / この / スレ / は / 子供 / が / 多くて / 最終回の / 感動 / も / 萎える / だ / ろ / う / 百合 / アニメ / として / 楽しんで / る / 奴 / もいる / ん / だね / ぇ / あー / 、 / それ / は / 誤 / り / だ / 。 / 低 / レアリティ / フレンズ / にスポットライト / が / 当て / られ / て / る / こと / もある / 。 / 毒 / 抜いた / っていう / のは / 伏線 / 回収 / は / だいたい / や / る / けど / も / 鬱 / な / 感じ / に / は / して / ない / ていう / 意味 / だ / と / 解釈 / し / た / けど / 【 / � / 】 / 『けものフレンズ』 / 第 / 10話「ろっじ」 / より / 、 / 先行 / 場面 / カット / が / 到着 / ! / 宿泊 / した / ロッジ / に / 幽霊 / ……? / 【 / � / 】 / [無断転載禁止]©2ch. / net [ / 8 / 9 / 1 / 1 / 9 / 1 / 9 / 2 / 3 / ] / 実際のところ / けもの / フレンズ / は / 百合 / なのか / ? / 例えば / どこが / 百合 / っぽい / ? / いや / 、 / ある / だろ / 。 / セルリアン / が / いる / 事 / に / よって / 物語 / に / 緊張感 / が / 生まれ / る / 。 / 伏線 / が / 結構 / 大きい / 物 / な気がする / んだ / けど / これ / あと / 2話 / で / 終わ / る / のか / なぁ / ? / もしかして / 「 / ジャパリ / パーク / の / 外に / 人間 / を / 探しに / 行く / よ / ! / カバンちゃん / たち / の / 冒険は / これから / だ!」 / エンド / じゃある / まい / な / それ / でも / あれ / は / 許容 / し / 難 / かった / とおもう / ぞ / そもそも / 利 / 潤 / 第一 / でない / けもの / プロジェクト / に / 売上 / で / 優劣 / 語 / る / の / は / ナンセンス / や / ぞ / の / タイトル / も / いい / な / カバンちゃん / 「 / さーばる / 島の外に / 出 / ちゃ / う / と / 記憶 / も / なくな / る / ん / だ / よ / ? / 」 / さーばる / 「 / うん / 、 / それ / でも / いい / よ / 。 / 」 / カバンちゃん / 「 / う / うん / 、 / ダメ / 。 / ボク / が / のこ / る / よ / 。 / 」 / さーばる / 「 / え? / ・・・ / 」 / カバンちゃん / 「 / さーばる / は / 大切な / 僕 / のフレンズ / だから / 」 / わざわざ / ng / 宣言 / とか / キッズ / の / 代表 / みたいな / も / ん / だろ / 出来 / の / 良い / おさ / らい / サイト / が / ある / よ / 俺 / も / そこ / で / 予習 / し / た / タイム / アタック / 式 / の / クエスト / で / 低 / レア / 構成 / ボーナス / 入るから / 人権 / ない / ってレベル / じゃ / ない / ぞ /

/ 予約 / でき / ない / のに / いつまで / 2巻 / は / ランキング / 1位 / なん / だ / よ / けもの / フレンズ / 、 / 縮めて / フレンズ / 。 / ジャパリパーク / の / 不思議 / な / 不思議な / 生き物 / 。 / 空 / に / 山 / に / 海 / に / フレンズ / は / いた / る / ところ / で / そ / の / 姿 / を / 見 / る / こと / が / 出来 / る / 。この / 少女 / 、 / ヒト / と / 呼ばれ / る / かばん。 / 相棒 / の / サーバル / と / 共に / バトル / & / ゲット / 。 / フレンズの / 数だけ / の / 出会い / が / あり / フレンズの / 数だけ / の / 別れ / がある / ( / 石塚運昇) / ニコ動 / 調子 / 悪 / そう / なんだ / けど / 上映会 / だ / いじょうぶ / か / ね / コスプレ / はよ / もう / 何度も / 書かれてる / だろうけど / 、 / 2話 / ed / で / 入 / って / きた / 身としては / ed / やっぱ / 良い / 。 / 歌 / も / 歌詞 / も / 合って / る / し / 、 / 普通の / アニメ / っぽく / ない / 廃墟 / に / した / の / も / 全部 / 良い / 。 / 情報 / が / 氾濫 / し / すぎ / て / 何 / が / ネタバレ / か / さっぱり / 分からん / けど / 、 / 1つ / ぐらい / は / 本物 / が / まじ / っ / て / そう / だな / 。 / ま、 / 来週 / を / 楽しみ / に / して / る / よ / 。 / アライさん / の / 「 / 困難は / 群れで分け合え / 」 / って / 台詞 / もしかして / アプリ版 / で / 出て / きた / こと / あった / りする / ? / それ / なら / 記憶 / の / 引 / 継ぎ / 説 / は / ほぼ / 間違え / なさ / そう / だ / けど / 神 / 展開 / で / ワロタ / これ / は / 地上波 / 流 / せ / ません / ね / ぇ / … / まあ、 / 数 / 打ちゃ当たる / 11話の / 展開 / は / 予想 / されて / なかった / 気配 / だ / が / 汗 / まあ / ニコ動 / ランキング / に / あ / っ / た / アプリ版 / ストーリー / 見 / た / 時 / 点 / で / すでに / 覚悟はできてる / 一 / 人 / でも / いいから / 出 / して / ほしかった / … / マジで / サーバル / / プレーリードッグ / / ヘラジカ / 殷周 / 伝説 / みたい / な / 肉 / マン / を / 想像 / し / ちゃ / っ / た / じゃぱりまん / の / 中身 / で / 肉 / が / ある / なら / だ / が / 無い / から / 安心 /

/ 知識 / や / 性格 / まで / クローン / は / 無理 / だ / と思う / nhkで / アニメ / 放送 / から / の / 紅白 / 出場 / だと / 嫌な予感がする / 藤子不二 / 雄 / や / 大友 / 克洋や / 鳥山明 / は / エール / を / 送 / られ / た / が、 / 自分 / が / 理解 / でき / ない / もの / が / 流行 / っ / て / る / と / 怒 / った / らしい / な / 巨人の星 / とか / ス / ポ / 根 / も / のは / 、 / どうして / こんな / もの / が / 人気 / なん / だ / って / アシスタント / と / 担当 / に / 怒鳴り / 散らし / た / そう / な / 日本語 / で / しか / 伝わらない / 表現 / ある / もん / ね / ひらがな / カタカナ / 漢字 / でも / ニュアンス / 使い / 分 / け / られ / る / し / また / 同時 / に / 英語 / いい / なあ / と思う / 所 / もある / 親友 / ( / ?) / なのに / そ / の / 欠片 / も / み / られ / ない / 猫 / の / 話 / は / やめ / なさい / … / なん / か / 、 / マズルの / ところ / が / カイ / ゼル / 髭 / みたい / で / 、 / かわいい / っていうより / カッコイイ / とおもう / ん / だが / / 「 / ( / いや / 俺ら / に / 言われ / て / も / ) / 」 / って / 困惑 / する / 様子 / が / w / 藤子不二 / 雄 / は / 貶 / そう / と / 思って / た / ら / 全力で / 尊敬 / されて / 持ち / 上げ / て / くる / ので / 面倒見 / ざるを得な / かった / とか / いう / ホント / か / ウソ / か / 分からない / 逸話 / すこ / 世界 / 最高峰 / の / 日本 / アニメ / を / 字幕 / 無し / で / 観 / られ / る / 幸せ / たぶん / そうな / ん / だろう / とは思う / が / おいしい / とこ / だけ / 取ら / れ / て / 何も / やってない / 扱い / で / うん / ざ / り / して / そう / 結局 / 自分 / の / 好 / み / って事 / か / 本人 / に / しか / わから / ない / 先 / 駆 / 者 / として / の / 強烈な / 自負 / と / 、 / 追い / 抜か / れ / る / 恐怖 / かわ / あった / のだろう / と愚考 / した / 。 / スポーツ / 漫画や / 劇 / 画 / が / 流行 / っ / た / 時 / ノイローゼ / になり / かけ / た / と / 聞く / が / 、 / 90年代 / 以降 / の / トーン / バリバリ / アニメ / 絵柄 / や / 萌え / 文化 / とか / 見 / た / ら / どう / なってしまう / んだろう / あと / サーバルちゃん / かわいい / コクボス / 「 / ジカ / ン / ダヨ / 」 / 礼儀 / は / 守 / る / 人 / だろう / … / 内心 / 穏やか / ではない / が / ニコ動 / の再生数 / なんて / まったく / 当て / に / ならん / ぞ / ニコ生 / の / 来場者 / 数 / と / 有料 / 動画 / の / 再生数 / は / 当て / に / して / いい / けど / 6話 / の / へいげん / の / とき / / ヘラジカ / さん / たち / に / 「 / サーバルキャット / のサーバル / だよ / 」って / 自己紹介 / して / た / のが / なんか / 不思議 / だ / った / な / 「 / 省略 / する / 」って / 文化 / ある / ん / だ / / みたい / な / 一話 / の再生数 / で / 分かる / のは / 洗脳 / 度 / だけ / だ / な / すぐ / 解 / け / る / 洗脳 / かも知れん / が / それ / 見たい / わ / めちゃくちゃ / 好循環 / じゃない / か / … / イッカク / クジラ / の / イッカク / だ。 / って / 名乗 / って / る / キャラ / もいた / し / 。 / いや~ / メンゴメンゴ / / あ / 、 / ボス / さん / きゅー / w / アプリ版 / の / オオ / アルマジロ / の / 声で / 絡んで / ほしかった / ( / cv / 相 / 沢 / 舞 / ) / 名前 / の / 概念 / 例えば / ヘラジカ / は / 種族 / として / 言って / る / のか / 名前 / と / して / 言って / る / のか / かばんちゃん / と / 名 / 付け / て / る / から / 概念 / として / は / 在 / る / ん / だろう / けど / 果たして / クローン / は / 同じ / ポテンシャル / を / 引き / 出 / せ / る / だろう / か / 。 / 藤子f / という / か / ドラえもん / に / は / 完全 / 敗北 / を / 認め / て / た / らしい / から / ね / ドラえもん / を / 超え / る / キャラ / は / 作れ / ない / って / どうぶつ / スクープ / と / ダーウィン / と / wbc / どっち / を優先 / すべき / か /

/ 捨て / た / り / しない / ん / じゃないかな / ? / ま、 / ちょっと / (ry / ロッ / ソファンタズマ / は / 先代 / サーバル / の / 技 / って / 言いたい / のは / わかる / けど / 。 / かばんちゃん / 視点 / から / 見ると / op / の / 映像 / の意味 / になる / と / いう / ダブルミーニング / なの / かも知れない / これ / は / なかなか / 面白い / 基本的に / ゲスト / フレンズって / カップル / にな / る / けど / この / 二人 / は / その後 / どうなった / ん / だろう / ね / 杏子 / も / 野中 / か / 優しく / て / 元気な / 女の子 / の / 唐突な / 涙 / は / めちゃくちゃ / くる / もの / がある / な / ppp / が / 歌 / って / る / こと / から / 考えると / あり / 得 / る / ね / 、 / 宣伝 / 曲 / そして / まんま / と / ようこそ / され / ました / なんだか / コケ / そう / な / 気がして / ならない / 12話 / だから / 話 / を / 膨らま / せ / て / 伏線 / を / 回収 / して / って / の / が / でき / た / けど / だら / っと / 続け / て / いく / と / すると / ・・・ / たまに / 見 / る / 豆腐 / や / 冷奴 / は / 何 / を / 示唆 / して / る / ん / だ / ? / 姿 / が / フレンズ / だと / 判別 / でき / ない / ん / じゃないか / とりあえず / 初版 / は / 無理 / でも / 重版分 / 買おう / 古典sf / 的に / タイ / ムスリップ / して / アプリ版 / プレイヤー / として / ミライさん / の / 運命 / を / 変え / に / 行く / とか / は / あり / そう /

/ すごーい / ぞ / おー / ! / が / 正解 / で / 世界遺 / 産! / が / 空耳 / おいおい / エヴァ / か / ? / 聖域 / への / 立ち / 入り / 認可 / 、 / 正体 / 不明 / な / 新規 / フレンズ / の / 評価 / 、 / 困った / とき / の / 相談 / 役 / 色々 / やって / る / な / 輪廻転生 / して / 二人 / は / 一緒 / も / 人間 / は / 滅んで / て / かばんちゃん / は / サーバルちゃん / とずっと一緒 / も / ぶっちゃけ / 百合厨の願望 / だし / たつきが / そんな安直な / 設定 / に / せ / ん / でしょ / ジャパリパーク / って / 時間 / の / 進 / み / が / サンドスター / その他 / の / 影響 / で / 物凄く / 早 / く / なって / る / から / 人工 / 物 / が / 朽ち / て / た / り / する / ん / か / な / 聞こえ / ない / と / 言えば / ツチノコ / の / 「 / ピット器官 / ! / 」 / って / 言 / っ / た / 後 / に / モ / ニャモニャ / … / って / なんか / 言って / る / けど / なんて / 言って / る / のか / 未だに / 分からない / … / メ / イ / ズ / ランナー / 的な / 人類滅亡 / とか / ちょっと / 似てる / し / 13話 / ネタバレ / 中尉 / か / つて / の / ロッジ / で / は / フレンズと / 一 / 夜 / を / 共に / する / こと / が / でき / る / 人工 / 物 / は / ヒト / が / 使わ / なくな / る / と / たった / 数年 / で / 朽ち / る / よ / 林 / 業 / 管理 / も / やって / る / から / な / toki / o / のフレンズ / と / 言われ / て / も / 不思議 / はない / 図書館 / に / 入 / り / 浸 / って / ゴロゴロ / 絵本 / 読んで / る / フレンズ / い / ない / かな / ピット器官 / ! / ・・・ / ・・・ / だとかでぇ、 / 俺には / 赤外線が見えるからな / ! / ( / ・ / ∀・) / 目 / が / か / ゆい / … / ジャパリパーク / に / も / 花粉症 / は / ある / のか / な / サーバル / が / なぜ / ハシビロコウ / だけ / ハシビロ / ちゃん / 呼び / なのか / が / 最大の / 謎 / 12話 / は / op / は / 一番 / 最後 / カバンちゃん / と / サーバルちゃんが / 仲良く / ブランコ / に / 揺ら / れ / る / 絵 / が / 入 / る / よ / けもフレ / を / 細かく / 見 / て / ない / 間違って / セリフ / 覚え / て / る / アプリ / 時代 / の / 知識 / を / 間違って / 捉え / て / る / って / いう / ので / 、 / 悶々と / 考察 / してる / 人 / の / 多 / い / こと / 多い / こと / … / … /

アンダーフローを起こすと文の後半が分割できないのですが、正規化しているおかげで単語分割のサンプリングがうまくできています。

ちなみに先ほどの最大長の文を学習後のNPYLMとビタビアルゴリズムにより分割した結果です。

/ ああ / ・・・ / 落ち / た / とき / に / 頭 / 、 / 打 / った / ん / だ / な / w / たつき / 「 / 探 / せ / … / … / 冷奴 / は / そこ / に / 置いて / ある / ! / 」 / サーバルちゃんの / 涙 / ・ / ・・ / プライスレス / あれ / って / お / 母 / ちゃん / だったりして / サーバルちゃん / を / 食べ / ちゃ / う / ん / ですね / わかります / さすが / に / もう / かばんちゃんが / 唯 / の / 人 / って / い / 線 / は / もう / ない / ん / か / な / ミライさん / 達 / 「も / 」 / じゃなくて / ミライさん / 達 / 「 / は / 」 / 隠れたほうが / いい / 指示 / が / 来 / た / ん / だろ / 、 / 完全退去 / する / ように / と / 「 / 私 / 達 / は / 大丈夫 / だ / けど / ミライさん / は / 隠れないと / 」 / みたいな / 部分 / は / 今の所 / 不明 / 、 / だ / けど / 博士 / の / 言ってた / 「 / 人間 / の / 近くに / は / セルリアンが / 寄る / 」 / という / のが / 理由 / かも / 当初 / は / 人間 / が / セルリアン / を / 撒いて / る / 説 / も / あった / けど / 、 / どう / も / 違 / っ / て / る / よう / だし / 考察班 / の / 方 / 々 / へ / お願い / 「帽子 / 」 / や / 「 / かばん / 」 / は / 通常 / は / 「 / 有機物 / 」 / です / その / 点 / を踏まえて / 考察 / お / 願いいたします / edの歌詞 / 通りだと / 、 / この / 先 / 嫌な / 予感 / しかし / ねぇ / ・・・ / 普通に考えたら / 暗い / 話 / に / ならん / わ / な / ここ / まで / 見 / て / バッドエンド / 考え / る / 奴 / は / 勘 / ぐ / り / すぎ / よ / 虚淵 / じゃある / まい / し / かばんちゃん / の / ナワバリ / だ / とか / 一緒に暮らそう / とか / サーバル / は / お別れ / 考え / て / ない / ん / だろう / な / って / セリフ / が / 連絡船 / に / 使え / そう / な / 小型 / 船舶 / ぐらい / は / ある / だろう / 。 / もしくは / セントラル / に / 通信 / 施設 / 。 / あの / 3話の観覧車 / 見てから / セントラル / が / 離れない / 。 / アプリ / で / も / 決戦の地 / だった / し / ね / 。 / 完全退去 / は / どこか / ら / の / 指令 / なん / だろう / な / アプリ / だと / 管理センター / みたいなの / が / あった / 気が / した / が / 無断 / 引用 / 違法 / mad / 作 / 者 / の / エサ / に / なる / だけ / 1話で / かばん / が / 大型 / セルリアン / に / 攻撃 / され / て / る / から / かばん / セルリアン / 説 / は / 無い / と思う / な / もし / かばんが / セルリアン / なら / 敵対 / し / て / こ / ない / はず / 今となって / は / カワウソ / で / iq / 溶か / し / て / た / 頃が / 懐かしい / な / あ / ぁ / 、 / 最終回 / の / サブタイトル / が / ぼく / のフレンズ / に / オ / ラ / ン / 探偵 / ギロギロ / って / なに / 野中サーバル / と / 尾崎サーバル / どういう / 事 / だろう / か / 9話の / 最後 / に / 出 / た / 影 / ってなんやったん / ? / まだ / ボス / たち / ロッジ / に / ついて / ない / よな / ? / ? / ? / それとも / 付いた後の / 描写 / か / ? / いや / むしろ / 理想 / 的 / な / エンディング / だ / ろ / 得体の / 知れない / 敵 / と / 認識 / して / いた / セルリアン / との / 相互 / 理解 / の可能性 / かばんちゃん / は / ストパン / の / ネ / ウ / 子 / の / ような / 存在 / に / なれ / る / んだ / よ / 9話 / まで / 追い / つ / いた / ~ / d / アニメ / の / フレンズは / 10話 / 配信 / は / いつ / なんだろう / 狐コンビ / とサーバル / が / 温泉 / 入 / って / る / 時 / 、 / しれっ / と / 一緒 / に / 入 / って / た / フレンズ / は / 何者 / ? / オオカミ / の / 言ってた / 夢から出られなくなる話 / って / 実際 / に / アプリ / の / イベント / で / あった / らしい / ね / まさか / このアニメ / で / 有機物と無機物の定義で / 揉 / め / る / 事 / になる / なんて / 誰が / 予想できた / か / 落ち着いて / 考え / た / ら / 謎 / すぎる / わ / たぶん / パーク / 全体 / が / 環境 / 汚染 / でも / され / て / て / 、 / フレンズは / 耐え / られ / る / が / 人 / に / は / 無理 / とか / なん / じゃ / 2人 / が / 手 / を / 組 / んで / た / と思われる / ミライ / と / 初代 / サーバル / の / 2代目 / だ / としたら / これ / サーバルちゃん / と / カバンちゃん / の / 別れ / ず / に / 冒険 / が / 続く / ワンチャン / ありそう / ! / 寝 / る / 前 / は / 2 / 2 / 2 / スレ / だ / った / はず / が / 帰宅して / 視聴 / して / から / 来 / た / ら / 1 / 0 / スレ / 進んで / るとか / どんだけ / 推理 / 回 / という / こと / もあって / キリン / さん / 続出 / だ / ね / ぇ / そういうの / もう / お腹いっぱい / だ / から / なぁ / 子供でも楽しめる / って言ってるし / シンプルな / ハッピー / 寄り / の / エンド / で / いい / よ / ね / 全然 / ある / と思う / フレンズ / か / 人 / か / って / のが / 作品 / の / 主張 / する / 大筋 / でしょ / 「 / 怖い / けど / 確認しよう / 」 / の / とこ / かばんちゃんが / ボスの / 頭 / に / 手 / おい / て / て / わろた / 二代目 / サーバル / ちゃん / は / 初代 / を / 見 / て / 何か / 気づいた / くさい / よ / ね / あれ / から / なぜか / 一緒に暮らそう / とか / 提案 / して / る / し / あんだけ / ヒト / の / 縄張り / 探 / そう / って / 言って / た / のに / 急に / 変 / わ / っ / た / の / は / ・・・ / ・ / 木曜 / の / お / 昼 / だ / そういえば / サーバルの / 命名 / 安直 / 過ぎ / る / だろ / 設定 / も / アプリ / から / だった / な / 自分 / 的に / は / お別れ / エンド / でも / バッドエンド / なんだ / � / 「 / だ、 / だ、 / だ、 / 誰だろ / ~ / ? / 」 / と / 「 / かばんちゃん / なんで / 知ってるの / ー! / ? / 」 / 可愛すぎ / た / ボス / かわいい / わざわざ / ミライさん / cg / を / 新規 / で / 作った / って事は / スピンオフ / 作 / る / 気 / まんま / ん / だ / な / あに / てれ / 限定 / 配信 / が / ミライさんの / けもの / フレンズ / な / 可能性 / が / 高 / く / な / っ / た / ed / って / iq / 上げて / 聞く / と / なんか / 意味深 / で / ずっと / 再生 / し / ちゃ / う / ダーウィンが来た / ! / の / 比較 / 版 / は / すでに / 出 / て / た / な / … / 30分 / 仕様 / で / いつ / 消え / る / か / 物語 / の / 中 / に / おいて / 言葉 / の / 定義 / が / 正確な / 意味で / 使われ / て / いる / という保証はない / 必要以上に / そ / の / 部分 / に / 拘 / る / の / は / いわゆる / ア / ス / ペ / ル / ガ / ー / 的 / な / 発想 / だ / よ / 「 / 自分が / セリルアン / だ / っ / た / ら / … / あっ / … / は / っ / 、 / あ / 、 / あの / … / 」 / が / 怖い / ンゴ / オオオオオオ / か / ぱん / ちゃん / が / ただ / の / ミライさん / の同僚 / だった / ら / 面白い / みんな / ずっ / こけ / る / わ / こ / の頃に戻りたい / … / … / ジャングル / だ / の / こうざん / だの / が一番 / 楽しかった / 生物 / 感 / で / 揉めた / り / 、 / 宗教観 / で / 揉めた / り / 、 / 物質 / の / 定義 / で / 揉めた / り / 、 / 忙しい / アニメ / だ / よ / な / アニメ / けもフレ / が / 豆腐 / だ / と / すれば / 大 / 元 / の / けもの / フレンズ / プロジェクト / は / そ / の / 上 / 醤油 / に / も / 味噌 / に / も / なる / 大豆 / 日本 / 文化 / の / 新たな / 中 / 核 / 要素 / が / 産まれ / た / の / かもしれん / あっさり / バラす / かばんちゃん / の / 淡白 / さ / 好き / ちなみに / ダーウィン / の / サーバル / 回 / の / あらすじ / は / こんな / 感じ / だった / そう / で / ところ / で / ロッジ / の / 宿泊 / 費 / は / ? / の / けもの / フレンズ / プロジェクト / 今 / 夜 / 7 / 時 / から / の / 生き物 / にサンキュー / は / 猫 / & / フクロウ / 特集 / らしい / 。 / サーバル / は / わからん / けど / カラカル / は / 出 / る / も / よう / オオカミ / が / 漫画 / 描いて / た / けど / そもそも / フレンズ / は / 文字が / 読め / ない / から / 読者 / が / いない / ん / じゃ / ありがと / ~ / おいこら / h / が / 出 / て / 書け / ない / … / 最終回 / に / かばんちゃん / の / 帽子 / を / 被る / サーバル / ちゃん / 今 / 話題 / の / ミライさん / の / シルエット / 見 / た / とき / 一瞬 / かばんちゃん / か / と思った / 放映 / 版 / も何も / そこ / は / 原作 / に / も / ある / ん / だ / けど / 原作 / を / これ / で / いう / と / 「 / ジャパリ / パーク / の / 外 / に / 行け / ば / ヒト / が / 居 / る / って / 聞いて / た / けど / 居心地 / のいい / ここに / 居 / た / い / から / やめ / る / 」 / と / 島 / で / ずっと / キャッキャ / ウフフ / 生活 / する / こと / に決める / 主人公 / が / 冒険 / 心 / を / 捨て / る / エピソード / アニメ版 / は / … / はかせ / が / カバン / の / 聞い / て / いない / ところ / で / 助手 / に / 「 / カバン / は / パーク / 存 / 続 / の / ため / 外部 / へ / 捧げ / る / イケニ / エな / のです。 / ヒト / のフレンズ / は / その / ため / に / 存在 / する / のです / 」 / とか / 言い / 出 / し / て / カバンちゃん / が / 「 / 島の外に / 出 / た / ら / 人間 / に / 襲撃 / され / た / ! / 」 / って / 実際 / に / は / 全く / 起こ / って / いない / 妄想 / を / マジ / トーンで / 語 / り / ながら / 島 / に / 逃げ / 帰 / って / キャッキャ / ウフフ / 。 / 観音 / が / 「 / 一 / 視聴者 / として言わせてもらうと / 、 / はかせ / ひどい / … / 」って / ブログ / に / 書く / 感じ / これ / は / 見てみたい / サーバルちゃん / 、 / 質問 / いい / かな / … / … / 食堂 / に / あった / ジャパリまん / 、 / どこ / 行った / ? / あれ / は / 自分が / 巡回 / し / た / ところ / に / オバケ / が出 / る / こと / に / 気づいた / だけ / やろ / そう / にちがいな / い / し / そう / で / あって / なくて / は / 困る / 汚染 / され / 人 / が / 住めなくなった / パーク / 汚染 / 物質 / を浄化する / セルリアン / 人が戻ってくる / まで / 、 / ある程度 / 汚染 / 物質 / に / 耐性 / を / 持つ / パーク / の / 新たな / 住人 / フレンズ / 映画化 / すれば / 国民的 / 大ヒット / なり / そう / 角川 / じゃ / なく / 徳間と日テレ / で / 頼む / ベルセルク / って / 漫画 / 読んで / み / 。 / 後半 / ほとんど / 字 / が / 無い / から / あと / 1週間 / も / 待 / た / なければ / いけ / ない / のか / と思うと / つら / い / わ / こんな / 気持ち / 久しぶり / かばんちゃん / は / ラッキービースト / 拡張 / パーツ / 鞄 / に / ラッキービースト / を / セット / する / こと / に / より / ラッキービースト / の / 移動 / による / 消耗を抑える / ことができる / ス / グレ / モノ /

ビタビアルゴリズムでは総和を取る処理がないため最初からlogを用いて計算できるので、アンダーフローの心配はいりません。

おわりに

logとexpを多用するので重い処理になっています。

もっと効率の良い方法があるかもしれません。