自然語言處理工具HanLP-N最短路徑分詞

adnb34g發表於2019-05-17


本篇給大家分享   寫的 HanLP   中的 N-最短路徑分詞。 以為下分享的原文,部分地方有稍作修改,內容僅供大家學習交流!

首先說明在 HanLP對外提供的介面中沒有使用N-最短路徑分詞器的,作者在官網中寫到這個分詞器對於實體識別來說會比最短路徑分詞稍好,但是它的速度會很慢。對此我有點個人看法,N-最短路徑分詞相較於最短路徑分詞來說只是考慮了每個節點下的N種最佳路徑,在最後選出的至少N條路徑中,作者並沒有對他們進行篩選,而只是選擇了一條最優的路徑,只能說N-最短路徑分詞相較於最短路徑分詞對分詞歧義會有一定作用,而對於未登入詞它的效果應該和最短路徑分詞相差不多,這只是個人的猜測,並沒有拿真實的語料驗證。如果後邊還有時間的話,我會把幾種分詞器在新聞語料上做一次對比評測。但是這種評測的意義可能不大,因為畢竟領域不同分詞器的效果也會不同,同文字分類一樣,至今依然沒有一種普適的分詞器。

前邊已經提到,在最短路徑分詞中,若每個結點處記錄 N種最短路徑值,則該方法稱為N-最短路徑演算法。在HanLP中透過兩個類ViterbiSegment和NshortSegment分別實現了最短路徑分詞和N-最短路徑分詞。這裡要說明一下為什麼說是N種而不是N個,原因是演算法會在每個位元組點處對所有到達該節點的路徑計算路徑值,然後按照路徑值做排序,所謂的“種”指的是路徑值的種類數,因此當存在相等路徑值的路徑時,節點處保留的路徑就不只有N個了。

 

從上圖的繼承關係我們可以看到最短路徑分詞器和 N最短路徑分詞器都繼承了WordBasedSegment抽象類,也就是說他們從大類上講都屬於基於詞語的分詞器。後邊我們還會介紹基於詞典的分詞器(極速詞典分詞器)以及基於字的分詞器(感知機、條件隨機場分詞器)。這裡再說明一下抽象類Segment它對外提供了分詞方法Seg,所有HanLP中實現的分詞方法類都繼承了該抽象類,並且實現了抽象方法segSentence。Seg方法對輸入的文字進行處理,當文字長度很長時,它會自動將其拆分為多個短文字,然後利用多執行緒技術,同步對多個短文字進行分詞處理,最後得到分詞後的文字,對於短文字Seg方法則直接用單執行緒處理。segSentence則會根據各種不同的分詞方法對文字進行分詞。這裡Seg方法會呼叫segSentence方法,這就是兩個方法的關係。拿我們現在的N-最短路徑分詞來說,segSentence實現的就是N-最短路徑分詞。如果是最短路徑分詞,則segSentence實現的是最短路徑分詞。寫這些只是為了使剛接觸物件導向程式設計方法的小夥伴能清楚。

下邊我們還是以例句 “他說的確實在理”為例來說明N-最短路徑分詞。程式對外表現就是計算出下邊的表

 

這裡我們使 N-最短路徑分詞中的N取2,可以看到演算法從“實”字開始就開始有多種最優路徑了,擷取了前top2種,最後得到了下邊的兩種分詞結果

 

至此,我們 N-最短路徑分詞介紹結束,我們再來總結一下HanLP中兩種方法的異同。

1) 第1個區別是節點上保留的最優路徑前驅節點數。具體來說,當某個節點存在兩個以上前驅時,N-最短路徑一定會保留topN種路徑值的所有前驅節點,而最短路徑只會保留一個最短路徑值的前驅節點。

2) HanLP在實現上對N-最短路徑方法增加了數字、日期合併規則。

3) HanLP的N-最短路徑方法最終返回的還是一個最優路徑,並未對topN個分詞結果做篩選策略,雖然在有多個前驅的節點處保留了多個候選前驅,但是個人感覺兩者相差應該不多,可能對分詞歧義有效果,但是對未登入詞應該作用不大。說白了它也還是基於詞典中單個詞語的機率做的,其他的文字資訊都沒有用到。

這裡,還要再說明一下,我們看到了分詞結果中含有了詞性標註,關於詞性標註我們會在後邊繼續介紹,它與分詞方法是兩個策略。程式也是先做了分詞再根據使用者配置做的詞性標註。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2644687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章