⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 informationretrieval.cpp

📁 ti-idf算法
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
struct Ttree
 {
  char data[20];
  double weight;
  double num;  //一篇文献中的某一索引词出现的次数
  double max; //一篇文献的总字数
  double n;  //索引词出现在几个文档中
  struct Ttree *lchild;   //左儿子
  struct Ttree *rchild;   //右儿子
  };
  struct Ttree *rootW=NULL;
double MF=6;
 FILE *fp=fopen("D:\\mm.txt","w");
Ttree *createTtree(Ttree *root,FILE *fp){
  int i=0,t=0;
  struct Ttree *p,*q;  //定义中间指针变量
  char ch;
  p=(Ttree*)malloc(sizeof(Ttree));  //申请新的存储空间
  p->data[0]='\0';
  if(fp==NULL)
    {
    printf("\nCannot open file strike any key exit!");
     return NULL;
    }
  ch=fgetc(fp);
  while((ch!=EOF)&&(t==0))
  {    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
          if(ch<='Z') ch=ch+32;
           p->data[i]=ch;
           i++;
          }
       else{ if(p->data[0]=='\0'){ch=fgetc(fp);continue;}
           p->data[i]='\0';
           p->max++;
           p->n=1;
           p->num=1;
           i=0;
           t=1;
           p->lchild=NULL;
           p->rchild=NULL;           //初始化头节点的左右儿子为空指针
           root=p;
          }
       ch=fgetc(fp);
     }
    q=(Ttree*)malloc(sizeof(Ttree));
    q->data[0]='\0' ;
   while(ch!=EOF){
       if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        if(ch<='Z') ch=ch+32;
           q->data[i]=ch;
           i++;
           ch=fgetc(fp);}
       else {
           if(q->data[0]=='\0'){ch=fgetc(fp);continue;}
           q->data[i]='\0';
           root->max++;
           q->n=1;
           q->num=1;
           i=0;
           q->lchild=NULL;
           q->rchild=NULL;              //初始化头节点的左右儿子为空指针
           if(p==NULL)p=root;
           ch=fgetc(fp);
           while(p!=NULL)            //寻找待插入节点的位置
            {
              if(strcmp(q->data,p->data)<0){       //如果待插入的节点的值小于当前节点的值,
                  if(p->lchild==NULL)  // 且其左子树为空
                    {p->lchild=q;        //  则插入
                    p=NULL;}             //并置当前节点为空,退出当前的while循环
                  else
                    p=p->lchild;
               }         // 否则继续访问其左子树
              else if(strcmp(q->data,p->data)>0){                       //如果待插入的节点的值大于当前节点的值
                   if(p->rchild==NULL)     // 且其右子树为空
                    {p->rchild=q;         //  则插入
                     p=NULL;}             //并置当前节点为空,退出当前的while循环
                   else
                     p=p->rchild;
              }                      // 否则继续访问其右子树
             else {p->num++;p=NULL; }
           }  //while
           q=(Ttree*)malloc(sizeof(Ttree));
           q->data[0]='\0';
       } //else
     }//while
   return root;
}
/*二叉树查找*/
 Ttree *SearchBinTtree(Ttree *rootx,Ttree *rooty){
    if(rootx==NULL) return NULL;
    if(strcmp(rootx->data,rooty->data)==0) {rooty->n++;return rootx;}
    if(strcmp(rootx->data,rooty->data)>0) return SearchBinTtree(rootx->lchild,rooty);
    return SearchBinTtree(rootx->rchild,rooty);
    }
 /*计算在词出现在几个文档中*/
 void InMidThread(Ttree *rooty,Ttree *rootx){
    if(rooty==NULL) return;
    InMidThread(rooty->lchild,rootx); //中序遍历二叉树左子树 ;
    SearchBinTtree(rootx,rooty);
    InMidThread(rooty->rchild,rootx); //中序遍历二叉树右子树 ;
    }
 /*计算权值*/
void InThread(Ttree *root,Ttree *Mroot){
    if(root==NULL) return;
    InThread(root->lchild,Mroot); //中序遍历二叉树左子树 ;
    root->weight=(root->num/Mroot->max)*log(MF/root->n);
    InThread(root->rchild,Mroot); //中序遍历二叉树右子树 ;
    }
    
 //对权值进行排序
