分词的代码在HzSeg.cpp中。
对raw格式的网页内容 进行分割的代码在DocSegment.cpp中
前面已经建立好2个表,一个是url对应着记录号,一个是记录号对应的偏移。
现在开始对网页进行处理,实际上只用到第2张表。
遍历这张表,把一个一个的记录取出来,存到CDocument对象里,将来要用时就知道
这个记录在原始文件raw里的偏移是多少,可以跳到那个位置去读
while
(getline(ifsDoc,strLine)){
int docid,pos,length;
char chksum[ 33 ];
memset(chksum, 0 , 33 );
sscanf( strLine.c_str(), " %d%d%d%s " , & docid, & pos, & length,chksum );
iDocument.m_nDocId = docid;
iDocument.m_nPos = pos;
iDocument.m_nLength = length;
iDocument.m_sChecksum = chksum;
vecCDocument.push_back(iDocument);
}
int docid,pos,length;
char chksum[ 33 ];
memset(chksum, 0 , 33 );
sscanf( strLine.c_str(), " %d%d%d%s " , & docid, & pos, & length,chksum );
iDocument.m_nDocId = docid;
iDocument.m_nPos = pos;
iDocument.m_nLength = length;
iDocument.m_sChecksum = chksum;
vecCDocument.push_back(iDocument);
}
然后从vector里面取出每个记录号,读取一个记录的所有内容(包括头)
然后移动致实际内容开始的地方
//
skip Head
int bytesRead = 0 ,newlines = 0 ;
while (newlines != 2 && bytesRead != HEADER_BUF_SIZE - 1 ) {
if ( * s == ' ' )
newlines ++ ;
else
newlines = 0 ;
s ++ ;
bytesRead ++ ;
}
int bytesRead = 0 ,newlines = 0 ;
while (newlines != 2 && bytesRead != HEADER_BUF_SIZE - 1 ) {
if ( * s == ' ' )
newlines ++ ;
else
newlines = 0 ;
s ++ ;
bytesRead ++ ;
}
把接下来的html正文内容传给iDocument.m_sBodyNoTags = s;
最后执行分词
string
strLine
=
iDocument.m_sBodyNoTags;
CHzSeg iHzSeg;
strLine = iHzSeg.SegmentSentenceMM(iDict,strLine);
CHzSeg iHzSeg;
strLine = iHzSeg.SegmentSentenceMM(iDict,strLine);
分词的结果是记录ID号对应以"/"分割的关键字
重定向到正向索引文件中:
fout
<<
docId
<<
endl
<<
strLine;
fout << endl;
fout << endl;
根据这些记录,生成一个文件
类似
1
中国/ 北京/
2
美国/ 纽约/