北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(2)

 

面的DocIndex程序输入一个Tianwang.raw.*****文件,会产生一下三个文件 Doc.idx, Url.idx, DocId2Url.idx,我们这里对DocSegment程序进行分析。

这里输入 Tianwang.raw.*****,Doc.idx,Url.idx.sort_uniq等三个文件,输出一个Tianwang.raw.***.seg 分词完毕的文件

  1. int main(int argc, char* argv[])
  2. {
  3.     string strLine, strFileName=argv[1];
  4.     CUrl iUrl;
  5.     vector<CUrl> vecCUrl;
  6.     CDocument iDocument;
  7.     vector<CDocument> vecCDocument;
  8.     unsigned int docId = 0;
  9.     //ifstream ifs("Tianwang.raw.2559638448");
  10.     ifstream ifs(strFileName.c_str());  //DocSegment Tianwang.raw.****
  11.     if (!ifs) 
  12.     {
  13.         cerr << "Cannot open tianwang.img.info for input/n";
  14.         return -1;
  15.     }
  16.     ifstream ifsUrl("Url.idx.sort_uniq");   //排序并消重后的url字典
  17.     if (!ifsUrl) 
  18.     {
  19.         cerr << "Cannot open Url.idx.sort_uniq for input/n";
  20.         return -1;
  21.     }
  22.     ifstream ifsDoc("Doc.idx"); //字典文件
  23.     if (!ifsDoc) 
  24.     {
  25.         cerr << "Cannot open Doc.idx for input/n";
  26.         return -1;
  27.     }
  28.     while (getline(ifsUrl,strLine)) //偏离url字典存入一个向量内存中
  29.     {
  30.         char chksum[33];
  31.         int  docid;
  32.         memset(chksum, 0, 33);
  33.         sscanf( strLine.c_str(), "%s%d", chksum, &docid );
  34.         iUrl.m_sChecksum = chksum;
  35.         iUrl.m_nDocId = docid;
  36.         vecCUrl.push_back(iUrl);
  37.     }
  38.     while (getline(ifsDoc,strLine))     //偏离字典文件将其放入一个向量内存中
  39.     {
  40.         int docid,pos,length;
  41.         char chksum[33];
  42.         memset(chksum, 0, 33);
  43.         sscanf( strLine.c_str(), "%d%d%d%s", &docid, &pos, &length,chksum );
  44.         iDocument.m_nDocId = docid;
  45.         iDocument.m_nPos = pos;
  46.         iDocument.m_nLength = length;
  47.         iDocument.m_sChecksum = chksum;
  48.         vecCDocument.push_back(iDocument);
  49.     }
  50.     strFileName += ".seg";
  51.     ofstream fout(strFileName.c_str(), ios::in|ios::out|ios::trunc|ios::binary);    //设置完成分词后的数据输出文件
  52.     for ( docId=0; docId<MAX_DOC_ID; docId++ )
  53.     {
  54.         // find document according to docId
  55.         int length = vecCDocument[docId+1].m_nPos - vecCDocument[docId].m_nPos -1;
  56.         char *pContent = new char[length+1];
  57.         memset(pContent, 0, length+1);
  58.         ifs.seekg(vecCDocument[docId].m_nPos);
  59.         ifs.read(pContent, length);
  60.         char *s;
  61.         s = pContent;
  62.         // skip Head
  63.         int bytesRead = 0,newlines = 0;
  64.         while (newlines != 2 && bytesRead != HEADER_BUF_SIZE-1) 
  65.         {
  66.             if (*s == '/n')
  67.                 newlines++;
  68.             else
  69.                 newlines = 0;
  70.             s++;
  71.             bytesRead++;
  72.         }
  73.         if (bytesRead == HEADER_BUF_SIZE-1) continue;
  74.         // skip header
  75.         bytesRead = 0,newlines = 0;
  76.         while (newlines != 2 && bytesRead != HEADER_BUF_SIZE-1) 
  77.         {
  78.             if (*s == '/n')
  79.                 newlines++;
  80.             else
  81.                 newlines = 0;
  82.             s++;
  83.             bytesRead++;
  84.         }
  85.         if (bytesRead == HEADER_BUF_SIZE-1) continue;
  86.         //iDocument.m_sBody = s;
  87.         iDocument.RemoveTags(s);    //去除<>
  88.         iDocument.m_sBodyNoTags = s;
  89.         delete[] pContent;
  90.         string strLine = iDocument.m_sBodyNoTags;
  91.         CStrFun::ReplaceStr(strLine, " "" ");
  92.         CStrFun::EmptyStr(strLine); // set " /t/r/n" to " "
  93.         // segment the document 具体分词处理
  94.         CHzSeg iHzSeg;
  95.         strLine = iHzSeg.SegmentSentenceMM(iDict,strLine);
  96.         fout << docId << endl << strLine;
  97.         fout << endl;
  98.         
  99.     }
  100.     return(0);
  101. }

这里只是浮光掠影式的过一遍大概的代码,后面我会有专题详细讲解 parse html 和 segment docment 等技术

 

你可能感兴趣的:(北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(2))