上一篇文章說到經過NShortPath計算后,我們得到了數個候選分詞方案,那么這么多個候選分詞方案是如何最終成為一個分詞結果的呢?其實這個過程是靠OptimumSegment完成的。SharpICTCLAS與ICTCLAS的OptimumSegment過程基本一樣沒有太大的變化。
1、OptimumSegment的運算過程
經過NShortPath處理后的多個結果首先會經過日期合并策略的處理,這就是前文說的GenerateWord方法完成的功能。在GenerateWord方法中可以看到如下命令:
m_graphOptimum.SetElement(pCur.row, pCur.col, ......);
它的功能就是將所有得到的多個分詞方案合并歸入一個 m_graphOptimum
屬性,如下面的NShortPath運算結果,經過歸并后,在 m_graphOptimum
屬性中將包含所有紅色詞。
王曉平在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中該方法定義如下(經過簡化):
{
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中人名的識別采用的是模板匹配的方法,首先對初步分詞得到的多的結果計算詞性,然后根據詞性串對人名信息進行匹配。整個運算過程如下:
首先定義了人名匹配模板:
"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