void weight(Ttree *root,Ttree *r,Ttree *p,Ttree *q){
    if(root==NULL) return;
    weight(root->lchild,r,p,q); //中序遍历二叉树左子树 ;
    if(r==NULL)
         {p=(Ttree*)malloc(sizeof(Ttree));  //申请新的存储空间
          p->data=root->data;
          p->weight=root->weight;
          p->num=root->num;
          p->n=root->n;
          p->lchild=NULL;
          p->rchild=NULL;           //初始化头节点的左右儿子为空指针
          rootW=p;                              //指针rootW指向头节点
          r=p;}
    else{
      q=(Ttree*)malloc(sizeof(Ttree));
      q->data=root->data;
      q->weight=root->weight;
      q->num=root->num;
      q->n=root->n;
      q->lchild=NULL;
      q->rchild=NULL;       //初始化头节点的左右儿子为空指针
      if(p==NULL) p=rootW;       //如果要有新节点插入则,p重新指向根节点,因为 每次比较都要从根节点开始
      while(p!=NULL)            //寻找待插入节点的位置
       {
        if(q->weight>p->weight){       //如果待插入的节点的值小于当前节点的值,
              if(p->lchild==NULL)  // 且其左子树为空
                {p->lchild=q;        //  则插入
                 p=NULL;}             //并置当前节点为空,退出当前的while循环
              else
              p=p->lchild;}         // 否则继续访问其左子树
       else{                       //如果待插入的节点的值大于当前节点的值
           if(p->rchild==NULL)     // 且其右子树为空
             {p->rchild=q;         //  则插入
             p=NULL;}             //并置当前节点为空,退出当前的while循环
           else
             p=p->rchild;}        // 否则继续访问其右子树
         }//while
       } //else
      weight(root->rchild,r,p,q);
     }
//输出权值
 void ThreadWeight(Ttree *root){
    if(root==NULL) return;
    ThreadWeight(root->lchild); //中序遍历二叉树左子树 ;
    fprintf(fp,"%s\t%f\t%f\t%f\t\n",root->data,root->weight,root->num,root->n);
    ThreadWeight(root->rchild); //中序遍历二叉树右子树 ;
    }
void main(){
FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
Ttree *root1,*root2,*root3,*root4,*root5,*root6,*r=NULL,*p,*q;
fp1=fopen("d:\\p1.txt","r");
root1=createTtree(root1,fp1);
fclose(fp1);
fp2=fopen("d:\\p2.txt","r");
root2=createTtree(root2,fp2);
fclose(fp2);
fp3=fopen("d:\\p3.txt","r");
root3=createTtree(root3,fp3);
fclose(fp3);
fp4=fopen("d:\\p4.txt","r");
root4=createTtree(root4,fp4);
fclose(fp4);
fp5=fopen("d:\\p5.txt","r");
root5=createTtree(root5,fp5);
fclose(fp5);
fp6=fopen("d:\\p6.txt","r");
root6=createTtree(root6,fp6);
fclose(fp6);
InMidThread(root1,root2);
InMidThread(root1,root3);
InMidThread(root1,root4);
InMidThread(root1,root5);
InMidThread(root1,root6);
InMidThread(root2,root1);
InMidThread(root2,root3);
InMidThread(root2,root4);
InMidThread(root2,root5);
InMidThread(root2,root6);
InMidThread(root3,root1);
InMidThread(root3,root2);
InMidThread(root3,root4);
InMidThread(root3,root5);
InMidThread(root3,root6);
InMidThread(root4,root1);
InMidThread(root4,root2);
InMidThread(root4,root3);
InMidThread(root4,root5);
InMidThread(root4,root6);
InMidThread(root5,root1);
InMidThread(root5,root2);
InMidThread(root5,root3);
InMidThread(root5,root4);
InMidThread(root5,root6);
InMidThread(root6,root1);
InMidThread(root6,root2);
InMidThread(root6,root3);
InMidThread(root6,root4);
InMidThread(root6,root5);
fprintf(fp,"第1篇文档\n");
InThread(root1,root1);
weight(root1,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第2篇文档\n");
InThread(root2,root2);
weight(root2,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第3篇文档\n");
InThread(root3,root3);
weight(root3,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第4篇文档\n");
InThread(root4,root4);
weight(root4,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第5篇文档\n");
InThread(root5,root5);
weight(root5,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第6篇文档\n");
InThread(root6,root6);
weight(root6,r,p,q);
ThreadWeight(rootW);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -