【地味ベイズ】実戦地味ベイズ_コード実装_データとインタフェース

3065 ワード

次に,コード実装を行う.
【サンプル形式】
まず,素朴ベイズモデルを訓練するための入力サンプルのフォーマットを定義する.次のフォーマットを定義します.
1:9242 13626 28005 41622 41623 34625 36848 5342 51265  0:16712 49100 2933 65827 6200  1:53396 3675 43979 25739  0:17347 61515 53679 59426  1:32712 39134 63265 65430 
各行はサンプルです.行の先頭には、このサンプルが属するカテゴリのインデックスがあり、カテゴリインデックスは0から始まります.カテゴリがラベルとして存在する場合、カテゴリラベルとカテゴリインデックスとの関連付けを確立できます.これは他のプログラムで作るので、簡単です.カテゴリインデックスは、後の入力フィーチャーとコロン(":")で区切られます.後ろには特徴語のインデックスがあります.同様に,特徴語列とインデックスとのマッピング関係も確立できる.インデックスを使用するメリットは、1.分類器アルゴリズムをより汎用化する.2.整数処理は文字列より効率的です.
【データ構造】
次に、データ構造を定義します.「実戦素朴ベイズ−基本原理」では,モデルのパラメータ空間を解析した.次に、データ構造コードを直接示します.
//   ,                 。  ,         1
struct FeaProbNode
	{
		int iFeadId;
		double dProb;
	};
//   ,      、       、                
struct ClassFeaNode
	{
		int iClassId;
		double dClassProb;	// the prior probability of a class
		vector<FeaProbNode> FeaVec;
	};

//           
vector<ClassFeaNode> ClassFeaVec;

FeaProbNodeの内容について,特徴を直接彼の後験確率と結びつけた.では,前述したように,特徴は異なる値をとることができ,各特徴の値を取るには,対応するカテゴリにおいて,後験確率がある.私たちのテキスト分類タスクでは、特徴は通常語、語の値であり、私たちの前文で述べたように、2つあり、それぞれ1と0であり、この語が現れたかどうかに対応しています.上のFeaProbNodeに格納されている確率は、語取値が1の確率です.値が0の確率については,確率正規化条件により計算できる.
【関数インタフェース】
関数インタフェースは簡単で、モデルトレーニング、モデル予測、モデルシーケンス化(アクセス)に対応しています.以下のようにします.
// The format of input samples:
//		ClassLabelIndex segmenter(not whitespace) ItemOneIndex whitespace ItemTwoIndex......
//	iClassNum: the number of class label index, [0, iClassNum-1]
//	iFeaTypeNum: the number of feature type index, [0, iFeaTypeNum-1]
//	sSegmenter: the segmenter between Class label index and Item index
//	iFeaExtractNum: the number of features which is going to extract
//	sFileModel: the output model into txt file
//	bCompactModel: whether to show some infor for debug, true for not include those infor
// 
// The format of compact model parameters 
//	1. the number of class
//	2. the prior probability of class
//	3. the conditional probability of p(item|class)
bool Train (const char * sFileSample, int iClassNum, int iFeaTypeNum, 
	string & sSegmenter, int iFeaExtractNum, const char * sFileModel, bool bCompactModel = true);

// Load the naive bayes model
bool LoadNaiveBayesModel (const char * sFileModel);

// predict according to the input features
bool PredictByInputFeas (vector<int> & FeaIdVec, int & iClassId);

// predict by input test corpus whose format is the same with the training corpus
bool PredictFrmTstCorpus (const char * sFileTestCorpus, string & sSegmenter, const char * sFileOutput);

Train関数はパラメータが多いです.まず、入力サンプルのテキストファイルがあり、フォーマットは上記で説明した.そして、サンプルカテゴリ数(ClassFeaVecの大きさが決定される)と特徴カテゴリ数(通常はワードテーブルの大きさ)である.次に、サンプルとフィーチャーの間の区切り記号であり、私たちの例では「:」;次に、私たちが最終的にモデルの中でどれだけの特徴を選択するかを指定します.このプログラムでは、特徴選択とパラメータ訓練を一緒に置いています.メリットはサンプルを1回だけスキャンすることで、効率が高く、悪いところはコードのカップリング性が強すぎて、拡張しにくいことです.最後に、出力されたモデルファイル、bCompactModelはフラグで、モデルをデバッグするために追加の情報を出力するかどうか、デフォルトはオフです.
実はこれらの内容はすべて1つの類NaiveBayesの中に入っていて、叙述の便利さのために、分解して話しました.次は、トレーニングの過程を話します.