ベイジアンフィルタの実装
ここから本格的にベイジアンフィルタの実装に入っていきます。
その前に,
リスト2 文章の分割をする関数
# -*- coding: utf-8 -*-
import math
import sys
#yahoo!形態素解析
import morphological
def getwords(doc):
words = [s.lower() for s in morphological.split(doc)]
return tuple(w for w in words)
それでは,
具体的には確率値を計算することになるため,
そして,
ナイーブベイズのアルゴリズム
ここで,
ナイーブベイズにおいてのカテゴリの推定とは,
今回は文章
前回と同じように確率の乗法定理を使って展開してみましょう。
P(cat, doc)
= P(cat|doc)P(doc)
= P(doc|cat)P(cat)
第2式と第3式を使うことで,
P(cat|doc) = P(doc|cat)P(cat) / P(doc)
カテゴリの推定では,
では,
次に P(doc|cat) ですが, 文章は分割した単語 P(wordn|cat) の確率は分割した単語があるカテゴリに属する確率 したがって, アルゴリズム全体の概要を把握したところで, まずはコンストラクタと訓練フェーズの実装について見てみましょう リスト3 訓練フェーズ
P(doc|cat) = P(word1|cat) P(word2|cat) ... P(wordn|cat)
訓練フェーズの実装
class NaiveBayes:
def __init__(self):
self.vocabularies = set() # 単語の集合
self.wordcount = {} # {category : { words : n, ...}}
self.catcount = {} # {category : n}
def wordcountup(self, word, cat):
self.wordcount.setdefault(cat, {})
self.wordcount[cat].setdefault(word, 0)
self.wordcount[cat][word] += 1
self.vocabularies.add(word)
def catcountup(self, cat):
self.catcount.setdefault(cat, 0)
self.catcount[cat] += 1
def train(self, doc, cat):
word = getwords(doc)
for w in word:
self.wordcountup(w, cat)
self.catcountup(cat)