相互情報量(mutual information)についてのメモ2

テスト結果をつらつら書いてると長くなりそうなので記事を分けた.


情報量にidf値を用いてやってみた.
単語Aが出たら単語Bも出るっていう確率は分子で行っているので,
分母はidfってゆー,対極的重み付けのスコアを使ってみる.


相互情報量 = log(
(全文書に出現した単語の総数 * 単語Aと単語Bの共起頻度)
/
(単語Aのidf値 * 単語Bのidf値)
)


発行したSQLは以下の通り.

select
  t1.id,
  t1.name,
  t2.id,
  t2.name,
  log(
    -- T1
    (
      -- 語の総数
      (select count(id) from terms as t_cnt)
      *
      -- AとBの共起回数
      (
        select
          count(term_id) as co_cnt
        from document_terms a
        join terms b
          on a.term_id = b.id
        where
          document_id in (
            select document_id from document_terms where term_id = t1.id
          ) 
          and term_id != t1.id
          and term_id = t2.id
        group by term_id
        order by co_cnt desc
        limit 1
      )
    )
    /
    -- T2
    (
      -- Aの情報量(idf)
      t1.idf
      *
      -- Bの情報量(idf)
      t2.idf
    )
  ) as mutual_information
from
  terms t1
join
  terms t2
  on t2.id != t1.id
where
  t1.id = 12198
  and
  t1.idf > 2
  and
  t2.idf > 2
-- group by
--  t1.id
having
  mutual_information is not null
order by
  mutual_information desc
limit
  30
;



試してみたら微妙な結果に!
(海女さん...)


因みによかったケース:
ACIDMAN」というバンド名を対象にテスト



共起情報の場合.
まあ割と納得.



「アーティスト」や「ライブ」という共起情報のテーブルには無かったのが出てる!!


アーティスト」「ライブ」「ACIDMAN」は一つのグループにしても納得は得られると思う.


ただ,これの欠点はノイズが多い.
非常に多い.
これを解決するにはノイズになりそうな単語を除くとか必要になりそうですね.


メモ1:
ストップワードを反映した後にまた試してみる(多分)