刀劍笑

          用技術改善你的生活

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            13 隨筆 :: 3 文章 :: 3 評論 :: 0 Trackbacks

          上一篇文章說到經過NShortPath計算后,我們得到了數個候選分詞方案,那么這么多個候選分詞方案是如何最終成為一個分詞結果的呢?其實這個過程是靠OptimumSegment完成的。SharpICTCLAS與ICTCLAS的OptimumSegment過程基本一樣沒有太大的變化。

          1、OptimumSegment的運算過程

          經過NShortPath處理后的多個結果首先會經過日期合并策略的處理,這就是前文說的GenerateWord方法完成的功能。在GenerateWord方法中可以看到如下命令:

           m_graphOptimum.SetElement(pCur.row, pCur.col, ......);

          它的功能就是將所有得到的多個分詞方案合并歸入一個 m_graphOptimum 屬性,如下面的NShortPath運算結果,經過歸并后,在 m_graphOptimum 屬性中將包含所有紅色詞。

          經過NShortPath處理后的初步分詞結果
          //==== 原始句子:

          王曉平在1月份灤南大會上說的確實在理

          //==== NShortPath 初步切分的到的 N 個結果:

          始##始, 王, 曉, 平, 在, 1, 月份, 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 
          始##始, 王, 曉, 平, 在, 1, 月份, 灤, 南, 大會, 上, 說, 的, 確實, 在, 理, 末##末, 
          始##始, 王, 曉, 平, 在, 1, 月份, 灤, 南, 大, 會上, 說, 的, 確實, 在理, 末##末, 
          始##始, 王, 曉, 平, 在, 1, 月份, 灤, 南, 大會, 上, 說, 的, 確實, 在理, 末##末, 
          始##始, 王, 曉, 平, 在, 1, 月, 份, 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 


          //==== 經過數字、日期合并等策略處理后的 N 個結果:

          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 
          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大會, 上, 說, 的, 確實, 在, 理, 末##末, 
          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大, 會上, 說, 的, 確實, 在理, 末##末, 
          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大會, 上, 說, 的, 確實, 在理, 末##末, 
          始##始, 王, 曉, 平, 在, 1月, , 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 

          緊接著對歸并后的 m_graphOptimum 進行人名與地名的識別,找出所有可能的人名、地名方案,經過人名、地名識別后的 m_graphOptimum 如下:

          加入人名、地名識別
          //==== 加入對姓名、翻譯人名以及地名的識別:

          row:  0,  col:  1,  eWeight: 329805.00,   nPOS:      1,   sWord:始##始
          row:  1,  col:  2,  eWeight:    218.00,   nPOS:      0,   sWord:王
          row:  1,  col:  4,  eWeight:     10.86,   nPOS: -28274,   sWord:未##人
          row:  2,  col:  3,  eWeight:      9.00,   nPOS:      0,   sWord:曉
          row:  2,  col:  4,  eWeight:     13.27,   nPOS: -28274,   sWord:未##人
          row:  3,  col:  4,  eWeight:    271.00,   nPOS:      0,   sWord:平
          row:  4,  col:  5,  eWeight:  78484.00,   nPOS:      0,   sWord:在
          row:  5,  col:  7,  eWeight:      0.00,   nPOS: -29696,   sWord:未##時
          row:  5,  col:  8,  eWeight:      0.00,   nPOS: -29696,   sWord:未##時
          row:  7,  col:  8,  eWeight:   1234.00,   nPOS:      0,   sWord:份
          row:  8,  col:  9,  eWeight:      1.00,   nPOS:  27136,   sWord:灤
          row:  8,  col: 10,  eWeight:     20.37,   nPOS: -28275,   sWord:未##地
          row:  9,  col: 10,  eWeight:    813.00,   nPOS:      0,   sWord:南
          row: 10,  col: 11,  eWeight:  14536.00,   nPOS:      0,   sWord:大
          row: 10,  col: 12,  eWeight:   1333.00,   nPOS:  28160,   sWord:大會
          row: 11,  col: 13,  eWeight:    469.00,   nPOS:      0,   sWord:會上
          row: 12,  col: 13,  eWeight:  23706.00,   nPOS: -27904,   sWord:未##數
          row: 13,  col: 14,  eWeight:  17649.00,   nPOS:      0,   sWord:說
          row: 14,  col: 15,  eWeight: 358156.00,   nPOS:      0,   sWord:的
          row: 15,  col: 17,  eWeight:    361.00,   nPOS:      0,   sWord:確實
          row: 17,  col: 18,  eWeight:  78484.00,   nPOS:      0,   sWord:在
          row: 17,  col: 19,  eWeight:      3.00,   nPOS:  24832,   sWord:在理
          row: 18,  col: 19,  eWeight:    129.00,   nPOS:      0,   sWord:理
          row: 19,  col: 20,  eWeight:2079997.00,   nPOS:      4,   sWord:末##末

          到此為止, m_graphOptimum 包含了所有最終分詞結果中可能包含的元素(人名、地名以及NShortPath篩選后所有可能組詞方案),Segment類對這個 m_graphOptimum 再次使用NShortPath,并計算出最優結果作為最終的分詞方案。

          整個過程可從WordSegment類的Segment方法看出,SharpICTCLAS中該方法定義如下(經過簡化):

          分詞主程序
          public List<WordResult[]> Segment(string sentence, int nKind)
          {
             m_pNewSentence = Predefine.SENTENCE_BEGIN + sentence + Predefine.SENTENCE_END;
             //---初步分詞
             int nResultCount = m_Seg.BiSegment(m_pNewSentence, m_dSmoothingPara, nKind);

             //---人名、地名識別
             for (int i = 0; i < nResultCount; i++)
             {
                m_uPerson.Recognition(m_Seg.m_pWordSeg[i], m_Seg.m_graphOptimum, ......);
                m_uTransPerson.Recognition(m_Seg.m_pWordSeg[i], m_Seg.m_graphOptimum, ......);
                m_uPlace.Recognition(m_Seg.m_pWordSeg[i], m_Seg.m_graphOptimum, ......);
             }

             //---最終優化
             m_Seg.BiOptimumSegment(1, m_dSmoothingPara);

             //---詞性標注
             for (int i = 0; i < m_Seg.m_pWordSeg.Count; i++)
                m_POSTagger.POSTagging(m_Seg.m_pWordSeg[i], m_dictCore, m_dictCore);

             return m_Seg.m_pWordSeg;
          }

          2、人名與地名的識別

          ICTCLAS中人名的識別采用的是模板匹配的方法,首先對初步分詞得到的多的結果計算詞性,然后根據詞性串對人名信息進行匹配。整個運算過程如下:

          首先定義了人名匹配模板:

          人名識別模板
          string[] sPatterns = { "BBCD", "BBC", "BBE", "BBZ", "BCD",
          "BEE", "BE", "BG", "BXD", "BZ", "CDCD", "CD", "EE", "FB"
          "Y", "XD", "" };
          /*------------------------------------
          The person recognition patterns set
          BBCD:姓+姓+名1+名2;
          BBE: 姓+姓+單名;
          BBZ: 姓+姓+雙名成詞;
          BCD: 姓+名1+名2;
          BE:  姓+單名;
          BEE: 姓+單名+單名;韓磊磊
          BG:  姓+后綴
          BXD: 姓+姓雙名首字成詞+雙名末字
          BZ:  姓+雙名成詞;
          B:   姓
          CD:  名1+名2;
          EE:  單名+單名;
          FB:  前綴+姓
          XD:  姓雙名首字成詞+雙名末字
          Y:   姓單名成詞
          ------------------------------------*/

          然后將初步分詞得到的結果進行詞性標注,清理掉其它不必要的信息后進行模板匹配得到人名:

          人名識別過程
          //==== 經過初步分詞后的一個結果集

          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 

          //==== 經過計算得到的m_nBestTag

          始##始, 王, 曉, 平, 在, 1月份, 灤, 南, 大, 會上, 說, 的, 確實, 在, 理, 末##末, 
                  B   C   D   M   A      A   A   A   A     A   A   A     A   A

          //==== 經過模板匹配后識別出來的人名

          王曉平

          地名的識別與此類似,就不再多說。有關人名、地名識別的進一步內容可以參考:http://qxred.yculblog.com/post.1204714.html;《ICTCLAS 中科院分詞系統 代碼 注釋 中文分詞 詞性標注》作者:風暴紅QxRed 。

           

          • 小結

          經過NShortPath得到的多個初步分詞結果被歸并入 m_graphOptimum ,然后經過人名與地名識別過程將所有可能的人名、地名也放入其中,最后通過OptimumSegment方法最終得到分詞結果。

          來源:http://www.cnblogs.com/zhenyulu/category/85598.html

          posted on 2007-12-28 20:34 刀劍笑 閱讀(307) 評論(0)  編輯  收藏 所屬分類: SharpICTCLAS
          主站蜘蛛池模板: 武邑县| 泰州市| 肇源县| 大英县| 浏阳市| 南京市| 汉阴县| 榆树市| 张家川| 黄浦区| 永兴县| 轮台县| 新密市| 新田县| 镇康县| 昌都县| 石屏县| 当阳市| 婺源县| 泰州市| 乐东| 镇远县| 遵义市| 岳阳县| 闸北区| 甘谷县| 夏邑县| 平顺县| 岑巩县| 清徐县| 双峰县| 石柱| 巴中市| 肇州县| 信丰县| 浏阳市| 工布江达县| 四子王旗| 册亨县| 普安县| 镇雄县|