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

Python自然語言處理之切分算法詳解

 更新時間:2021年04月25日 15:29:37   作者:李元靜  
這篇文章主要介紹了Python自然語言處理之切分算法詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、前言

我們需要分析某句話,就必須檢測該條語句中的詞語。

一般來說,一句話肯定包含多個詞語,它們互相重疊,具體輸出哪一個由自然語言的切分算法決定。常用的切分算法有完全切分、正向最長匹配、逆向最長匹配以及雙向最長匹配。

本篇博文將一一介紹這些常用的切分算法。

二、完全切分

完全切分是指,找出一段文本中的所有單詞。

不考慮效率的話,完全切分算法其實非常簡單。只要遍歷文本中的連續(xù)序列,查詢該序列是否在詞典中即可。上一篇我們獲取了詞典的所有詞語dic,這里我們直接用代碼遍歷某段文本,完全切分出所有的詞語。代碼如下:

from pyhanlp import *


def load_dictionary():
    IOUtil = JClass('com.hankcs.hanlp.corpus.io.IOUtil')
    path = HanLP.Config.CoreDictionaryPath.replace('.txt', '.mini.txt')
    dic = IOUtil.loadDictionary([path])
    return set(dic.keySet())


def fully_segment(text, dic):
    list = []
    for i in range(len(text)):
        for j in range(i + 1, len(text) + 1):
            temp = text[i:j]
            if temp in dic:
                list.append(temp)
    return list


if __name__ == "__main__":
    dic = load_dictionary()
    print(fully_segment("在絕對實力面前,一切的說辭都是枉然", dic))

詞匯

可以看到,完全切分算法輸出了文本中所有的單字與詞匯。
這里的算法原理是:開始遍歷單個字,以該字為首,將后面每個字依次組合到單個字中,分析出這些組合字句是否在詞典中。第二次,從第二個字開始,組合后面的字,以此類推。不懂的看下圖就明白了。

遍歷

三、正向最長匹配

雖然說完全切分能獲取到所有出現(xiàn)在字典中的單詞,單字,但是我們獲取語句中單字一般來說沒有任何意義,我們更希望獲取的是中文分詞,那種具有意義的詞語序列。

比如,上面我們希望“絕對實力”成為一整個詞,而不是“絕對”+“實力”之類的碎片。為了達到這個目的,我們需要完善一下我們的算法??紤]到越長的單詞表達的意義更加的豐富,于是我們定義單詞越長優(yōu)先級越高。

具體來說,就是在某個下標為起點遞增查詞的過程中,優(yōu)先輸出更長的單詞,這種規(guī)則被稱為最長匹配算法。該下標的掃描順序如果從前往后,則稱為正向最長匹配,反之則為逆向最長匹配。

下面,我們來實現(xiàn)正向最長匹配,代碼如下:

def forward_segment(text, dic):
    list = []
    i = 0
    while i < len(text):
        long_word = text[i]
        for j in range(i + 1, len(text) + 1):
            word = text[i:j]
            if word in dic:
                if len(word) > len(long_word):
                    long_word = word
        list.append(long_word)
        i += len(long_word)
    return list

算法的原理:首先通過while循環(huán)判斷i是否超出了字符串的大小,如果沒有,獲取當(dāng)前第一個字符串為第一個最長匹配結(jié)果,接著遍歷第一個字符串的所有可能組合結(jié)尾,如果在字典中,判斷當(dāng)前詞語是否大于前面的最長匹配結(jié)果,如果是替換掉最長。遍歷完成之后,將最長的結(jié)果添加到列表中,然后再獲取第二字符,遍歷所有結(jié)尾組合,獲取最長匹配。以此類推。

四、逆向最長匹配

既然了解了正向如何匹配,那么逆向算法應(yīng)該也很好寫。代碼如下:

def backward_segment(text, dic):
    list = []
    i = len(text) - 1
    while i >= 0:
        long_word = text[i]
        for j in range(0, i):
            word = text[j:i + 1]
            if word in dic:
                if len(word) > len(long_word):
                    long_word = word
                    break
        list.append(long_word)
        i -= len(long_word)
    return list

算法的原理:就是上面的正向反過來,但是這里并不是倒推文字,文字還是按語句的順序,但是長度是從最長到最短,也就是遇到第一個就可以返回了添加了。比正向最長匹配算法節(jié)約時間。

五、雙向最長匹配

雖然逆向比正向節(jié)約時間,但本身有一個很大的漏洞。假如我現(xiàn)在的句子中有一段“項目的”字符串,那么正向會出現(xiàn)“項目”,“的”兩個詞匯,而逆向會出現(xiàn):“項”,“目的”兩個詞匯。

為此,我們的算法工程師提出了新的匹配規(guī)則,雙向最長匹配。這是一種融合兩種匹配方法的復(fù)雜規(guī)則,流程如下:

同時執(zhí)行正向和逆向最長匹配,若兩者的詞數(shù)不同,則返回詞數(shù)更少的一個否則,返回兩者中單字更少的那一個。當(dāng)單字也相同時,優(yōu)先返回逆向最長匹配結(jié)果

具體代碼如下:

#統(tǒng)計單字個數(shù)
def count_single_char(list):
    return sum(1 for word in list if len(word) == 1)

#雙向匹配算法
def bidirectional_segment():
    f = forward_segment("在絕對實力面前,一切的說辭都是枉然", dic)
    b = backward_segment("在絕對實力面前,一切的說辭都是枉然", dic)
    if len(f) < len(b):
        return f
    elif len(f) > len(b):
        return b
    else:
        if count_single_char(f)<count_single_char(b):
            return f
        else:
            return b

到此這篇關(guān)于Python自然語言處理之切分算法詳解的文章就介紹到這了,更多相關(guān)python切分算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django 實現(xiàn)圖片上傳和顯示過程詳解

    Django 實現(xiàn)圖片上傳和顯示過程詳解

    這篇文章主要介紹了Django 實現(xiàn)圖片上傳和顯示過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 利用python和ffmpeg 批量將其他圖片轉(zhuǎn)換為.yuv格式的方法

    利用python和ffmpeg 批量將其他圖片轉(zhuǎn)換為.yuv格式的方法

    今天小編就為大家分享一篇利用python和ffmpeg 批量將其他圖片轉(zhuǎn)換為.yuv格式的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python os.path模塊使用方法介紹

    python os.path模塊使用方法介紹

    os.path 模塊是系統(tǒng)路徑操作模塊,但實際的原理可以把它認為是處理包含斜杠("/")和反斜杠("\")字符串的模塊,其中,斜杠("/")是 linux 系統(tǒng)下的路徑分隔符,和反斜杠("\")是 windows 系統(tǒng)下的路徑分隔符
    2022-08-08
  • python如何查看微信消息撤回

    python如何查看微信消息撤回

    這篇文章主要為大家詳細介紹了python實現(xiàn)查看微信消息撤回的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 如何實現(xiàn)python爬蟲爬取視頻時實現(xiàn)實時進度條顯示

    如何實現(xiàn)python爬蟲爬取視頻時實現(xiàn)實時進度條顯示

    這篇文章主要介紹了如何實現(xiàn)python爬蟲爬取視頻時實現(xiàn)實時進度條顯示,在爬取并下載網(wǎng)頁上的視頻的時候,我們需要實時進度條,這可以幫助我們更直觀的看到視頻的下載進度。文章圍繞主題展開更多內(nèi)容,需要的小伙伴可以參考一下
    2022-06-06
  • python中threading和queue庫實現(xiàn)多線程編程

    python中threading和queue庫實現(xiàn)多線程編程

    這篇文章主要介紹了python中threading和queue庫實現(xiàn)多線程編程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Flask框架各種常見裝飾器示例

    Flask框架各種常見裝飾器示例

    這篇文章主要介紹了Flask框架各種常見裝飾器,結(jié)合實例形式簡單分析了flask框架各種常見裝飾器的功能、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-07-07
  • Python中NumPy的數(shù)組拆分

    Python中NumPy的數(shù)組拆分

    這篇文章主要介紹了Python中NumPy的數(shù)組拆分,我們使用array_split()分割數(shù)組,將要分割的數(shù)組和分割數(shù)傳遞給它,如果將一個數(shù)組拆分為 3 個數(shù)組,則可以像使用任何數(shù)組元素一樣從結(jié)果中訪問它們,需要的朋友可以參考下
    2023-07-07
  • Python批量模糊匹配的3種方法實例

    Python批量模糊匹配的3種方法實例

    模糊匹配可以算是現(xiàn)代編輯器的一個必備特性了,它所做的就是根據(jù)用戶輸入的部分內(nèi)容,猜測用戶想要的文件名,并提供一個推薦列表供用戶選擇,下面這篇文章主要給大家介紹了關(guān)于Python批量模糊匹配的3種方法,需要的朋友可以參考下
    2022-03-03
  • Python json解析庫jsonpath原理及使用示例

    Python json解析庫jsonpath原理及使用示例

    這篇文章主要介紹了Python json解析庫jsonpath原理及使用示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

新兴县| 武邑县| 沅陵县| 抚顺县| 来宾市| 孝义市| 梅州市| 和硕县| 石首市| 上犹县| 象山县| 贡觉县| 台南县| 孟津县| 石棉县| 南华县| 南溪县| 南岸区| 三明市| 遂川县| 呼和浩特市| 连南| 陆河县| 文安县| 林甸县| 门源| 恩施市| 上高县| 长葛市| 宿州市| 旌德县| 淮北市| 无锡市| 德清县| 岫岩| 宁远县| 嘉兴市| 健康| 会东县| 沙田区| 远安县|