(注:如有转载请标明作者:finallyliuyu, 和出处:博客园)

文本分类 step by step(一)

  在《文本分类step by step(一》中,我们从处理语料库开始讲起,一直讲到利用分类器进行分类。文章末尾还随机抽取了一篇文章,给出了这篇文章的标题、正文、实际类别,分类器所分类别等信息。在此篇博客中我们将介绍分类器的评估,以及代码的一些介绍,最后给出程序和实验语料库的下载地址。

(一)分类器评估

关于查准率,查全率,F值的定义以及的代码实现见博文《评估分类器》

主函数调用如下:

 

计算准确率,召回率,F值
map<string,vector<double> >evaluation;
for(vector<string>::iterator it=labels.begin();it!=labels.end();it++)
{
    
double precision=p.getPrecision(*it,classifyResults,"TestingCorpus");
    
double recall=p.getRecall(*it,classifyResults,"TestingCorpus");
    
double F=p.getFscore(*it,classifyResults,"TestingCorpus");
    vector
<double>temp;
    temp.push_back(precision);
    temp.push_back(recall);
    temp.push_back(F);
    evaluation[
*it]=temp;
    temp.clear();
}
for(map<string,vector<double> >::iterator it=evaluation.begin();it!=evaluation.end();it++)
{
    cout
<<it->first<<endl;
    cout
<<"precison"<<(it->second)[0]<<endl;
    cout
<<"recall"<<(it->second)[1]<<endl;
    cout
<<"Fscore"<<(it->second)[2]<<endl;
    cout
<<"*************************"<<endl;
}
double avaP=0.;//平均准确率
double avaR=0.;//平均召回率
double avaF=0.;//平均F值

for(map<string,vector<double> >::iterator  it=evaluation.begin();it!=evaluation.end();it++)
{
    avaP
+=(it->second)[0];
    avaR
+=(it->second)[1];
    avaF
+=(it->second)[2];
    
}
cout
<<evaluation.size();
avaP
/=evaluation.size();
avaR
/=evaluation.size();
avaF
/=evaluation.size();
cout
<<"平均准确率为"<<avaP<<endl;
cout
<<"平均召回率"<<avaR<<endl;
cout
<<"平均F值"<<avaF<<endl;

 

实验结果:

 

 

(二)代码说明:

运行的时候,采用release模式运行,debug模式下运行速度很慢

 

1.       涉及数据库交互函数:数据库的链接字符串写死在了下列函数中,如果需要改变所链接数据库则在下列函数中修改链接字符串

 

涉及数据库交互操作的函数
int ConstructDictionary(DICTIONARY& mymap,FUNCSEG seg,string tablename);
int GetArticleIdinEachClass(vector<string > labels,string tablename,map<string,vector<int> >&articleIdinEachClass );
        vector
<string >GetClassification(string articleIds);//获得该篇文章对应的类别
string GetCategorizationInfoById(int articleId,string tablename);
int  Preprocess::GetManyVSM(int begin,int end,string tablename,DICTIONARY& mymap,DOCMATRIX& testingsetVSM,char*keywordsaddress)

 

2.       涉及硬盘存取交互函数

 

涉及硬盘IO交互操作的函数
//保存词袋子到硬盘
        void SaveDictionary(DICTIONARY& mymap,char *address);
        
//从内存中加载词袋子模型
        void LoadDictionary(DICTIONARY& mymap,char *address);
void SaveContingencyTable(CONTINGENCY& contingencyTable,char *address);
        
void LoadContingencyTable(CONTINGENCY& contingencyTable,char *address);
        
void SaveVSM(DOCMATRIX& VSMmatrix,char *dest);
        
void LoadVSM(DOCMATRIX& VSMmatrix,char *dest);
vector
<string> GetFinalKeyWords(char* address);
void ChiSquareFeatureSelection(vector<string > classLabels,DICTIONARY& mymap,CONTINGENCY& contingencyTable,int N,char * address);
oid DFcharicteristicWordSelection(DICTIONARY
& mymap,int DFthreshold,char * address);

 

 

  

3.       分词

头文件中定义了一个指向指向类的成员函数的指针,分别指向两种不同的切分模式。其中一种切分模式调用计算所的ICTCLAS;另一种切分模式以空格作为分界符进行分割,对应的函数如下:

 

vector<string>goodWordsinPieceArticle(string rawtext,set<string> stopwords);
vector
<string> mySplit(string s,set<string> stopwords);//分割关键词

 

(三)资源下载地址(资源作者:finallyliuyu,空间提供方:博客园)

 1.语料库资源 下载地址 注意:语料库为MSSQL2000备份格式,如何还原请大家自己查阅相关资料,网络上有很多这方面的知识也就不赘述了。

2. 程序资源 下载地址   程序包中目前有DF,chi-square特征词选择算法,以及KNN分类算法。如果时间允许,我会继续往程序包中添加 IG,point-wise MI特征词选择算法,以及多项式贝叶斯分类器。另外再次声明我是一个C++新手,编程有很多不规范的地方,希望不要误人子弟。另外,如果有高手愿意指教我会非常高兴。 目前程序是控制台程序,如果有人愿意用MFC编写演示界面,那就最好不过了。呵呵。

 

 

posted on 2010-09-29 19:30  finallyly  阅读(4716)  评论(5编辑  收藏  举报