Trie三叉樹分詞實現

2021-10-02 11:52:22 字數 2288 閱讀 9950

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

中文的語句與英文不同,英文單詞之間均有空格隔開,英文的語句沒有分詞的概念。而中文則不同,單詞之間沒有空格隔開。在處理中文語句時需要對中文語句進行分詞。

目前多數的中文分詞的演算法採用了,最長匹配詞典的演算法。詞典是將眾多的中文片語存放在乙個檔案內。如下的詞典的格式:

大學大學生中中心

活活動

此時我想要對中文語句: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不在樹中。

**實現 中文分詞**

三叉搜尋樹

三叉搜尋樹是用來解決字典樹的記憶體問題的資料結構。為了避免不需要的節點的記憶體占用,每個字典樹節點不再使用陣列,而是使用 樹中有樹 的結構。在三叉搜尋樹中,字典樹節點的每個非空指標得到它自己。例如,有四個單詞,ab abba abcd和bcd,它的三叉搜尋樹結構如下 三叉搜尋樹包括三種箭頭。第一種,...

GDI 實現三維三叉樹

首先看看效果 在學習二叉樹資料結構的時候,用gdi 結合佇列或者棧來畫出來乙個二叉樹的結構,如果你不是一次繪製完成,而是從每兩個線的繪製有時間間隔的話,你就能看到樹的 生長過程 而使用棧和佇列將得到完全不同的生長方式,也許這就是深度優先遍歷和廣度優先遍歷的區別把。那麼,我當時就在想,如果繪製乙個空間...

求三叉樹高度

有12345個結點的滿3叉數的高度為 寫出計算過程 1 層 1 節點數 1 2 3 4 層 2 節點數 3 5 6 7 8 9 10 11 12 13 層 3 節點數 9 滿三叉樹每層節點數目 假設k 1層有n個節點 那麼第k層就應該有3n個節點。也就是說這是乙個首項是1,公比是3的等比數列。第n層...