刀劍笑

          用技術(shù)改善你的生活

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            13 隨筆 :: 3 文章 :: 3 評(píng)論 :: 0 Trackbacks
           ICTClAS分詞系統(tǒng)是由中科院計(jì)算所的張華平、劉群所開(kāi)發(fā)的一套獲得廣泛好評(píng)的分詞系統(tǒng),難能可貴的是該版的Free版開(kāi)放了源代碼,為我們很多初學(xué)者提供了寶貴的學(xué)習(xí)材料。

                但有一點(diǎn)不完美的是,該源代碼沒(méi)有配套的文檔,閱讀起來(lái)可能有一定的障礙,尤其是對(duì)C/C++不熟的人來(lái)說(shuō).本人就一直用Java/VB作為主要的開(kāi)發(fā)語(yǔ)言,C/C++上大學(xué)時(shí)倒是學(xué)過(guò),不過(guò)工作之后一直沒(méi)有再使用過(guò),語(yǔ)法什么的忘的幾乎一干二凈了.但語(yǔ)言這東西,基本的東西都相通的,況且Java也是在C/C++的基礎(chǔ)上形成的,有一定的相似處.閱讀一遍源代碼,主要的語(yǔ)法都應(yīng)該不成問(wèn)題了.

              雖然在ICTCLAS的系統(tǒng)中沒(méi)有完整的文檔說(shuō)明,但是我們可以通過(guò)查閱張華平和劉群發(fā)表的一些相關(guān)論文資料,還是可以窺探出主要的思路.

             該分詞系統(tǒng)的主要是思想是先通過(guò)CHMM(層疊形馬爾可夫模型)進(jìn)行分詞,通過(guò)分層,既增加了分詞的準(zhǔn)確性,又保證了分詞的效率.共分五層,如下圖一所示:

          基本思路:先進(jìn)行原子切分,然后在此基礎(chǔ)上進(jìn)行N-最短路徑粗切分,找出前N個(gè)最符合的切分結(jié)果,生成二元分詞表,然后生成分詞結(jié)果,接著進(jìn)行詞性標(biāo)注并完成主要分詞步驟.

          下面是對(duì)源代碼的主要內(nèi)容的研究:

          1.首先,ICTCLAS分詞程序首先調(diào)用CICTCLAS_WinDlg::OnBtnRun()開(kāi)始程序的執(zhí)行.并且可以從看出它的處理方法是把源字符串分段處理。并且在分詞前,完成詞典的加載過(guò)程,即生成m_ICTCLAS對(duì)象時(shí)調(diào)用構(gòu)造函數(shù)完成詞典庫(kù)的加載。關(guān)于詞典結(jié)構(gòu)的分析,請(qǐng)參加分詞系統(tǒng)研究(二)。

          void CICTCLAS_WinDlg::OnBtnRun()
          {

             ......

           //在此處進(jìn)行分詞和詞性標(biāo)記

            if(!m_ICTCLAS.ParagraphProcessing((char *)(LPCTSTR)m_sSource,sResult))
                   m_sResult.Format("錯(cuò)誤:程序初始化異常!");
             else
                  m_sResult.Format("%s",sResult);//輸出最終分詞結(jié)果

              ......

          }

          2.在OnBtnRun()方法里面調(diào)用分段分詞處理方法bool CResult::ParagraphProcessing(char *sParagraph,char *sResult)完成分詞的整個(gè)處理過(guò)程,包括分詞的詞性標(biāo)注.其中第一個(gè)參數(shù)為源字符串,第二個(gè)參數(shù)為分詞后的字符串.在這兩個(gè)方法中即完成了整個(gè)分詞處理過(guò)程,下面需要了解的是在此方法中,如何調(diào)用其它方法一步步按照上圖所示的分析框架完成分詞過(guò)程.為了簡(jiǎn)單起見(jiàn),我們先不做未登錄詞的分析。

          //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()方法里面發(fā)生的,下面我們對(duì)它進(jìn)行進(jìn)一步的分析.

          bool CResult::Processing(char *sSentence,unsigned int nCount)
          {

          ......

           //進(jìn)行二叉分詞

          m_Seg.BiSegment(sSentence, m_dSmoothingPara,m_dictCore,m_dictBigram,nCount);

          ......

           //在此處進(jìn)行詞性標(biāo)注

          m_POSTagger.POSTagging(m_Seg.m_pWordSeg[nIndex],m_dictCore,m_dictCore);

          ......

          }

          4.現(xiàn)在我們先不管詞性標(biāo)注,把注意力集中在二叉分詞上,因?yàn)檫@個(gè)是分詞的兩大關(guān)鍵步驟的第一步.

          參考文章:

          1.<<基于層疊隱馬模型的漢語(yǔ)詞法分析>>,劉群 張華平等

          2.<<基于N-最短路徑的中文詞語(yǔ)粗分模型>>,張華平 劉群



          來(lái)源:http://blog.csdn.net/sinboy/archive/2006/03/12/622596.aspx

          posted on 2007-12-28 23:58 刀劍笑 閱讀(1242) 評(píng)論(0)  編輯  收藏 所屬分類: JavaICTCLASICTCLAS

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青阳县| 大冶市| 民县| 永州市| 元氏县| 康定县| 汤原县| 隆昌县| 定日县| 哈巴河县| 蛟河市| 呼伦贝尔市| 凭祥市| 保山市| 枣阳市| 沅陵县| 启东市| 舒兰市| 延长县| 巢湖市| 大兴区| 都匀市| 金坛市| 海淀区| 安阳县| 达尔| 邵阳县| 栾城县| 长岛县| 大足县| 阿巴嘎旗| 白河县| 凌海市| 合川市| 威宁| 霞浦县| 社旗县| 冕宁县| 云南省| 高台县| 明星|