最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python自然語言處理之字典樹知識總結

 更新時間:2021年04月25日 15:43:28   作者:李元靜  
這篇文章主要介紹了python自然語言處理之字典樹知識總結,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、什么是字典樹

在自然語言處理中,字符串集合常用字典樹存儲,這是一種字符串上的樹形數(shù)據(jù)結構。字典樹中每條邊都對應一個字,從根節(jié)點往下的路徑構成一個個字符串。

字典樹并不直接在節(jié)點上存儲字符串,而是將詞語視作根節(jié)點到某節(jié)點之間的一條路徑,并在終點節(jié)點上做個標記(表明到該節(jié)點就結束了)。

要查詢一個單詞,指需要順著這條路徑從根節(jié)點往下走。如果能走到標記的節(jié)點,則說明該字符串在集合中,否則說明不在。下圖為字典樹結構示例:

樹結構

如上圖所示,每條路徑都是一個詞匯,且沒有子節(jié)點就可以判定該條路徑結尾了。具體可以映射為下標所示:

詞語 路徑
歡迎 0-1-2
北大 0-3-8
北京城 0-3-4-5
北京大學 0-3-4-6-7

至于字典樹的實現(xiàn),相信只要認真學過數(shù)據(jù)結構的讀者,都能手到擒來,這里不在贅述。因為HanLP庫已經(jīng)提供了多種字典樹。

二、DoubleArrayTrieSegment

認識DoubleArrayTrieSegment類之前,我們需要了解雙數(shù)組字典書的概念。

我們都知道,在樹中遍歷查找之時,我們一般用二分查找,假如某一個樹的節(jié)點有N個節(jié)點,那么其復雜度就為O(logN),這樣查找起來一條一條樹的遍歷會非常的慢,所以就誕生了雙數(shù)組字典樹的概念。

雙數(shù)組字典樹(DAT)是一種狀態(tài)轉移復雜度為常數(shù)的數(shù)據(jù)結構。那么什么是狀態(tài)呢?從確定有限狀態(tài)自動機(DFA)的角度來講,每個節(jié)點都是一個狀態(tài),狀態(tài)表示當前已查詢到的前綴。

從父節(jié)點到子節(jié)點的移動過程可以看作一次狀態(tài)轉移。在按照某個字符進行狀態(tài)轉移前,我們會向父節(jié)點詢問該字符與子節(jié)點的映射關系(也就是一條路徑一條邊)。如果父節(jié)點有滿足條件的邊,則狀態(tài)轉移到子節(jié)點;否則立即失敗,查詢不到。當成功完成了全部轉移時,我們就拿到了最后一個狀態(tài),詢問該狀態(tài)是否時最終狀態(tài)。如果是,就查詢到該詞匯,否則該單詞不存在于字典中。

比如我們查詢首圖的“北京大學”,狀態(tài)開始為0,查詢到北時狀態(tài)為3,查詢到京時狀態(tài)為4,查詢到大時狀態(tài)為6,查詢到學時狀態(tài)為7,最后判斷7是否還有子節(jié)點,如果沒有匹配該詞匯,如果有該詞匯不在字典中。比如查詢“北京大”就不在詞匯中。

而雙數(shù)組字典由base與check兩個數(shù)組組成,其中base數(shù)組即節(jié)點,也是狀態(tài),分為空閑狀態(tài)與占用狀態(tài),check數(shù)組為每個元素表示某個狀態(tài)的前驅狀態(tài)。具體公式如下:

base[s] + c = t
check[t] =  s

base樹組中的s代表當前狀態(tài)的下標,t代表轉移狀態(tài)的下標,c代表輸入字符的數(shù)值

base[s] + c = t //表示一次狀態(tài)轉移

由于轉移后狀態(tài)下標為t,且父子關系是唯一的,所以可通過檢驗當前元素的前驅狀態(tài)確定轉移是否成功

check[t] = s //檢驗狀態(tài)轉移是否成功

這種算法相對于傳統(tǒng)的Trie樹二分查找的優(yōu)點是,只需要一個加法一次比較即可完成一次狀態(tài)轉移,只花費了常數(shù)時間,下面給出了雙數(shù)組Tree樹的原理圖(注意觀察狀態(tài)轉移的過程)

過程

了解了雙數(shù)組字典樹的原理,我們就可以來學習DoubleArrayTrieSegment,DoubleArrayTrieSegment分詞器是對DAT(雙數(shù)組字典樹)最長匹配的封裝,默認加載hanlp.properites中CoreDictionaryPath指定的詞典。

對應的python代碼如下:

if __name__ == "__main__":
    HanLP.Config.ShowTermNature=False#分詞結果不顯示詞性
    segment=DoubleArrayTrieSegment()
    print(segment.seg("在來到這個世界之前,一起都很Happy"))

運行之后,得到如下圖所示的結果:

示例

當然,這是HanLP提供給我們的默認詞典,如果想加載自己的詞典,或者前文提到的其他開源的詞典庫,可以替換代碼如下所示:

DoubleArrayTrieSegment(["詞典1","詞典2"])

但是不知道讀者注意到了沒有,上面的英文happy,它給我們拆成了單個的字母,但其實這是一個整體,如果這里替換成數(shù)字,也是一個一個數(shù)字,那么如何不讓其拆開呢?

我們來看一段代碼:

if __name__ == "__main__":
    HanLP.Config.ShowTermNature=True
    segment=DoubleArrayTrieSegment()
    segment.enablePartOfSpeechTagging(True)
    print(segment.seg("在來到這個世界之前,一起都很Happy"))

enablePartOfSpeechTagging函數(shù)的意思是激活數(shù)字與英文識別,同時我們把ShowTermNature改為True,觀察其輸出的結果:

示例

這里與我們前面自己寫的算法輸出一模一樣,有分開的詞匯以及詞匯的標記屬性。

三、AhoCorasickDoubleArrayTrieSegment

雖然雙數(shù)組字典樹能遍歷大量的數(shù)據(jù),但是如果數(shù)據(jù)比較長的,這些長的詞匯又比較多的話,比如“受命于天,既壽永昌”算一個詞匯,那么其處理起來時間復雜度依舊非常耗時。所以,我們就需要使用ACDAT進行遍歷。

這里博主不講解其原理,因為太長篇幅有限,感興趣的可以專門學習樹結構的處理。讀者只需要知道其原理,什么時候用雙數(shù)組遍歷,什么時候用ACDAT遍歷就行。而HanLP封裝的ACDAT的實現(xiàn)類是AhoCorasickDoubleArrayTrieSegment。

下面,我們來實現(xiàn)AhoCorasickDoubleArrayTrieSegment,代碼如下:

if __name__ == "__main__":
    HanLP.Config.ShowTermNature = False
    segment = JClass("com.hankcs.hanlp.seg.Other.AhoCorasickDoubleArrayTrieSegment")()
    print(segment.seg("在來到這個世界之前,一起都很井然有序"))

運行之后,效果如下:

示例

需要注意的是,python的HanLP雖然提供了AhoCorasickDoubleArrayTrieSegment類,但是讀者可以試試,替換后運行會報錯,控制臺會提示該類沒有seg函數(shù)。而HanLP庫又是基于Java開發(fā)的,所以在實際的項目中,盡量使用JClass加載Java類進行實戰(zhàn),因為python的HanLP庫運行速度比Java慢一倍,但python的好處是相對簡單,可以調用其他程序的類,所以速度這方面只要python引用Java類進行調用,其實速度一樣。

到此這篇關于python自然語言處理之字典樹知識總結的文章就介紹到這了,更多相關python字典樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • IntelliJ IDEA安裝運行python插件方法

    IntelliJ IDEA安裝運行python插件方法

    在本篇文章里我們給大家分享關于IntelliJ IDEA安裝運行python插件方法,對此有需求的讀者們可以跟著步驟學習下
    2018-12-12
  • Django批量向admin注冊模型方法詳解

    Django批量向admin注冊模型方法詳解

    這篇文章主要為大家介紹了Django批量向admin注冊模型方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 詳解Python3中的 input() 函數(shù)

    詳解Python3中的 input() 函數(shù)

    這篇文章主要介紹了詳解Python3中的 input() 函數(shù)的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2020-03-03
  • python 中[0]*2與0*2的區(qū)別說明

    python 中[0]*2與0*2的區(qū)別說明

    這篇文章主要介紹了python 中[0]*2與0*2的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Python基礎之操作MySQL數(shù)據(jù)庫

    Python基礎之操作MySQL數(shù)據(jù)庫

    這篇文章主要介紹了Python基礎之操作MySQL數(shù)據(jù)庫,文中有非常詳細的代碼示例,對正在學習python基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Python裝飾器中@property使用詳解

    Python裝飾器中@property使用詳解

    大家好,本篇文章主要講的是Python裝飾器中@property使用詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • python的構建工具setup.py的方法使用示例

    python的構建工具setup.py的方法使用示例

    本篇文章主要介紹了python的構建工具setup.py的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Python+OpenCV開發(fā)一個視頻播放器

    Python+OpenCV開發(fā)一個視頻播放器

    提到OpenCV,大家首先想到的可能是圖像處理、目標檢測等,但你是否想過用OpenCV實現(xiàn)一個視頻播放器,下面小編就帶你深入掌握OpenCV的視頻處理能力吧
    2025-03-03
  • Python中處理YAML文件的正確方法

    Python中處理YAML文件的正確方法

    在現(xiàn)代軟件開發(fā)中,YAML(YAML Ain’t Markup Language)因其簡潔和易于閱讀的特性,被廣泛用于配置文件,Python 作為一種流行的編程語言,提供了多種處理 YAML 文件的庫,本文給大家介紹了Python中處理YAML文件的正確方法,需要的朋友可以參考下
    2024-11-11
  • 關于Django外鍵賦值問題詳解

    關于Django外鍵賦值問題詳解

    這段時間用django 做程序用到了一對多的關系的操作,下面分享一些心得體會,這篇文章主要給大家介紹了關于Django外鍵賦值問題的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08

最新評論

石阡县| 东方市| 浦江县| 敦煌市| 文水县| 林西县| 尚义县| 越西县| 淮阳县| 介休市| 会泽县| 广东省| 石楼县| 汕头市| 读书| 仁怀市| 淳安县| 盘山县| 梧州市| 清水河县| 玛纳斯县| 淳安县| 九龙坡区| 航空| 红安县| 隆德县| 晋州市| 尉氏县| 威远县| 云林县| 肃宁县| 盘山县| 东平县| 商城县| 钟山县| 长顺县| 霸州市| 阿克陶县| 清苑县| 武川县| 突泉县|