Trie三叉樹分詞實現

最長匹配中文詞典分詞算法

中文的語句與英文不同,英文單詞之間均有空格隔開,英文的語句沒有分詞的概念。而中文則不同,單詞之間沒有空格隔開。在處理中文語句時需要對中文語句進行分詞。
目前多數的中文分詞的算法採用了,最長匹配詞典的算法。詞典是將衆多的中文詞組存放在一個文件內。如下的詞典的格式:

大
大學
大學生
中
中心
活
活動

此時我想要對中文語句:String keyStr = "大學生活動中心" 進行分詞。
採用最長匹配詞典的算法,從keyStr第一個字符開始,匹配到詞典表中的
keyStr繼續下一個字符與詞典匹配,可以得出這個也可以在詞典中匹配到,匹配到了大學這個單詞。
此時思考是否已經匹配結束了呢,還要繼續向下匹配,因爲最長匹配詞典算法是匹配不到爲止。
向下一個匹配就是這個字符了。至此中文分詞算法就結束了。不禁會問,如此簡單,其實就是這麼簡單。
後續的工作均在此工作基礎上進行優化,如keyStr如何快速匹配到詞典中的詞組,中文詞典的大量的詞組如何存儲。

優化中文最長匹配詞典算法工作
中文詞組詞典查找與存儲

爲了快速能夠查找到中文詞典的單詞需要設計一個好的數據結構用於存放中文詞典中詞組,好的標準是查詢速度快而且內存佔用又少。
詞典表中的中文詞組,每個詞組由一個到多個的字符組成,每個詞組存放在鏈表中,如下圖。
在這裏插入圖片描述
將量表合併成以爲根節點的樹,如下圖
在這裏插入圖片描述
每一個相同的開頭字符中文詞組形成一棵的樹,能夠有效的減少內存開銷,該樹就是標準Tire樹

解決了詞典中中文詞組存放的問題,那麼需要解決快速查找到一箇中文詞組。比如查詢大學生,在詞典表中如何快速能夠查詢到。根據Tire樹的性質,每個根節點是一個字符,通過一個詞典表中的中文詞組生成標準Tire樹,每課樹的根節點均是不同且是字符。
在ASCII碼中,每一個字符都是一個編號,他們是有大小的,很容易想到我們可以使用二叉搜索樹來解決查詢標準Tire樹的問題。如下圖 C大於B,存放在右子樹,A小於B存放在左子樹。
在這裏插入圖片描述
上面的兩者性質一個是存放中文詞組,另一個是快速查找。如果將其二者性質合併在一起會是一個很好的解決方案。爲了方便顯示,使用英文字符來表示,效果與中文詞組的一個字符是一樣的。
在這裏插入圖片描述
三叉Tire樹中,每一個節點包含一個字符,但是和標準Tire樹不同,三叉Tire樹的節點中有三個位置相關的屬性,一個指向左邊的樹(比該父節點的節點),一個指向右邊的樹(比該父節點的節點),還有一個是向下的節點(上圖綠色箭頭指向的節點),表示當前中文詞組該字符的下一個字符。
例如:b指向下節點是點e,在e節點中沒有向下的節點,所以表示的單詞爲be

上圖中綠色的箭頭線代表一個父節點的下面的直接後繼節點,只有父節點和他的直接後繼節點才能形成一個數據單元的關鍵字(一個單詞或者一箇中文詞組);is形成關鍵字is,但是ib不能形成關鍵字,因爲他們之間僅有一條斜線相連,不具有直接後繼的關係。
上圖的中帶有陰影的圓圈,是表示終止的節點,如果查找以一個詞以終止節點結束,則說明三叉樹包含這個詞。
從根節點開始查找單詞,以搜索單詞is爲例,向下到相等的孩子節點s,在兩次比較後找到is。查找ax時,執行三次比較到達的首字符a,然後經過兩次比較到達第二個字符x,返回結果是ax不在樹中。

代碼實現 中文分詞代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章