言語モデルで(ryを解く

以前、(ryを分析したけど、そのときに気になっていた言語モデルで(ryが推定できるかを少し試してみた。
(ry - skozawa's blog
結果としては思っていたよりできなかった。

問題設定

基本的には穴埋め問題で、

  • まぁ、冗談はさておき作ったら報告よr(ry

の場合、

  • まぁ、冗談はさておき作ったら報告よ()

の()を埋める問題。

普通の穴埋め問題と異なるのは、以下の2点

  • 埋める単位が一定でない
    • 文字、単語、文節など、さまざまな可能性がある
  • ヒントがある
    • 上の例の場合、よr(ryとなっており、(ryにはら行から始まる文字列が入ることがわかる

アプローチ

nグラム言語モデルを使って穴埋め問題を解く。
「冗談はさておき作ったら報告よ」の次に現れやすい文字列/単語列を言語モデルを使って取得する

言語モデルの作成

2014年1月~3月のツイートの中から(ryを除くツイートを使って言語モデルを作る。
MeCab+ipadicで形態素解析し、言語モデルの作成にはkenlmを使った。
N=5で作成し、できたarpaファイルは44Gあった。でかい...

(ryの推定

言語モデルを使って(ryを推定する。

  1. (ryを含む文を入力
    • ex.) まぁ、冗談はさておき作ったら報告よr(ry
  2. 形態素解析
    • ex.) まぁ/、/冗談/は/さておき/作っ/たら/報告/よ/r(ry
  3. (ry (=w_{i})より左の2~5形態素(w_{i-5}, w_{i-4}, w_{i-3}, w_{i-2})を取得
    • w_{i-1} は (ry の単語の一部の可能性があるため、利用せずに推定する
    • ex.) [ w_{i-5}, w_{i-4}, w_{i-3}, w_{i-2} ] = [さておき, 作っ, たら, 報告]
  4. 言語モデルを使ってw_{i-1} を求める
    • w_{i-5}, w_{i-4}, w_{i-3}, w_{i-2}で始まる5gram探す、なければ、w_{i-4}, w_{i-3}, w_{i-2}で始まる4gramを探す、...
    • 言語モデルで推定した単語のうち、先頭がw_{i-1}(よ)で始まる最も高い確率の単語を取得
  5. 言語モデルを使ってw_{i} 移行を4と同様に求める

実験

2014年1月~3月のツイートの中から(ryを含むツイートをランダムで100ツイート抽出して、手法を適用してみた。

正しく解けたのは、100ツイート中34ツイート。
比較的簡単なものはちゃんとできているという印象

  • とりあえず二日酔いで気持ちわ(ry...
    • -> とりあえず二日酔いで気持ちわるい...
  • レヴナンツトールだと何度言(ry
    • -> レヴナンツトールだと何度言えば
  • そうなんですよね。先日Twitterで見かけて知りました。JRのEG-20はやはり画面の位置が(ryですね(笑)
    • -> そうなんですよね。先日Twitterで見かけて知りました。JRのEG-20はやはり画面の位置がおかしいですね(笑)


解けなかったものはコンテキストを考慮しないといけないもの知識が必要なものがあって、そもそも自分でも何が入るかわからないものも結構あった。

  • ところで赤坂って(ry
  • ゲスト参加で(ry
  • 水に濡れる夢を見ると(ry

おしい感じのものもいくつかあった。3つめの形態素解析がうまくいかなかったので、おかしくなった。

  • そなのかって初七日に似t(ry
    • -> そなのかって初七日に似た
  • その時は私も念力送りつつ今どの辺ですかと聞(ry
    • -> その時は私も念力送りつつ今どの辺ですかと聞かれている
  • 何を放送するか、放送しないかはオレたちの勝手だ(ドヤァ)ですねわか(ry
    • -> 何を放送するか、放送しないかはオレたちの勝手だ(ドヤァ)ですねわかかりました


あと、言語モデルで解くよりも、文中の表現を利用したほうがよいものもあって、以下の例だと、言語モデルで解くと「証明」になってしまったけど、実際には「書け」と文中に出てきているので、そういうものも考慮しないといけないみたい。

  • 表彰のやつが、流行語が流行る理由について認知科学的に...で、プロダクションシステムは身近なものを挙げて書けで、食は身の回りのものからなんか挙げて認知科学的に(ryじゃなかったかしら

まとめ

(ryを言語モデルで解いてみた。5、6割解けるだろうと思ってたけど、思ってたより難しかった。
手法はまだ雑なので、もう少し解けそうだけど、そもそも自分でも分からないものが結構あった。
あと、単語Ngram使ったけど、形態素解析失敗することを考えると、文字Ngramのほうが良かったのかもしれない。