HanLP中的人名識(shí)別分析詳解

在看源碼之前,先看幾遍論文《基于角色標(biāo)注的中國(guó)人名自動(dòng)識(shí)別研究》

成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)公司把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!

關(guān)于命名識(shí)別的一些問(wèn)題,可參考下列一些 issue:

u  u名字識(shí)別的問(wèn)題 #387

u  u機(jī)構(gòu)名識(shí)別錯(cuò)誤

u  u關(guān)于層疊HMM中文實(shí)體識(shí)別的過(guò)程

HanLP參考博客:

詞性標(biāo)注

層疊 HMM-Viterbi角色標(biāo)注模型下的機(jī)構(gòu)名識(shí)別

分詞

在 HMM與分詞、詞性標(biāo)注、命名實(shí)體識(shí)別中說(shuō):

分詞:給定一個(gè)字的序列,找出最可能的標(biāo)簽序列(斷句符號(hào): [詞尾]或[非詞尾]構(gòu)成的序列)。結(jié)巴分詞目前就是利用BMES標(biāo)簽來(lái)分詞的,B(開頭),M(中間),E(結(jié)尾),S(獨(dú)立成詞)

分詞也是采用了維特比算法的動(dòng)態(tài)規(guī)劃性質(zhì)求解的,具體可參考:文本挖掘的分詞原理

角色觀察

以 “唱首張學(xué)友的歌情已逝”為例,

先將起始頂點(diǎn) 始 ##始,角色標(biāo)注為:NR.A 和 NR.K,頻次默認(rèn)為1

  HanLP中的人名識(shí)別分析詳解

對(duì)于第一個(gè)詞 “唱首”,它不存在于 nr.txt中, EnumItem<NR> nrEnumItem = PersonDictionary.dictionary.get(vertex.realWord); 返回 null,于是根據(jù)它本身的詞性猜一個(gè)角色標(biāo)注:

  HanLP中的人名識(shí)別分析詳解

由于 "唱首"的Attribute為 nz 16,不是nr 和 nnt,故默認(rèn)給它指定一個(gè)角色NR.A,頻率為nr.tr.txt中 NR.A 角色的總頻率。

此時(shí),角色列表如下:

  HanLP中的人名識(shí)別分析詳解

接下來(lái)是頂點(diǎn) “張”,由于“張”在nr.txt中,因此 PersonDictionary.dictionary.get(vertex.realWord) 返回 EnumItem對(duì)象,直接將它加入到角色列表中:

  HanLP中的人名識(shí)別分析詳解

加入 “張”之后的角色列表如下:

  HanLP中的人名識(shí)別分析詳解

“唱首張學(xué)友的歌情已逝” 整句的角色列表如下:

  HanLP中的人名識(shí)別分析詳解

至此,角色觀察 部分 就完成了。

總結(jié)一下,對(duì)句子進(jìn)行角色觀察,首先是通過(guò)分詞算法將句子分成若干個(gè)詞,然后對(duì)每個(gè)詞查詢?nèi)嗣~典 (PersonDictionary)。

u  若這個(gè)詞在人名詞典中 (nr.txt),則記錄該詞的角色,所有的角色在 com.hankcs.hanlp.corpus.tag.NR.java 中定義。

u  若這個(gè)詞不在人名詞典中,則根據(jù)該詞的 Attribute “猜一個(gè)角色”。在猜的過(guò)程中,有些詞在核心詞典中可能已經(jīng)標(biāo)注為nr或者nnt了,這時(shí)會(huì)做分裂處理。其他情況下則是將這個(gè)詞標(biāo)上NR.A角色,頻率為 NR.A 在轉(zhuǎn)移矩陣中的總詞頻。

維特比算法 (動(dòng)態(tài)規(guī)劃)求解最優(yōu)路徑

在上圖中,給每個(gè)詞都打上了角色標(biāo)記,可以看出,一個(gè)詞可以有多個(gè)標(biāo)記。而我們需要將這些詞選擇一條路徑最短的角色路徑。參考 隱馬爾可夫模型維特比算法詳解

List<NR> nrList = viterbiComputeSimply(roleTagList); //some code.... return  Viterbi.computeEnumSimply(roleTagList, PersonDictionary.transformMatrixDictionary);

而這個(gè)過(guò)程,其實(shí)就是:維特比算法解碼隱藏狀態(tài)序列。在這里,五元組是:

u  隱藏狀態(tài)集合 com.hankcs.hanlp.corpus.tag.NR.java 定義的各個(gè)人名標(biāo)簽

u  觀察狀態(tài)集合 已經(jīng)分好詞的各個(gè) tagList中元素(相當(dāng)于分詞結(jié)果)

  HanLP中的人名識(shí)別分析詳解

u  轉(zhuǎn)移概率矩陣 由 nr.tr.txt 文件生成得到。具體可參考:

u  發(fā)射概率 某個(gè)人名標(biāo)簽 (隱藏狀態(tài))出現(xiàn)的次數(shù) 除以 所有標(biāo)簽出現(xiàn)的總次數(shù)

