Dictionary.cpp
上传用户:jxhy0791
上传日期:2007-05-24
资源大小:6173k
文件大小:4k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //#include "stdafx.h"
  2. #include "Dictionary.h"
  3. #include "Utility.h"
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <malloc.h>
  7. #include <stdio.h>
  8. #define CC_NUM  6768
  9. //The number of Chinese Char,including 5 empty position between 3756-3761
  10. #define WORD_MAXLENGTH 100
  11.  
  12. void main()
  13. {
  14.  struct tagWordResult{
  15. char sWord[WORD_MAXLENGTH];
  16. //The word 
  17. int nHandle;
  18. //the POS of the word
  19. double  dValue;
  20. //The -log(frequency/MAX)
  21. };
  22. typedef struct tagWordResult WORD_RESULT,*PWORD_RESULT;
  23. /*data structure for word item*/
  24. struct tagWordItem{
  25. int nWordLen;
  26. char *sWord;
  27. //The word 
  28. int nHandle;
  29. //the process or information handle of the word
  30. int  nFrequency;
  31. //The count which it appear
  32. };
  33. typedef struct tagWordItem WORD_ITEM,*PWORD_ITEM;
  34. /*data structure for dictionary index table item*/
  35. struct tagIndexTable{
  36.     int nCount;
  37. //The count number of words which initial letter is sInit
  38.     PWORD_ITEM pWordItemHead;
  39. //The  head of word items
  40. };
  41. typedef struct tagIndexTable INDEX_TABLE;
  42. /*data structure for word item chain*/
  43. struct tagWordChain{
  44.        WORD_ITEM data;
  45.        struct tagWordChain *next;
  46. };
  47. typedef struct tagWordChain WORD_CHAIN,*PWORD_CHAIN;
  48. /*data structure for dictionary index table item*/
  49. struct tagModifyTable{
  50.     int nCount;
  51. //The count number of words which initial letter is sInit
  52. int nDelete;
  53.     //The number of deleted items in the index table
  54. PWORD_CHAIN pWordItemHead;
  55. //The  head of word items
  56. };
  57. typedef struct tagModifyTable MODIFY_TABLE,*PMODIFY_TABLE;
  58. INDEX_TABLE   m_IndexTable[CC_NUM];
  59. //    PMODIFY_TABLE m_pModifyTable;
  60. FILE *fp;
  61.    int i,j,nBuffer[3];
  62.    if((fp=fopen("coreDict.dct","rb"))==NULL)
  63.    printf("kkkkkkkkk"); //fail while opening the file
  64.  memset(m_IndexTable,0,sizeof(m_IndexTable));
  65.  
  66.   printf("装入内存"); 
  67.    for(i=0;i<CC_NUM;i++)
  68.    {
  69.    fread(&(m_IndexTable[i].nCount),sizeof(int),1,fp);
  70.        if(m_IndexTable[i].nCount>0)
  71.      m_IndexTable[i].pWordItemHead=new WORD_ITEM[m_IndexTable[i].nCount];
  72.    else 
  73.    {
  74.    m_IndexTable[i].pWordItemHead=0;
  75.    continue;
  76.    }
  77.        j=0;
  78.    while(j<m_IndexTable[i].nCount)
  79.    {
  80.          fread(nBuffer,sizeof(int),3,fp);
  81.          m_IndexTable[i].pWordItemHead[j].sWord=new char[nBuffer[1]+1];
  82.     if(nBuffer[1])//String length is more than 0
  83.  {
  84.  fread(m_IndexTable[i].pWordItemHead[j].sWord,sizeof(char),nBuffer[1],fp);
  85.  }
  86.  m_IndexTable[i].pWordItemHead[j].sWord[nBuffer[1]]=0;
  87.       
  88.               m_IndexTable[i].pWordItemHead[j].nFrequency=nBuffer[0];
  89.  m_IndexTable[i].pWordItemHead[j].nWordLen=nBuffer[1];
  90.  m_IndexTable[i].pWordItemHead[j].nHandle=nBuffer[2];
  91.    j+=1;//Get next item in the original table.
  92.    }
  93.    }
  94.    fclose(fp);
  95.   printf("装入完毕"); 
  96.    FILE *fp1;
  97.    int a,b,bBuffer[3];
  98. //   PWORD_CHAIN pCur;
  99.   //strcat(sFilename,".sav");
  100.    if((fp1=fopen("coreDict.txt","wt"))==NULL)
  101.    printf("bbbb"); //fail while opening the file
  102.    
  103.    
  104.    printf("准备输出...."); 
  105.    
  106.    for(a=0;a<CC_NUM;a++)
  107.    {char c1,c2,c3,c4;
  108.    c1=a/94+176;
  109.    c2=a%94+161;
  110.   
  111.  //  fwrite(&m_IndexTable[a].nCount,sizeof(int),1,fp1);
  112.   fprintf(fp1,"%dn",m_IndexTable[a].nCount);
  113.    //write to the file
  114.            b=0;  
  115.    while(b<m_IndexTable[a].nCount)
  116.    {
  117.  bBuffer[0]=m_IndexTable[a].pWordItemHead[b].nFrequency;
  118.      bBuffer[1]=m_IndexTable[a].pWordItemHead[b].nWordLen;
  119.  bBuffer[2]=m_IndexTable[a].pWordItemHead[b].nHandle;
  120.              c3=bBuffer[2]/256;
  121.  c4=bBuffer[2]%256;
  122. //            c3=bBuffer[2];
  123. // c4=bBuffer[2]%256; 
  124.             // fwrite(bBuffer,sizeof(int),3,fp1);
  125.  fprintf(fp1,"%dt%dt%dt",bBuffer[0],bBuffer[1],bBuffer[2]/*,c3,c4*/);
  126.  //fprintf(fp1,"词频为:%dt词长为:%dt词标注为:%c%ct",bBuffer[0],bBuffer[1],c3,c4);
  127. //  if(bBuffer[1])//String length is more than 0
  128.    // fwrite(m_IndexTable[a].pWordItemHead[b].sWord,sizeof(char),bBuffer[1],fp1);
  129.  fprintf(fp1,"t%c%c%sn",c1,c2,m_IndexTable[a].pWordItemHead[b].sWord);
  130.   b+=1;//Get next item in the original table.
  131.    }
  132.     
  133.    }
  134.    fclose(fp1);
  135.   
  136. }