読者です 読者をやめる 読者になる 読者になる

naoya_t@hatenablog

いわゆるチラシノウラであります

ナイーブベイズ分類器の実装とか 〜畑さん/こだまさん問題〜

Python 自然言語処理 声優統計

スパム判定などでお馴染みのナイーブベイズ分類器
構造が比較的単純なのに割といい感じに分類できるので重宝がられています。

ナイーブベイズ分類器で用いる文書モデルとして、「言語処理のための機械学習入門」(奥村学 著)では

  • 多変数ベルヌーイモデル (multivariate Bernoulli model)
  • 多項モデル (multinomial model)

がそれぞれ最尤(ML*1)推定、最大事後確率(MAP*2)推定の場合について説明されていて、まあ例題を追っていけば高校生でも文系の子でもわかる感じ*3なんだけど、そういえばちゃんと自分で書いたことなかったなあと思って、寒いのにソイあずき抹茶フラペチーノをすすりながらやってみたのでした。
f:id:n4_t:20120116132500j:image:medium

# -*- coding: utf-8 -*-
from math import log

#
# 多変数ベルヌーイモデル multivariate Bernoulli model
#
def mBm_MLestimate(D, classes):
  V = set()
  N_c = [0 for c in classes]
  N_cw = [dict() for c in classes]

  for (words,c) in D:
    N_c[c] += 1
    wordset = set()
    for w in words:
      wordset.add(w)
      V.add(w)
    for w in wordset:
      N_cw[c][w] = N_cw[c].get(w,0) + 1

  N = sum(N_c)
  p_c = [0 for c in classes]
  p_cw = [dict() for c in classes]
  for c in classes:
    p_c[c] = 1.0 * N_c[c] / N
    for w in V:
      p_cw[c][w] = 1.0 * N_cw[c].get(w,0) / N_c[c]

  return (V, p_c, p_cw)


def mBm_MAPestimate(D, classes):
  V = set()
  N_c = [0 for c in classes]
  N_cw = [dict() for c in classes]

  for (words,c) in D:
    N_c[c] += 1
    wordset = set()
    for w in words:
      wordset.add(w)
      V.add(w)
    for w in wordset:
      N_cw[c][w] = N_cw[c].get(w,0) + 1

  N = sum(N_c)
  Nclasses = len(classes)
  p_c = [0 for c in classes]
  p_cw = [dict() for c in classes]
  for c in classes:
    p_c[c] = 1.0 * (N_c[c] + 1) / (N + Nclasses)
    for w in V:
      p_cw[c][w] = 1.0 * (N_cw[c].get(w,0) + 1) / (N_c[c] + Nclasses);

  return (V, p_c, p_cw)


def mBm_make_classifier(V, classes, p_c, p_cw):
  def prod(ar):
    return reduce(lambda x,y:x*y, ar)
  def argmax(ar):
    maxval = ar[0]
    arg = 0
    for i in xrange(len(ar)):
      if ar[i] > maxval:
        arg = i
        maxval = ar[i]
    return arg
  def classify(words):
    wordset = set(words)
#    p_given_c = [p_c[c] * prod([p_cw[c][w] if (w in wordset) else (1.0-p_cw[c][w]) for w in V])
    p_given_c = [log(p_c[c]) + sum([log(p_cw[c][w]) if (w in wordset) else log(1.0-p_cw[c][w]) for w in V])
                 for c in classes]
    # ↑アンダーフロー防止のため log() 推奨
    return argmax(p_given_c)
  return classify

#
# 多項モデル multinomial model
#
def mm_MLestimate(D, classes):
  V = set()
  N_c = [0 for c in classes]
  N_c_sum = [0 for c in classes]
  N_cw = [dict() for c in classes]

  for (words,c) in D:
    N_c[c] += 1
    for w in words:
      V.add(w)
      N_c_sum[c] += 1
      N_cw[c][w] = N_cw[c].get(w,0) + 1

  N = sum(N_c)
  p_c = [0 for c in classes]
  q_cw = [dict() for c in classes]
  for c in classes:
    p_c[c] = 1.0 * N_c[c] / N
    for w in V:
      q_cw[c][w] = 1.0 * N_cw[c].get(w,0) / N_c_sum[c]

  return (V, p_c, q_cw)


def mm_MAPestimate(D, classes):
  V = set()
  N_c = [0 for c in classes]
  N_c_sum = [0 for c in classes]
  N_cw = [dict() for c in classes]

  for (words,c) in D:
    N_c[c] += 1
    for w in words:
      V.add(w)
      N_c_sum[c] += 1
      N_cw[c][w] = N_cw[c].get(w,0) + 1

  N = sum(N_c)
  Nclasses = len(classes)
  Nwords = len(V)
  p_c = [0 for c in classes]
  q_cw = [dict() for c in classes]

  for c in classes:
    p_c[c] = 1.0 * (N_c[c] + 1) / (N + Nclasses)
    for w in V:
      q_cw[c][w] = 1.0 * (N_cw[c].get(w,0) + 1) / (N_c_sum[c] + Nwords)

  return (V, p_c, q_cw)


def mm_make_classifier(V, classes, p_c, q_cw):
  def prod(ar):
    return reduce(lambda x,y:x*y, ar)
  def argmax(ar):
    maxval = ar[0]
    arg = 0
    for i in xrange(len(ar)):
      if ar[i] > maxval:
        arg = i
        maxval = ar[i]
    return arg
  def classify(words):
#    p_given_c = [p_c[c] * prod([q_cw[c][w] for w in words if w in q_cw[c]]) for c in classes]
    p_given_c = [log(p_c[c]) + sum([log(q_cw[c][w]) for w in words if w in q_cw[c] and q_cw[c] > 0]) for c in classes]
    # ↑アンダーフロー防止のため log() 推奨
    return argmax(p_given_c)
  return classify

