作者:finallyliuyu(转载请注明原作者和出处)
(代码暂不发布源码下载版,以后会发布)
KNN文本分类算法又称为(k nearest neighhor)。它是一种基于事例的学习方法,也称懒惰式学习方法。
它的大概思路是:对于某个待分类的样本点,在训练集中找离它最近的k个样本点,并观察这k个样本点所属类别。看这k个样本点中,那个类别出现的次数多,则将这类别标签赋予该待分类的样本点。
通过上面的描述,可以看出KNN算法在算法实现上是很简单的,并不十分困难。 给出代码之前,先给出实验条件。
1。语料库格式:
语料库存放在MSSQLSERVER2000的数据库的表单中,表单格式如下:
(fig 1)
2。如何获得该形式的语料库?
你可以从搜狗lab下载2008年的数据,并且用我的程序对这批数据进行处理,抽取出新闻。处理程序见《菜鸟学习C++练笔之整理搜狗2008版语料库--获取分类语料库》或者去下载我上传到博客园的语料资源见《献给热衷于自然语言处理的业余爱好者的中文新闻分类语料库之二》
3。分割出训练语料库与测试语料库(训练语料库和测试语料库也是MSSQL表单,格式同fig1)。关于MSSQLSERVER的一些表复制的技巧见:《MSSQL语句备份》 下面开始给出C++代码:
建立VSM模型(考虑到效率问题对训练样本集合与测试样本集采用不同的函数建立VSM模型)
1。对训练集建立VSM模型。 *****************以下函数辅助完成聚类功能*********************************************************************8**********************/
/************************************************************************/
/* 建立文档向量模型 */
/************************************************************************/
map > Preprocess::VSMConstruction(map>> &mymap)
{
clock_t start,finish;
double totaltime;
start=clock();
int corpus_N=endIndex-beginIndex+1;
map> vsmMatrix;
vector myKeys=GetFinalKeyWords();
vector >maxTFandDF=GetfinalKeysMaxTFDF(mymap);
for(int i=beginIndex;i<=endIndex;i++)
{
vector >tempVSM;
vectortempVSM2;
for(vector::size_type j=0;j
{
//vector >::iterator findit=find_if(mymap[myKeys[j]].begin(),mymap[myKeys[j]].end(),PredTFclass(i));
double TF=(double)count_if(mymap[myKeys[j]].begin(),mymap[myKeys[j]].end(),PredTFclass(i));
TF=0.5+(double)TF/(maxTFandDF[j].first);
TF*=log((double)corpus_N/maxTFandDF[j].second);
tempVSM.push_back(make_pair(j,TF));
}
if(!tempVSM.empty())
{
tempVSM=NormalizationVSM(tempVSM);
//
for(vector >