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

Python預(yù)測(cè)分詞的實(shí)現(xiàn)

 更新時(shí)間:2021年06月17日 16:57:31   作者:一天一篇Python庫(kù)  
本文將結(jié)合實(shí)例代碼,介紹Python預(yù)測(cè)分詞的實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在機(jī)器學(xué)習(xí)中,我們有了訓(xùn)練集的話,就開(kāi)始預(yù)測(cè)。預(yù)測(cè)是指利用模型對(duì)句子進(jìn)行推斷的過(guò)程。在中文分詞任務(wù)中也就是利用模型推斷分詞序列,同時(shí)也叫解碼。

在HanLP庫(kù)中,二元語(yǔ)法的解碼由ViterbiSegment分詞器提供。本篇將詳細(xì)介紹ViterbiSegment的使用方式

加載模型

在前篇博文中,我們已經(jīng)得到了訓(xùn)練的一元,二元語(yǔ)法模型。后續(xù)的處理肯定會(huì)基于這幾個(gè)文件來(lái)處理。所以,我們首先要做的就是加載這些模型到程序中:

if __name__ == "__main__":
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    print(CoreDictionary.getTermFrequency("秦機(jī)"))
    print(CoreBiGramTableDictionary.getBiFrequency("秦機(jī)","的"))

運(yùn)行之后,效果如下:

頻次

這里我們使用CoreDictionary.getTermFrequency()方法獲取”秦機(jī)“的頻次。使用CoreBiGramTableDictionary.getBiFrequency()方法獲取“秦機(jī) 的”的二元語(yǔ)法頻次。

構(gòu)建詞網(wǎng)

在前文中我們介紹了符號(hào)“末##末“,代表句子結(jié)尾,”始##始“代表句子開(kāi)頭。而詞網(wǎng)指的是句子中所有一元語(yǔ)法構(gòu)成的網(wǎng)狀結(jié)構(gòu)。比如MSR詞典中的“秦機(jī)和科技”這個(gè)句子,是給定的一元詞典。我們將句子中所有單詞找出來(lái)。得到如下詞網(wǎng):

[始##始]
[秦機(jī)]
[]
[和,和科]
[科技]
[技]
[末##末]

對(duì)應(yīng)的此圖如下所示:

科技

當(dāng)然,這里博主只是舉例說(shuō)明詞網(wǎng)的概念,“和科”并不是一個(gè)單詞。

下面,我們來(lái)通過(guò)方法構(gòu)建詞網(wǎng)。具體代碼如下:

def build_wordnet(sent, trie):
    JString = JClass('java.lang.String')
    Vertex = JClass('com.hankcs.hanlp.seg.common.Vertex')
    WordNet = JClass('com.hankcs.hanlp.seg.common.WordNet')
    searcher = trie.getSearcher(JString(sent), 0)
    wordnet = WordNet(sent)
    while searcher.next():
        wordnet.add(searcher.begin + 1,
                    Vertex(sent[searcher.begin:searcher.begin + searcher.length], searcher.value, searcher.index))
    # 原子分詞,保證圖連通
    vertexes = wordnet.getVertexes()
    i = 0
    while i < len(vertexes):
        if len(vertexes[i]) == 0:  # 空白行
            j = i + 1
            for j in range(i + 1, len(vertexes) - 1):  # 尋找第一個(gè)非空行 j
                if len(vertexes[j]):
                    break
            wordnet.add(i, Vertex.newPunctuationInstance(sent[i - 1: j - 1]))  # 填充[i, j)之間的空白行
            i = j
        else:
            i += len(vertexes[i][-1].realWord)

    return wordnet


if __name__ == "__main__":
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    print(build_wordnet("秦機(jī)和科技", CoreDictionary.trie))

運(yùn)行之后,我們會(huì)得到與上圖歸納差不多的內(nèi)容:

效果

維特比算法

如果現(xiàn)在我們賦予上述詞圖每條邊以二元語(yǔ)法的概率作為距離,那么如何求解詞圖上的最短路徑就是一個(gè)關(guān)鍵問(wèn)題。

假設(shè)文本長(zhǎng)度為n,則一共有2(n-1次方)種切分方式,因?yàn)槊?個(gè)字符間都有2種選擇:切或者不切,時(shí)間復(fù)雜度就為O(2(n-1次方))。顯然不切實(shí)際,這里我們考慮使用維特比算法。

維特比算法原理:它分為前向和后向兩個(gè)步驟。

  • 前向:由起點(diǎn)出發(fā)從前往后遍歷節(jié)點(diǎn),更新從起點(diǎn)到該節(jié)點(diǎn)的最下花費(fèi)以及前驅(qū)指針
  • 后向:由終點(diǎn)出發(fā)從后往前回溯前驅(qū)指針,取得最短路徑

維特比算法用python代碼的實(shí)現(xiàn)如下:

def viterbi(wordnet):
    nodes = wordnet.getVertexes()
    # 前向遍歷
    for i in range(0, len(nodes) - 1):
        for node in nodes[i]:
            for to in nodes[i + len(node.realWord)]:
                # 根據(jù)距離公式計(jì)算節(jié)點(diǎn)距離,并維護(hù)最短路徑上的前驅(qū)指針from
                to.updateFrom(node)
    # 后向回溯
    # 最短路徑
    path = []
    # 從終點(diǎn)回溯
    f = nodes[len(nodes) - 1].getFirst()
    while f:
        path.insert(0, f)
        # 按前驅(qū)指針from回溯
        f = f.getFrom()
    return [v.realWord for v in path]

實(shí)戰(zhàn)

現(xiàn)在我們來(lái)做個(gè)測(cè)試,我們?cè)趍sr_test_gold.utf8上訓(xùn)練模型,為秦機(jī)和科技常見(jiàn)詞圖,最后運(yùn)行維特比算法。詳細(xì)代碼如下所示:

if __name__ == "__main__":
    MODEL_PATH = "123"
    corpus_path = r"E:\ProgramData\Anaconda3\Lib\site-packages\pyhanlp\static\data\test\icwb2-data\gold\msr_test_gold.utf8"
    train_model(corpus_path, MODEL_PATH)
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    ViterbiSegment = JClass('com.hankcs.hanlp.seg.Viterbi.ViterbiSegment')
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    sent = "秦機(jī)和科技"
    wordnet = build_wordnet(sent, CoreDictionary.trie)
    print(viterbi(wordnet))

效果

有的人可能有疑問(wèn),因?yàn)槎P屠?,本身就存在秦機(jī) 和
科技這個(gè)樣本。這么做不是多此一舉嗎?那好,我們替換sent的文本內(nèi)容為“北京和廣州”,這個(gè)樣本可不在模型中。運(yùn)行之后,效果如下:

效果如下

我們發(fā)現(xiàn)依然能正確的分詞為[北京 和 廣州],這就是二元語(yǔ)法模型的泛化能力。至此我們走通了語(yǔ)料標(biāo)注,訓(xùn)練模型,預(yù)測(cè)分詞結(jié)果的完整步驟。

到此這篇關(guān)于Python預(yù)測(cè)分詞的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python預(yù)測(cè)分詞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn).gif圖片拆分為.png圖片的簡(jiǎn)單示例

    Python實(shí)現(xiàn).gif圖片拆分為.png圖片的簡(jiǎn)單示例

    有時(shí)候需要把GIF圖片分解成一張一張的靜態(tài)圖,jpg或者png格式,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn).gif圖片拆分為.png圖片的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Python實(shí)現(xiàn)自動(dòng)發(fā)消息自定義內(nèi)容的操作代碼

    Python實(shí)現(xiàn)自動(dòng)發(fā)消息自定義內(nèi)容的操作代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)自動(dòng)發(fā)消息自定義內(nèi)容的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python實(shí)現(xiàn)滑塊驗(yàn)證碼詳解

    Python實(shí)現(xiàn)滑塊驗(yàn)證碼詳解

    驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實(shí)現(xiàn)滑塊驗(yàn)證碼
    2022-05-05
  • educoder之Python數(shù)值計(jì)算庫(kù)Numpy圖像處理詳解

    educoder之Python數(shù)值計(jì)算庫(kù)Numpy圖像處理詳解

    這篇文章主要為大家介紹了educoder之Python數(shù)值計(jì)算庫(kù)Numpy圖像處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • python flask框架快速入門

    python flask框架快速入門

    Flask 本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展,都需要用第三方的擴(kuò)展來(lái)實(shí)現(xiàn),本文給大家分享如何快速入門python flask框架,感興趣的朋友一起看看吧
    2021-05-05
  • Python實(shí)現(xiàn)簡(jiǎn)單層次聚類算法以及可視化

    Python實(shí)現(xiàn)簡(jiǎn)單層次聚類算法以及可視化

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單層次聚類算法以及可視化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 基于Python實(shí)現(xiàn)個(gè)人手機(jī)定位分析

    基于Python實(shí)現(xiàn)個(gè)人手機(jī)定位分析

    TransBigData是一個(gè)為交通時(shí)空大數(shù)據(jù)處理、分析和可視化而開(kāi)發(fā)的Python包。本文就來(lái)用它實(shí)現(xiàn)個(gè)人手機(jī)定位分析,感興趣的小伙伴可以了解一下
    2023-04-04
  • python實(shí)現(xiàn)調(diào)用攝像頭并拍照發(fā)郵箱

    python實(shí)現(xiàn)調(diào)用攝像頭并拍照發(fā)郵箱

    這篇文章主要介紹了python實(shí)現(xiàn)調(diào)用攝像頭并拍照發(fā)郵箱的程序,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • pandas.DataFrame.iloc的具體使用詳解

    pandas.DataFrame.iloc的具體使用詳解

    本文主要介紹了pandas.DataFrame.iloc的具體使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python檢查判斷一個(gè)數(shù)是不是另一個(gè)數(shù)的整數(shù)次冪實(shí)例深究

    Python檢查判斷一個(gè)數(shù)是不是另一個(gè)數(shù)的整數(shù)次冪實(shí)例深究

    在數(shù)學(xué)和計(jì)算中,確定一個(gè)數(shù)是否為另一個(gè)數(shù)的整數(shù)次冪是一個(gè)常見(jiàn)而重要的問(wèn)題,例如,我們可能需要判斷一個(gè)數(shù)是否是某個(gè)數(shù)的平方、立方或其他冪次,本文將探討在Python中如何實(shí)現(xiàn)這一功能,通過(guò)數(shù)學(xué)方法和算法檢查一個(gè)數(shù)是否是另一個(gè)數(shù)的整數(shù)次冪
    2023-12-12

最新評(píng)論

石家庄市| 收藏| 连州市| 三台县| 丘北县| 沁阳市| 许昌市| 财经| 滦平县| 叙永县| 民乐县| 麻城市| 海淀区| 洛隆县| 西贡区| 郴州市| 旬阳县| 望奎县| 手机| 绍兴县| 惠水县| 子洲县| 永吉县| 深圳市| 镇沅| 招远市| 吉安县| 万源市| 吐鲁番市| 黎川县| 固始县| 莱芜市| 旺苍县| 冷水江市| 汉源县| 安塞县| 晋宁县| 额尔古纳市| 辽宁省| 枣强县| 台东市|