さて。こんな感じの実装で

  classes = [0, 1]
  D = [(split("good bad good good"), 0),
       (split("exciting exciting"), 0),
       ...,
       (split("bad bad boring exciting), 1)]
  # パラメータ推定(ここでは多変数ベルヌーイでMAP推定)
  (V, p_c, p_cw) = naive_bayes_ja.mBm_MAPestimate(D, classes)
  classify = naive_bayes_ja.mBm_make_classifier(V, classes, p_c, p_cw)
  # 実際に分類
  d = split("good good bad boring")
  c = classify(d)

本の例題も解けちゃうわけですが、ちゃんと何かを分類して威力を実感したいなあと…

歌詞を読んで、作詞家を当ててもらおう

というわけで、思いついたのは、2人の作詞家の作品を学習して分類器に作詞者を当ててもらおうという企画。

まず教師として、D = [(歌詞全文1, 作詞家1), (歌詞全文2, 作詞家2),...] みたいなデータを個人的に用意しました。著作権の関係で、というかJASRACさん的に公開できないです...スミマセン

  • とあるアーティスト(仮にMとします)のアルバム3枚(仮にC,P,Sとします*4)から、2人の作詞家(仮にH, Kとします)の作品を抽出。公平にするために、というかP(c)をそれぞれ1/2ずつにしたいので、学習においても分類においてもH作品K作品が同数になるように抽出しています
  • アルバム1つ分のデータで学習して、他のアルバムの楽曲の歌詞の作詞家を分類
  • アルバム2つ分の   〃    、残りの 〃
  • 歌詞はローマ字や記号を省いた漢字かな混じり部分をMeCabでパースして、名詞だけ使用

とかやってみました。

# 実験コード(抜粋)
import MeCab

p = re.compile(' +')
def ja_filter(s):
  u = [ch if (0x3000 < ord(ch) and ord(ch) < 0xff00) else ' ' for ch in s.decode('utf-8')]
  return p.sub(' ', "".join(u).encode('utf-8'))

def words_in_lyrics(lyrics):
  m = MeCab.Tagger("-Ochasen")
  surfaces = []
  s_ja = ja_filter(lyrics).strip()
  if (s_ja == ""): return []
  node = m.parseToNode(s_ja)
  node = node.next # skip BOS
  while node.next:
    f = node.feature.split(",")
    if f[0] == "名詞":
      surfaces.append(node.surface)
    node = node.next
  return surfaces

## lyrics = [歌詞全文1, 歌詞全文2, ...]
## lyric_writers = [歌詞1の作詞家, 歌詞2の作詞家, ...]
classes = [0, 1]
class_for_writer = {"畑亜貴":0, "こだまさおり":1}
writer_for_class = ["畑亜貴", "こだまさおり"]

def trial(ids_training, ids_test):
  D = [(words_in_lyrics(lyrics[id]), class_for_writer[lyric_writers[id]]) for id in ids_training]
  (V, p_c, q_cw) = naive_bayes_ja.mm_MAPestimate(D, classes)
  classify = naive_bayes_ja.mm_make_classifier(V, classes, p_c, q_cw)
  right = 0
  wrong = 0
  for id in ids_test:
    d = words_in_lyrics(id)
    c = classify(d)
    c_ans = class_for_writer[lyric_writers[id]]
    if c == c_ans:
      right += 1
      ox = "◎"
    else:
      wrong += 1
      ox = "×"
    print "<%s>,作詞:%s → %sに分類" % (titles[id], writer_for_class[c_ans], writer_for_class[c]), ox
  print "正答率: %.2f%%" % (100.0 * right / (right + wrong))

結果はこんな感じ:

学習 分類 多変数ベルヌーイML 多ベルヌーイMAP 多項ML 多項MAP
C P 50.00% 87.50% 50.00% 100.00%
C S 50.00% 83.33% 50.00% 75.00%
P C 50.00% 75.00% 50.00% 100.00%
P S 50.00% 50.00% 50.00% 75.00%
S C 50.00% 62.50% 50.00% 75.00%
S P 50.00% 62.50% 50.00% 75.00%
C+P S 50.00% 75.00% 50.00% 83.33%
C+S P 50.00% 100.00% 50.00% 87.50%
P+S C 50.00% 75.00% 50.00% 100.00%
平均 50.00% 74.54% 50.00% 85.65%

ML推定だと全滅(全てをHさんに分類)ですが、MAP推定だとまあちょっと(時々かなり)当たってる感じです。素性の選び方をちゃんと考えたらもう少し伸びるのではないかと思います。

公平性確保のためテストデータをH,K同数に調整しているのですが、H,K全楽曲について試すとこんな感じ(※MAP推定のみ):

学習 分類 多変数ベルヌーイMAP同数 多ベルヌーイMAP全曲 多項MAP同数 多項MAP全曲
C P 87.50% 92.86% 100.00% 100.00%
C S 83.33% 84.62% 75.00% 69.23%
P C 75.00% 83.33% 100.00% 100.00%
P S 50.00% 53.85% 75.00% 76.92%
S C 62.50% 75.00% 75.00% 76.92%
S P 62.50% 78.57% 75.00% 85.71%
C+P S 75.00% 76.92% 83.33% 84.62%
C+S P 100.00% 100.00% 87.50% 92.86%
P+S C 75.00% 83.33% 100.00% 100.00%
平均 74.54% 80.94% 85.65% 87.36%

おまけ

多変数ベルヌーイモデル/MAP

=================
Contact -> Parade
=================
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → 畑亜貴に分類 ×
<Lush march!!>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → こだまさおりに分類 ◎
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → こだまさおりに分類 ◎
正答率: 92.86%
==============
Contact -> SAL
==============
<覚醒フィラメント>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Final Moratorium>,作詞:こだまさおり → こだまさおりに分類 ◎
<Tomorrow's chance>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<書きかけのDestiny>,作詞:こだまさおり → こだまさおりに分類 ◎
<孤独の結晶>,作詞:畑亜貴 → こだまさおりに分類 ×
<Love Medicine*>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨音のベール>,作詞:こだまさおり → こだまさおりに分類 ◎
<tea for two>,作詞:こだまさおり → こだまさおりに分類 ◎
<PRECIOUS ONE>,作詞:こだまさおり → こだまさおりに分類 ◎
<サクラピアス>,作詞:畑亜貴 → こだまさおりに分類 ×
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 84.62%
=================
Parade -> Contact
=================
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → 畑亜貴に分類 ×
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → 畑亜貴に分類 ×
<Cynthia>,作詞:こだまさおり → こだまさおりに分類 ◎
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<mezzo forte>,作詞:こだまさおり → こだまさおりに分類 ◎
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 83.33%
=============
Parade -> SAL
=============
<覚醒フィラメント>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Final Moratorium>,作詞:こだまさおり → 畑亜貴に分類 ×
<Tomorrow's chance>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<書きかけのDestiny>,作詞:こだまさおり → 畑亜貴に分類 ×
<孤独の結晶>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Love Medicine*>,作詞:こだまさおり → 畑亜貴に分類 ×
<雨音のベール>,作詞:こだまさおり → 畑亜貴に分類 ×
<tea for two>,作詞:こだまさおり → 畑亜貴に分類 ×
<PRECIOUS ONE>,作詞:こだまさおり → 畑亜貴に分類 ×
<サクラピアス>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 53.85%
==============
SAL -> Contact
==============
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → 畑亜貴に分類 ×
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → こだまさおりに分類 ◎
<Cynthia>,作詞:こだまさおり → 畑亜貴に分類 ×
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<mezzo forte>,作詞:こだまさおり → 畑亜貴に分類 ×
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 75.00%
=============
SAL -> Parade
=============
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → こだまさおりに分類 ◎
<Lush march!!>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → 畑亜貴に分類 ×
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → 畑亜貴に分類 ×
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → 畑亜貴に分類 ×
正答率: 78.57%
=======================
Contact + Parade -> SAL
=======================
<覚醒フィラメント>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Final Moratorium>,作詞:こだまさおり → こだまさおりに分類 ◎
<Tomorrow's chance>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<書きかけのDestiny>,作詞:こだまさおり → こだまさおりに分類 ◎
<孤独の結晶>,作詞:畑亜貴 → こだまさおりに分類 ×
<Love Medicine*>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨音のベール>,作詞:こだまさおり → 畑亜貴に分類 ×
<tea for two>,作詞:こだまさおり → こだまさおりに分類 ◎
<PRECIOUS ONE>,作詞:こだまさおり → 畑亜貴に分類 ×
<サクラピアス>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 76.92%
=======================
Contact + SAL -> Parade
=======================
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → こだまさおりに分類 ◎
<Lush march!!>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → こだまさおりに分類 ◎
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → こだまさおりに分類 ◎
正答率: 100.00%
=======================
Parade + SAL -> Contact
=======================
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → 畑亜貴に分類 ×
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → 畑亜貴に分類 ×
<Cynthia>,作詞:こだまさおり → こだまさおりに分類 ◎
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<mezzo forte>,作詞:こだまさおり → こだまさおりに分類 ◎
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 83.33%

多項モデル/MAP

=================
Contact -> Parade
=================
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → こだまさおりに分類 ◎
<Lush march!!>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → こだまさおりに分類 ◎
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → こだまさおりに分類 ◎
正答率: 100.00%
==============
Contact -> SAL
==============
<覚醒フィラメント>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Final Moratorium>,作詞:こだまさおり → こだまさおりに分類 ◎
<Tomorrow's chance>,作詞:畑亜貴 → こだまさおりに分類 ×
<書きかけのDestiny>,作詞:こだまさおり → こだまさおりに分類 ◎
<孤独の結晶>,作詞:畑亜貴 → こだまさおりに分類 ×
<Love Medicine*>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨音のベール>,作詞:こだまさおり → こだまさおりに分類 ◎
<tea for two>,作詞:こだまさおり → こだまさおりに分類 ◎
<PRECIOUS ONE>,作詞:こだまさおり → こだまさおりに分類 ◎
<サクラピアス>,作詞:畑亜貴 → こだまさおりに分類 ×
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → こだまさおりに分類 ×
正答率: 69.23%
=================
Parade -> Contact
=================
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → こだまさおりに分類 ◎
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → こだまさおりに分類 ◎
<Cynthia>,作詞:こだまさおり → こだまさおりに分類 ◎
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<mezzo forte>,作詞:こだまさおり → こだまさおりに分類 ◎
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Contact 13th>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 100.00%
=============
Parade -> SAL
=============
<覚醒フィラメント>,作詞:畑亜貴 → こだまさおりに分類 ×
<Final Moratorium>,作詞:こだまさおり → こだまさおりに分類 ◎
<Tomorrow's chance>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<書きかけのDestiny>,作詞:こだまさおり → こだまさおりに分類 ◎
<孤独の結晶>,作詞:畑亜貴 → こだまさおりに分類 ×
<Love Medicine*>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨音のベール>,作詞:こだまさおり → こだまさおりに分類 ◎
<tea for two>,作詞:こだまさおり → 畑亜貴に分類 ×
<PRECIOUS ONE>,作詞:こだまさおり → こだまさおりに分類 ◎
<サクラピアス>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 76.92%
==============
SAL -> Contact
==============
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → 畑亜貴に分類 ×
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → こだまさおりに分類 ◎
<Cynthia>,作詞:こだまさおり → 畑亜貴に分類 ×
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → こだまさおりに分類 ×
<mezzo forte>,作詞:こだまさおり → こだまさおりに分類 ◎
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Contact 13th>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 76.92%
=============
SAL -> Parade
=============
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → こだまさおりに分類 ◎
<Lush march!!>,作詞:畑亜貴 → こだまさおりに分類 ×
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → 畑亜貴に分類 ×
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → こだまさおりに分類 ◎
正答率: 85.71%
=======================
Contact + Parade -> SAL
=======================
<覚醒フィラメント>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Final Moratorium>,作詞:こだまさおり → こだまさおりに分類 ◎
<Tomorrow's chance>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<書きかけのDestiny>,作詞:こだまさおり → こだまさおりに分類 ◎
<孤独の結晶>,作詞:畑亜貴 → こだまさおりに分類 ×
<Love Medicine*>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨音のベール>,作詞:こだまさおり → こだまさおりに分類 ◎
<tea for two>,作詞:こだまさおり → こだまさおりに分類 ◎
<PRECIOUS ONE>,作詞:こだまさおり → こだまさおりに分類 ◎
<サクラピアス>,作詞:畑亜貴 → こだまさおりに分類 ×
<Falling heaven's now>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Flame>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Perfect energy>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 84.62%
=======================
Contact + SAL -> Parade
=======================
<透明パークにて>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Voyager train>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Prism in the name of hope>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Fairy Tune>,作詞:こだまさおり → こだまさおりに分類 ◎
<Lush march!!>,作詞:畑亜貴 → こだまさおりに分類 ×
<そのとき僕は髪飾りを買う>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Melty tale storage>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<蒼い孤島>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<光>,作詞:こだまさおり → こだまさおりに分類 ◎
<Paradise Lost>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<FUTURE STAR>,作詞:こだまさおり → こだまさおりに分類 ◎
<雨上がりの花よ咲け>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<花束>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<everlasting...>,作詞:こだまさおり → こだまさおりに分類 ◎
正答率: 92.86%
=======================
Parade + SAL -> Contact
=======================
<Contact>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<詩人の旅>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<ふたりのリフレクション>,作詞:こだまさおり → こだまさおりに分類 ◎
<純白サンクチュアリィ>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Dears〜ゆるやかな奇跡〜>,作詞:こだまさおり → こだまさおりに分類 ◎
<Cynthia>,作詞:こだまさおり → こだまさおりに分類 ◎
<sleeping terror>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<too late? not late...>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<夏を忘れたら>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<mezzo forte>,作詞:こだまさおり → こだまさおりに分類 ◎
<君がくれたあの日>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<truth gift>,作詞:畑亜貴 → 畑亜貴に分類 ◎
<Contact 13th>,作詞:畑亜貴 → 畑亜貴に分類 ◎
正答率: 100.00%

*1:Maximum Likelihood

*2:Maximum a posteriori

*3:嘘…ラグランジュの未定乗数法とか普通に使ってるし

*4:その前にもう1枚出していますがHさんKさん作詞の楽曲が含まれないので今回は割愛