没有合适的资源?快使用搜索试试~ 我知道了~
中文分词系统
5星 · 超过95%的资源 需积分: 10 3 下载量 123 浏览量
2012-11-13
22:19:08
上传
评论
收藏 1.98MB PDF 举报
温馨提示
试读
51页
搜索引擎中中文分词系统,用c++编写,使用于windows系统,对搜索引擎有兴趣的可以下来看看
资源推荐
资源详情
资源评论
ICTCLAS
ICTCLAS
ICTCLAS
ICTCLAS
分词系统研究(一)
收藏
ICTClAS 分词系统是由中科院计算所的张华平 、 刘群所开发的一套获得广泛好评的分词系统
,
难能可贵的是该版的 Free 版开放了源代码,为我们很多初学者提供了宝贵的学习材料。
但有一点不完美的是 , 该源代码没有配套的文档 , 阅读起来可能有一定的障碍 , 尤其是对 C/C++
不熟的人来说 . 本人就一直用 Java/VB 作为主要的开发语言 ,C/C++ 上大学时倒是学过 , 不过工作之
后一直没有再使用过 , 语法什么的忘的几
乎一干二净了 . 但语言这东西 , 基本的东西
都相通的 , 况且 Java 也是在 C/C++ 的基
础上形成的 , 有一定的相似处 . 阅读一遍源
代码 , 主要的语法都应该不成问题了 .
虽然在 ICTCLAS 的系统中没有完整
的文档说明 , 但是我们可以通过查阅张华
平和刘群发表的一些相关论文资料 , 还是
可以窥探出主要的思路 .
该分词系统的主要是思想是先通 过
CHMM( 层叠形马尔可夫模型 ) 进行分词 ,
通过分层 , 既增加了分词的准确性 , 又保证
了分词的效率 . 共分五层 , 如下图一所示 :
基本思路 : 先进行原子切分 , 然后在此基础
上进 行 N- 最短路径粗切分 , 找出 前 N 个最
符合的切分结果 , 生成二元分词表 , 然后生
成分词结果 , 接着进行词性标注并完成主
要分词步骤 .
下面是对源代码的主要内容的研究:
1 . 首先, ICTCLAS 分词程序首先调 用
CICTCLAS_WinDlg::OnBtnRun() 开
始程序的执行 . 并且可以从看出它的处理
方法是把源字符串分段处理 。 并且在分词
前,完成词典的加载过程,即生 成
m_ICTCLAS 对象时调用构造函数完成
词典库的加载。关于词典结构的分析,请参加分词系统研究(二)。
void CICTCLAS_WinDlg::OnBtnRun()
{
......
// 在此处进行分词和词性标记
if(! m_ICTCLAS.ParagraphProcessing ((char *)(LPCTSTR)m_sSource,sResult))
m_sResult.Format(" 错误:程序初始化异常! ");
else
m_sResult.Format("%s",sResult); // 输出最终分词结果
......
}
2 . 在 OnBtnRun() 方法里面调用分段分词处理方法 bool CResult::ParagraphProcessing(char
*sParagraph,char *sResult) 完成分词的整个处理过程,包括分词的词性标注 . 其中第一个参数为
源字符串,第二个参数为分词后的字符串 . 在这两个方法中即完成了整个分词处理过程,下面需要了
解的是在此方法中 , 如何调用其它方法一步步按照上图所示的分析框架完成分词过程 . 为了简单起见
,
我们先不做未登录词的分析。
//Paragraph Segment and POS Tagging
bool CResult::ParagraphProcessing(char *sParagraph,char *sResult)
{
........
Processing (sSentence,1); //Processing and output the result of current sentence.
Output(m_pResult[0],sSentenceResult,bFirstIgnore); //Output to the imediate result
.......
}
3 . 主要的分词处理是在 Processing() 方法里面发生的,下面我们对它进行进一步的分析 .
bool CResult::Processing(char *sSentence,unsigned int nCount)
{
......
// 进行二叉分词
m_Seg.BiSegment(sSentence,
m_dSmoothingPara,m_dictCore,m_dictBigram,nCount);
......
// 在此处进行词性标注
m_POSTagger.POSTagging(m_Seg.m_pWordSeg[nIndex],m_dictCore,m_dictCore);
......
}
4 . 现在我们先不管词性标注,把注意力集中在二叉分词上,因为这个是分词的两大关键步骤的第一
步 .
参考文章 :
1.<< 基于层叠隐马模型的汉语词法分析 >>, 刘群 张华平等
2.<< 基于 N- 最短路径的中文词语粗分模型 >>, 张华平 刘群
ICTCLAS
ICTCLAS
ICTCLAS
ICTCLAS
分词系统研究(二)
--
--
--
--
词典结构
收藏
ICTCLAS 的词典结构是理解分词的重要依据,通过这么一个数据结构设计合理访问速度高效的词典
才能达到快速准备的分词的目的。
通过阅读和分析源代码 , 我们可以知道 , 是程序运行初 , 先把词典加载到内存中 , 以提高访问的速度
。
源代码在 Result.cpp 的构造函数 CResult ()内实现了词典和分词规则库的加载。如下代码所示 :
CResult::CResult()
{
……
m_dictCore.Load("data\\coreDict.dct");
m_POSTagger.LoadContext("data\\lexical.ctx");
……
}
我们再跳进 Load 方法具体分析它是怎样读取数据词典的 , 看 Load 的源代码 :
bool CDictionary::Load(char *sFilename,bool bReset)
{
FILE *fp;
int i,j,nBuffer[3];
// 首先判断词典文件能否以二进制读取的方式打开
if((fp=fopen(sFilename,"rb"))==NULL)
return false;//fail while opening the file
// 为新文件释放内存空间
for( i=0;i<CC_NUM;i++)
{//delete the memory of word item array in the dictionary
for( j=0;j<m_IndexTable[i].nCount;j++)
delete m_IndexTable[i].pWordItemHead[j].sWord;
delete [] m_IndexTable[i].pWordItemHead;
}
DelModified();// 删除掉修改过的 , 可以先不管它
//CC_NUM:6768, 应该是 GB2312 编码中常用汉字的数目 6763 个加上 5 个空位码
for(i=0;i<CC_NUM;i++)
{
// 读取一个整形数字 ( 词块的数目 )
fread(&(m_IndexTable[i].nCount),sizeof(int),1,fp);
if(m_IndexTable[i].nCount>0)
m_IndexTable[i].pWordItemHead=new
WORD_ITEM[m_IndexTable[i].nCount];
else
{
m_IndexTable[i].pWordItemHead=0;
continue;
}
j=0;
// 根据前面读到的词块数目 , 循环读取一个个词块
while(j<m_IndexTable[i].nCount)
{
// 读取三字整数 , 分别为频度 (Frequency)/ 词内容长度 (WordLen)/ 句柄 (Handle)
fread(nBuffer,sizeof(int),3,fp);
m_IndexTable[i].pWordItemHead[j].sWord=new char[nBuffer[1]+1];
// 读取词内容
if(nBuffer[1])//String length is more than 0
{
fread(m_IndexTable[i].pWordItemHead[j].sWord,sizeof(char),nBuffer[1],fp);
}
m_IndexTable[i].pWordItemHead[j].sWord[nBuffer[1]]=0;
if(bReset)//Reset the frequency
m_IndexTable[i].pWordItemHead[j].nFrequency=0;
else
m_IndexTable[i].pWordItemHead[j].nFrequency=nBuffer[0];
m_IndexTable[i].pWordItemHead[j].nWordLen=nBuffer[1];
m_IndexTable[i].pWordItemHead[j].nHandle=nBuffer[2];
j+=1;//Get next item in the original table.
}
}
fclose(fp);
return true;
}
看完上面的源代码 , 词典的结构也应该基本清楚了 , 如下图一所示 :
剩余50页未读,继续阅读
资源评论
- 枯凡2014-05-03资料很深奥,要好好研究。
fang852049105
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HBR740语音识别协处理芯片开发工具包(硬件参考设计原理图+PCB+51单片机软件驱动源码DEMO例程+文档资料).zip
- 人寿保险抢单协议v0.1.exe
- 数据库管理工具:dbeaver-ce-23.0.1-macos-aarch64.dmg
- M25P20, M25P40, M25P80, M25P16, M25P32, M25P64存储 SPI FLASH C语言驱动
- Matlab基于PCA算法的简单图像人脸识别.zip
- 免费的画图工具drawio,可以代替visio,版本24.5.3,适用于windows
- 瑞昱RTL8723DS-WiFi-linux- android 驱动 内含详细移植说明,支持android4.4
- AMSR/ADEOS-II L1A Raw Observation Counts, Version 3用户手册
- zaopingshujufenxi.zip
- 六级作文模板万能句型pdf.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功