文本分类四

下面是使用KNN算法来做的。数据均是由前面的程序生成的。

做完这个之后,就是将每一步整合起来。然后再尽可能的优化,使得程序效率更好。

然后可以尝试不同的特征选择算法和分类算法,当然最后要是能有自己的一些小小改进就好了。

不过至少有了一个还可以的结果了。。。

代码如下(这4篇的代码都很乱,以后慢慢整理~~):

#include<iostream>
#include<cmath>
#include<fstream>
#include<map>
#include<utility>
#include<vector>
using namespace std;
typedef std::map<string, vector<double> > STRING2VECTOR;
#define LEN 1000
#define M 100
double y[LEN],x;
vector<double> tmpX;
vector<pair<int,double> > knn;
int myKNN[8];
int artNum[9];
double trainSet[3905][1000];
bool cmp(const pair<int,double> & m1, const pair<int,double> & m2) 
{
        return m1.second > m2.second;
}
/*
516 447 471 492 491 488 500 498
*/
int main()
{
    ifstream iFile1("E:\\TC\\code\\KNN\\VSM.txt");
    ifstream iFile2("E:\\TC\\code\\KNN\\VSMtest.txt");
    string trainTerm,testTerm;
    map<string,double> result;
    double ans,val,r1,r2;
    int b = 0;
    int cnt = 0;
    while(iFile1>>trainTerm)
    {
       for(int i = 0; i < LEN; i++)
       {
               iFile1>>trainSet[cnt][i];
       }
       cnt++;
    }
    cout<<"***"<<endl;
    while(iFile2>>testTerm)
    {
        b++;
        memset(myKNN,0,sizeof(myKNN));
        for(int i = 0; i < LEN; i++)
             iFile2>>y[i];
      
        for(int k = 0; k < 3903; k++)
        {
             ans = 0;
             val = 0;
             r1 = 0; r2 = 0;
             for(int i = 0; i < LEN; i++)
             {
                     val += trainSet[k][i] * y[i];
                     r1 += trainSet[k][i] * trainSet[k][i];
                     r2 += y[i] * y[i];
             }
             ans = val/(sqrt(r1)*sqrt(r2));
             knn.push_back(make_pair(k,ans)); 
        }
        //cout<<testTerm<<knn.size()<<endl;  
        stable_sort(knn.begin(),knn.end(),cmp);
        
        for(int i = 0; i < M; i++)
        {
                //cout<<knn[i].first<<knn[i].second<<endl;
                int w = knn[i].first;
                if(w >= 0 && w < 516)
                        myKNN[0]++;
                else if(w >= 516 && w < 963)                    
                        myKNN[1]++;
                else if(w >= 963 && w < 1434) 
                        myKNN[2]++;
                else if(w >= 1434 && w < 1926) 
                        myKNN[3]++;
                else if(w >= 1926 && w < 2417) 
                        myKNN[4]++;
                else if(w >= 2417 && w < 2905) 
                        myKNN[5]++;
                else if(w >= 2905 && w < 3405) 
                        myKNN[6]++;
                else
                        myKNN[7]++;
        }
        
        int flag = 0;
        int tmp = 0;
        for(int i = 0; i < 8; i++)
        {
                //cout<<myKNN[i]<<" ";
                if(myKNN[i] > tmp)
                {
                            tmp = myKNN[i];
                            flag = i;
                }
        }
        //cout<<endl;
        if(b >= 0 && b < 413 && flag == 0)
             artNum[0]++;
        else if (b >= 413 && b < 762 && flag == 1)
             artNum[1]++;
        else if (b >= 762 && b < 1124 && flag == 2)
             artNum[2]++;
        else if (b >= 1124 && b < 1515 && flag == 3)
             artNum[3]++;
        else if (b >= 1515 && b < 1917 && flag == 4)
             artNum[4]++;
        else if (b >= 1917 && b < 2316 && flag == 5)
             artNum[5]++;
        else if (b >= 2316 && b < 2716 && flag == 6)
             artNum[6]++;
        else if(b >= 2716 && b < 3117 && flag == 7)
             artNum[7]++;
        else
            artNum[8]++;
        knn.clear();
       //break;
    }
    for(int i = 0; i <= 8; i++)// 413 349 362 391 402 399 400 401
    cout<<"属于该类别文章数:"<<artNum[i]<<endl;
    system("pause");
    return 0;
}

最后结果有点出乎意料:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值