Math.log((item.getFrequency(cur) + 1e-8) / transformMatrixDictionary.getTotalFrequency(cur)

u  初始狀態(tài) (始##始) 和 結(jié)束狀態(tài)(末##末)

  HanLP中的人名識(shí)別分析詳解

維特比解碼隱藏狀態(tài)的動(dòng)態(tài)規(guī)劃求解核心代碼如下:

             for  (E cur : item.labelMap.keySet())

            {

                 double  now = transformMatrixDictionary.transititon_probability[pre.ordinal()][cur.ordinal()] - Math.log((item.getFrequency(cur) + 1e-8 ) / transformMatrixDictionary.getTotalFrequency(cur));

                 if  (perfect_cost > now)

                {

                    perfect_cost = now;

                    perfect_tag = cur;

                }

            }

transformMatrixDictionary.transititon_probability[pre.ordinal()][cur.ordinal()]  是前一個(gè)隱藏狀態(tài)  pre.ordinal() 轉(zhuǎn)換到當(dāng)前隱藏狀態(tài) cur.ordinal() 的轉(zhuǎn)移概率。 Math.log((item.getFrequency(cur) + 1e-8) / transformMatrixDictionary.getTotalFrequency(cur) 是當(dāng)前隱藏狀態(tài)的發(fā)射概率。二者 “相減”得到一個(gè)概率 保存在 double now 變量中,然后通過(guò) for 循環(huán)找出 當(dāng)前觀察狀態(tài) 對(duì)應(yīng)的 最可能的(perfect_cost最小) 隱藏狀態(tài) perfect_tag。

至于為什么是上面那個(gè)公式來(lái)計(jì)算轉(zhuǎn)移概率和發(fā)射概率,可參考論文:《 基于角色標(biāo)注的中國(guó)人名自動(dòng)識(shí)別研究 》

在上面例子中,得到的最優(yōu)隱藏狀態(tài)序列 (最優(yōu)路徑)K->A->K->Z->L->E->A->A 如下:

nrList = {LinkedList@1065} size = 8
"K" 始##始
"A" 唱首
"K" 張
"Z" 學(xué)友
"L" 的
"E" 歌
"A" 情已逝
"A" 末##末
例如:
隱藏狀態(tài)---觀察狀態(tài)
"K"----------始##始

最大匹配

有了最優(yōu)隱藏序列: KAKZLEAA,接下來(lái)就是:后續(xù)的“最大匹配處理”了。

        PersonDictionary.parsePattern(nrList, pWordSegResult, wordNetOptimum, wordNetAll);

在最大匹配之前,會(huì)進(jìn)行 “模式拆分”。在com.hankcs.hanlp.corpus.tag.NR.java 定義了隱藏狀態(tài)的具體含義。比如說(shuō),若最優(yōu)隱藏序列中 存在 'U' 或者 'V',

U Ppf 人名的上文和姓成詞 這里【有關(guān)】天培的壯烈

V Pnw 三字人名的末字和下文成詞 龔學(xué)平等領(lǐng)導(dǎo), 鄧穎【超生】前

則會(huì)做 “拆分處理”

switch (nr)

{

     case  U:

         //拆分成K B

     case  V:

         //視情況拆分

}

拆分完成之后,重新得到一個(gè)新的隱藏序列 (模式)

String pattern = sbPattern.toString();

接下來(lái),就用 AC自動(dòng)機(jī)進(jìn)行最大模式匹配了,并將匹配的結(jié)果存儲(chǔ)到“最優(yōu)詞網(wǎng)”中。當(dāng)然,在這里就可以自定義一些針對(duì)特定應(yīng)用的 識(shí)別處理規(guī)則

trie.parseText(pattern, new  AhoCorasickDoubleArrayTrie.IHit<NRPattern>(){

     //.....

    wordNetOptimum.insert(offset, new  Vertex(Predefine.TAG_PEOPLE, name, ATTRIBUTE, WORD_ID), wordNetAll);

}

將識(shí)別出來(lái)的人名保存到最優(yōu)詞網(wǎng)后,再基于最優(yōu)詞網(wǎng)調(diào)用一次維特比分詞算法,得到最終的分詞結(jié)果 ---細(xì)分結(jié)果。

             if  (wordNetOptimum.size() != preSize)

            {

                vertexList = viterbi(wordNetOptimum);

                 if  (HanLP.Config.DEBUG)

                {

                    System.out.printf( "細(xì)分詞網(wǎng):\n%s\n" , wordNetOptimum);

                }

            }

總結(jié)

源碼上的人名識(shí)別基本上是按照論文中的內(nèi)容來(lái)實(shí)現(xiàn)的。對(duì)于一個(gè)給定的句子,先進(jìn)行下面三大步驟處理:

角色觀察

維特比算法解碼求解隱藏狀態(tài)(求解各個(gè)分詞 的 角色標(biāo)記)

對(duì)角色標(biāo)記進(jìn)行最大匹配(可做一些后處理操作)

最后,再使用維特比算法進(jìn)行一次分詞,得到細(xì)分結(jié)果,即為最后的識(shí)別結(jié)果。

這篇文章里面沒(méi)有寫維特比分詞算法的詳細(xì)過(guò)程,以及轉(zhuǎn)移矩陣的生成過(guò)程,以后有時(shí)間再補(bǔ)上。看源碼,對(duì)隱馬模型的理解又加深了一點(diǎn),感受到了理論的東西如何用代碼一步步來(lái)實(shí)現(xiàn)。由于我也是初學(xué),對(duì)源碼的理解不夠深入或者存在一些偏差,歡迎批評(píng)指正。

關(guān)于動(dòng)態(tài)規(guī)劃的一個(gè)簡(jiǎn)單示例,可參考:動(dòng)態(tài)規(guī)劃之 Fib數(shù)列類問(wèn)題應(yīng)用

文章來(lái)源 hapjin 的博客

分享名稱:HanLP中的人名識(shí)別分析詳解
路徑分享:http://muchs.cn/article42/phoeec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站制作、靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名