﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刀剑笑-随笔分类-JavaICTCLAS</title><link>http://www.blogjava.net/jiangyz/category/28463.html</link><description>用技术改善你的生活</description><language>zh-cn</language><lastBuildDate>Fri, 28 Dec 2007 18:18:14 GMT</lastBuildDate><pubDate>Fri, 28 Dec 2007 18:18:14 GMT</pubDate><ttl>60</ttl><item><title>ICTCLAS分词系统研究（一） （转）</title><link>http://www.blogjava.net/jiangyz/archive/2007/12/28/171360.html</link><dc:creator>刀剑笑</dc:creator><author>刀剑笑</author><pubDate>Fri, 28 Dec 2007 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/jiangyz/archive/2007/12/28/171360.html</guid><wfw:comment>http://www.blogjava.net/jiangyz/comments/171360.html</wfw:comment><comments>http://www.blogjava.net/jiangyz/archive/2007/12/28/171360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangyz/comments/commentRss/171360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangyz/services/trackbacks/171360.html</trackback:ping><description><![CDATA[&nbsp;ICTClAS分词系统是由中科院计算所的张华平、刘群所开发的一套获得广泛好评的分词系统，难能可贵的是该版的Free版开放了源代码，为我们很多初学者提供了宝贵的学习材料。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但有一点不完美的是，该源代码没有配套的文档，阅读起来可能有一定的障碍，尤其是对C/C++不熟的人来说.本人就一直用Java/VB作为主要的开发语言,C/C++上大学时倒是学过,不过工作之后一直没有再使用过,语法什么的忘的几乎一干二净了.但语言这东西,基本的东西都相通的,况且Java也是在C/C++的基础上形成的,有一定的相似处.阅读一遍源代码,主要的语法都应该不成问题了.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;虽然在ICTCLAS的系统中没有完整的文档说明,但是我们可以通过查阅张华平和刘群发表的一些相关论文资料,还是可以窥探出主要的思路.</p>
<p>&nbsp;&nbsp; 该分词系统的主要是思想是先通过CHMM(层叠形马尔可夫模型)进行分词,通过分层,既增加了分词的准确性,又保证了分词的效率.共分五层,如下图一所示:</p>
<p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sinboy/CHMM结构图.bmp" /></p>
<p>基本思路:先进行原子切分,然后在此基础上进行N-最短路径粗切分,找出前N个最符合的切分结果,生成二元分词表,然后生成分词结果,接着进行词性标注并完成主要分词步骤.</p>
<p>下面是对源代码的主要内容的研究：</p>
<p>１.首先，ICTCLAS分词程序首先调用CICTCLAS_WinDlg::OnBtnRun()开始程序的执行.并且可以从看出它的处理方法是把源字符串分段处理。并且在分词前，完成词典的加载过程，即生成m_ICTCLAS对象时调用构造函数完成词典库的加载。关于词典结构的分析，请参加分词系统研究（二）。</p>
<p>void CICTCLAS_WinDlg::OnBtnRun() <br />
{</p>
<p>&nbsp;&nbsp; ......</p>
<p><font color="#3366ff">&nbsp;</font><font color="#0000ff">//在此处进行分词和词性标记</font></p>
<p>&nbsp; if(!<font color="#ff0000">m_ICTCLAS.ParagraphProcessing</font>((char *)(LPCTSTR)m_sSource,sResult))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;m_sResult.Format("错误：程序初始化异常！");<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;m_sResult.Format("%s",sResult);<font color="#0000ff">//输出最终分词结果</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;......</p>
<p>}</p>
<p>２.在OnBtnRun()方法里面调用分段分词处理方法bool CResult::ParagraphProcessing(char *sParagraph,char *sResult)完成分词的整个处理过程，包括分词的词性标注.其中第一个参数为源字符串，第二个参数为分词后的字符串.在这两个方法中即完成了整个分词处理过程，下面需要了解的是在此方法中，如何调用其它方法一步步按照上图所示的分析框架完成分词过程.为了简单起见，我们先不做未登录词的分析。</p>
<p><font color="#0000ff">//Paragraph Segment and POS Tagging</font><br />
bool CResult::ParagraphProcessing(char *sParagraph,char *sResult)<br />
{</p>
<p>&nbsp;&nbsp; ........</p>
<p>&nbsp;&nbsp; <font color="#ff0000">Processing</font>(sSentence,1); <font color="#0000ff">//Processing and output the result of current sentence.<br />
</font>&nbsp;&nbsp;Output(m_pResult[0],sSentenceResult,bFirstIgnore);<font color="#0000ff"> //Output to the imediate result</font></p>
<p>&nbsp; .......</p>
<p>}</p>
<p>３.主要的分词处理是在Processing()方法里面发生的，下面我们对它进行进一步的分析.</p>
<p>bool CResult::Processing(char *sSentence,unsigned int nCount)<br />
{</p>
<p>......</p>
<p><font color="#3366ff">&nbsp;</font><font color="#0000ff">//进行二叉分词</font></p>
<p>m_Seg.BiSegment(sSentence, m_dSmoothingPara,m_dictCore,m_dictBigram,nCount);</p>
<p>......</p>
<p><font color="#3366ff">&nbsp;</font><font color="#0000ff">//在此处进行词性标注</font></p>
<p>m_POSTagger.POSTagging(m_Seg.m_pWordSeg[nIndex],m_dictCore,m_dictCore);</p>
<p>......</p>
<p>}</p>
<p>４.现在我们先不管词性标注，把注意力集中在二叉分词上，因为这个是分词的两大关键步骤的第一步.</p>
<p>参考文章:</p>
<p>1.&lt;&lt;基于层叠隐马模型的汉语词法分析&gt;&gt;,刘群 张华平等</p>
<p>2.&lt;&lt;基于N-最短路径的中文词语粗分模型&gt;&gt;,张华平 刘群</p>
<br />
<br />
<p id="TBPingURL">来源：<a href="http://blog.csdn.net/sinboy/archive/2006/03/12/622596.aspx">http://blog.csdn.net/sinboy/archive/2006/03/12/622596.aspx</a></p>
<img src ="http://www.blogjava.net/jiangyz/aggbug/171360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangyz/" target="_blank">刀剑笑</a> 2007-12-28 23:58 <a href="http://www.blogjava.net/jiangyz/archive/2007/12/28/171360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>