刀劍笑

          用技術改善你的生活

            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
          主站蜘蛛池模板: 丹棱县| 冕宁县| 靖边县| 丹阳市| 中超| 雷波县| 清丰县| 财经| 宁都县| 湖北省| 汕尾市| 江北区| 乌兰县| 长阳| 裕民县| 青海省| 堆龙德庆县| 通化县| 吕梁市| 股票| 行唐县| 尖扎县| 新蔡县| 常州市| 尚义县| 江永县| 额济纳旗| 贡觉县| 塔河县| 墨竹工卡县| 平南县| 化隆| 盐源县| 银川市| 常宁市| 观塘区| 江都市| 扬州市| 奉贤区| 厦门市| 抚州市|