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

Python自然語言處理詞匯分析技術(shù)實(shí)戰(zhàn)

 更新時間:2024年01月17日 10:45:19   作者:李長安  
這篇文章為大家介紹了Python自然語言處理詞匯分析技術(shù)實(shí)戰(zhàn),主要對詞匯分析進(jìn)行介紹,一些語言方面的基礎(chǔ)知識(詞性、詞語規(guī)范化),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

摘要

本系列為自然語言處理導(dǎo)論與Python實(shí)踐系列的第一篇,主要對詞匯分析進(jìn)行介紹,一些語言方面的基礎(chǔ)知識(詞性、詞語規(guī)范化)需要大家自行閱讀《自然語言處理導(dǎo)論》第二章。詞匯分析主要包含分詞與詞性標(biāo)注兩部分,分詞部分將以中文分詞為例進(jìn)行介紹。

最近在學(xué)習(xí)自然語言處理也可以說是入門,找到了一本覺得比較好的書《自然語言處理導(dǎo)論》,但是我在閱讀的過程中發(fā)現(xiàn)缺少了對應(yīng)的代碼實(shí)踐,所以就萌生了完成對應(yīng)算法的Python實(shí)踐的想法。通過復(fù)現(xiàn)對應(yīng)的算法也能夠加深對算法的理解。本系列將根據(jù)《自然語言處理導(dǎo)論》書中的脈絡(luò)復(fù)現(xiàn)對應(yīng)的算法,也是非常適合小白入門學(xué)習(xí),我們大家一起學(xué)習(xí),如有錯誤的地方歡迎在評論區(qū)指正。此外,本系列教程將從書中開始有算法的地方進(jìn)行介紹,略過了一些理論部分,包括自然語言處理的基本概念、處理范式;等前置基礎(chǔ)知識,大家可以通過閱讀《自然語言處理導(dǎo)論》來跟上本教程的節(jié)奏。

詞匯分析

本系列為自然語言處理導(dǎo)論與Python實(shí)踐系列的第一篇,主要對詞匯分析進(jìn)行介紹,一些語言方面的基礎(chǔ)知識(詞性、詞語規(guī)范化)需要大家自行閱讀《自然語言處理導(dǎo)論》第二章。詞匯分析主要包含分詞與詞性標(biāo)注兩部分,分詞部分將以中文分詞為例進(jìn)行介紹。

中文分詞

中文分詞(Chinese Word Segmentation,CWS)是指將連續(xù)字序列轉(zhuǎn)換為對應(yīng)的詞序列的過程,也 可以看做在輸入的序列中添加空格或其他邊界標(biāo)記的過程。中文分詞任務(wù)可以形式化表示為:給定中文句子 c1,c2,⋅⋅⋅,cn,c1,c2,⋅⋅⋅,cn, 其中 cici 為單個字符,輸出詞序列 w1,w2,⋅⋅⋅,wm,w1,w2,⋅⋅⋅,wm, 其中 wjwj 是中文單詞。

例如:

            復(fù)旦大學(xué)是中國人自主創(chuàng)辦的第一所高等院校。 
            分詞結(jié)果:復(fù)旦大學(xué) | 是 | 中國人 | 自主 | 創(chuàng)辦 | 的 | 第一 | 所 | 高等 | 院校 |。

基于最大匹配的中文分詞

最大匹配(Maximum Matching)分詞算法主要包含前向最大匹配,后向最大匹配以及雙向最大匹配等三類。在這里我們以正向匹配為例對該算法進(jìn)行介紹。

例如:針對句子 “他是研究生物化學(xué)的一位科學(xué)家”,前向最大分詞的過程如表2.2所示。為簡單起見,詞典中詞語最大長度假設(shè)為 4,詞表為 {“他”,“是”, “研究”, “生物化學(xué)”, “的”, “一”, “位”, “科學(xué)家”}。如上圖。我們固定住頭,即『他』。我們從句子末尾開始向前找,“他是研究”有沒有在詞典里。有,就當(dāng)成分詞。不是的話前移,直到『他』;依次類推,直到完成整個句子的切分,下面將通過代碼展示前向最大匹配算法流程。

前向最大匹配算法(Forward Max Matching,F(xiàn)MM)

dic=['他','是', '研究', '生物化學(xué)', '的', '一', '位', '科學(xué)家'] 
sentence = "他是研究生物化學(xué)的一位科學(xué)家"

start = 0
while start != len(sentence):
    index = len(sentence)
    for i in range(len(sentence)):
        if sentence[start : index] in dic:
            print(sentence[start : index], end='/')
            start = index
            break
        index += -1

 他/是/研究/生物化學(xué)/的/一/位/科學(xué)家/

后向最大匹配算法(Backward Max Matching,BMM)

dic=['他','是', '研究', '生物化學(xué)', '的', '一', '位', '科學(xué)家'] 
sentence = "他是研究生物化學(xué)的一位科學(xué)家"

result = []
start = len(sentence)
while start != 0:
    index = 0
    for i in range(len(sentence)):
        if sentence[index: start] in dic:
            result.append(sentence[index:start])
            start = index
            break
        index += 1
 
for i in result[::-1]:
    print(i,end='/')

他/是/研究/生物化學(xué)/的/一/位/科學(xué)家/ 

在上面的代碼中,start為句子的起始下標(biāo),index為從后往前移動的下標(biāo)。while循環(huán)每次找出一個分詞。當(dāng)start移到句子的最后一位上結(jié)束循環(huán)。內(nèi)部的for循環(huán)是index移動過程,sentence[start:index]在詞典里面時,就跳出循環(huán)。更新start值,尋找下一個分詞。反向最大匹配算法與前向最大匹配算法類似,index從前往后移動即可,但要注意輸出需要反轉(zhuǎn)一下。

擴(kuò)展閱讀

對于FMM,BMM的分詞結(jié)果,可以通過指定規(guī)則來確定最終結(jié)果。兩種方法的分詞結(jié)果,選擇分詞數(shù)最少的;分詞數(shù)一樣的再判斷句子中的單字?jǐn)?shù),誰的單字?jǐn)?shù)越少,就誰的認(rèn)為分詞效果越好。即為雙向最大匹配算法(Backward Max Matching,BIMM)

基于詞典的分詞方法優(yōu)缺點(diǎn)

  • 簡單、快速、可控、僅依賴詞表
  • 沒有在詞典中出現(xiàn)的詞沒有很好的處理方案,同時對于分詞歧義的處理能力也不足

基于線性鏈條件隨機(jī)場的中文分詞

簡單來說基于線性鏈條件隨機(jī)場的中文分詞,就是通過條件隨機(jī)場對句子的輸入序列進(jìn)行建模,完成分詞的過程,對序列任務(wù)進(jìn)行建模時,通常使用鏈?zhǔn)浇Y(jié)構(gòu),即線性鏈條件隨機(jī)場(Linear-chain CRF)。根據(jù)中文分詞任務(wù)定義,我們可以將分詞過程看做是對于字的分類。具體來說,對于輸入句子中的每一個字$ ci,根據(jù)它在分詞結(jié)果中的位置賦予不同的標(biāo)簽??梢约僭O(shè)一個字在詞語中有四個位置:開始,根據(jù)它在分詞結(jié)果中的位置賦予不同的標(biāo)簽。可以假設(shè)一個字在詞語中有四個位置:開始(B)、中間、中間(I)、結(jié)尾、結(jié)尾(E)以及單獨(dú)成詞以及單獨(dú)成詞(S)$。

例如:

    輸入句子:他是研究生物化學(xué)的一位科學(xué)家。 

    分詞結(jié)果:他 | 是 | 研究 | 生物化學(xué) | 的 | 一 | 位 | 科學(xué)家 |。 

    對應(yīng)標(biāo)記:他/S 是/S 研/B 究/E 生/B 物/I 化/I 學(xué)/E 的/S 一/B 位/E 科/B 學(xué)/I 家/E 。/S 

這里的“字”不僅包含漢字,還包含英文字母、數(shù)字、標(biāo)點(diǎn)符號等所有可能出現(xiàn)在漢語文本中的符號。通過 BIESBIES 標(biāo)簽可以將分詞問題轉(zhuǎn)換為字的分類問題。

條件隨機(jī)場(Conditional Random Field,CRF)試圖對多個變量在給定觀測值后的條件概率進(jìn)行建模。x=xl,x2,...,xnx=xl,x2,...,xn 為觀測序列,y=yl,y2,...,yny=yl,y2,...,yn 為對應(yīng)的標(biāo)記序列,條件隨機(jī)場的目標(biāo)是構(gòu)建條件概率模型 P(y∣x)P(y∣x)。在中文分詞任務(wù)中,觀察序列 xx 對應(yīng)輸入的字序列 c1,c2,⋅⋅⋅,cnc1,c2,⋅⋅⋅,cn,標(biāo)記序列為每個字對應(yīng)的 BIESBIES 標(biāo)簽。在實(shí)際應(yīng)用中,對序列任務(wù)進(jìn)行建模時,通常使用如下圖示的鏈?zhǔn)浇Y(jié)構(gòu),即線性鏈條件隨機(jī)場(Linear-chain CRF)。

條件隨機(jī)場(CRF)由Lafferty等人于2001年提出,結(jié)合了最大熵模型和隱馬爾可夫模型的特點(diǎn),是一種無向圖模型,常用于標(biāo)注或分析序列資料,如自然語言文字或是生物序列。近年來在分詞、詞性標(biāo)注和命名實(shí)體識別等序列標(biāo)注任務(wù)中取得了很好的效果。

安裝CRF++的python庫

!pip install crfpy

將訓(xùn)練語料標(biāo)注成B M E S存儲

def character_tagging(input_file,output_file):
    input_data = open(input_file,'r',encoding='UTF-8-sig')
    output_data = open(output_file,'w',encoding='UTF-8-sig')
    for line in input_data.readlines():
        word_list = line.strip().split()
        for word in word_list:
            if len(word)==1:
                output_data.write(word+'\tS\n')
            else:
                output_data.write(word[0]+'\tB\n')
                for w in word[1:len(word)-1]:
                    output_data.write(w+'\tM\n')
                output_data.write(word[len(word)-1]+'\tE\n')
        output_data.write('\n')
    input_data.close()
    output_data.close()
character_tagging('pku_training.utf8','pku_training_out.utf8')

使用CRF++工具訓(xùn)練條件隨機(jī)場中文分詞模型

需要注意的是,模型訓(xùn)練迭代次數(shù)默認(rèn)為10k,此處為了方便演示,僅僅設(shè)置了10次,如果需要較好的模型效果,建議按照默認(rèn)的迭代次數(shù)進(jìn)行訓(xùn)練。另外大家可以在終端中直接輸入crf_learn查看其命令參數(shù)的含義。

!crf_learn -f 3 -m 10 -c 4.0 template pku_training_out.utf8 crf_model

使用訓(xùn)練好的模型輸出結(jié)果

import codecs
import sys
import CRFPP
def crf_segmenter(input_file, output_file, tagger):
    input_data = codecs.open(input_file, 'r', 'utf-8')
    output_data = codecs.open(output_file, 'w', 'utf-8')
    for line in input_data.readlines():
        tagger.clear()
        for word in line.strip():
            word = word.strip()
            if word:
                tagger.add((word + "\to\tB").encode('utf-8'))
        tagger.parse()
        size = tagger.size()
        xsize = tagger.xsize()
        for i in range(0, size):
            for j in range(0, xsize):
                char = tagger.x(i, j).decode('utf-8')
                tag = tagger.y2(i)
                if tag == 'B':
                    output_data.write(' ' + char)
                elif tag == 'M':
                    output_data.write(char)
                elif tag == 'E':
                    output_data.write(char + ' ')
                else:
                    output_data.write(' ' + char + ' ')
        output_data.write('\n')
    input_data.close()
    output_data.close()
crf_model = crf_model
input_file = pku_training_out.utf8
output_file = pku_training_out_crf.utf8
tagger = CRFPP.Tagger("-m " + crf_model)
crf_segmenter(input_file, output_file, tagger)

CRF++庫簡介

CRF++ 是條件隨機(jī)場 (CRF) 的簡單、可定制和開源實(shí)現(xiàn),用于分割/標(biāo)記順序數(shù)據(jù)。 CRF++ 專為通用目的而設(shè)計(jì),將應(yīng)用于各種 NLP 任務(wù),例如命名實(shí)體識別、信息提取和文本分塊。

總結(jié)

基于線性鏈條件隨機(jī)場中文分詞方法可以有效地平衡訓(xùn)練語料中出現(xiàn)的詞語和未登錄詞,并且可以使用模板特征引入詞典信息。相較于基于詞典的方法,基于線性鏈條件隨機(jī)場中文分詞方法通常可以省略未登錄詞的識別模塊。但是需要注意的是,基于線性鏈條件隨機(jī)場的方法只能使用字作為特征。

經(jīng)過上面的介紹,相信大家對中文分詞方法已經(jīng)有了一些認(rèn)識,但是一些其他的基礎(chǔ)知識需要大家仔細(xì)閱讀相關(guān)書籍,包括什么是未登錄詞、詞素、漢藏語系、閃含語系、印歐語系等,大家都要有了解。下一期將和大家一起學(xué)習(xí)基于感知機(jī)的中文分詞算法,并且會根據(jù)相關(guān)論文進(jìn)行介紹。大家一起加油哦!希望大家以后多多支持腳本之家!

相關(guān)文章

  • python基于動態(tài)實(shí)例的命令處理設(shè)計(jì)實(shí)現(xiàn)詳解

    python基于動態(tài)實(shí)例的命令處理設(shè)計(jì)實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了python基于動態(tài)實(shí)例的命令處理設(shè)計(jì)實(shí)現(xiàn)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-08-08
  • Python中優(yōu)雅使用assert斷言的方法實(shí)例

    Python中優(yōu)雅使用assert斷言的方法實(shí)例

    我們在開發(fā)一個程序時候,與其讓它運(yùn)行時崩潰,不如在它出現(xiàn)錯誤條件時就崩潰(返回錯誤),這時候斷言assert就顯得非常有用,這篇文章主要給大家介紹了關(guān)于Python中優(yōu)雅使用assert斷言的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 淺談Python中的模塊

    淺談Python中的模塊

    這篇文章主要介紹了Python中的模塊相關(guān)知識,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Python實(shí)現(xiàn)的序列化和反序列化二叉樹算法示例

    Python實(shí)現(xiàn)的序列化和反序列化二叉樹算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的序列化和反序列化二叉樹算法,結(jié)合實(shí)例形式分析了Python二叉樹的構(gòu)造、遍歷、序列化、反序列化等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python帶參數(shù)的裝飾器運(yùn)行原理解析

    Python帶參數(shù)的裝飾器運(yùn)行原理解析

    這篇文章主要介紹了Python帶參數(shù)的裝飾器運(yùn)行原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • python語言中有算法嗎

    python語言中有算法嗎

    在本篇文章里小編給大家整理的是一篇關(guān)于python里算法的相關(guān)知識點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • python創(chuàng)建臨時文件夾的方法

    python創(chuàng)建臨時文件夾的方法

    這篇文章主要介紹了python創(chuàng)建臨時文件夾的方法,涉及Python基于tempfile模塊創(chuàng)建臨時文件夾的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • python中的函數(shù)用法入門教程

    python中的函數(shù)用法入門教程

    這篇文章主要介紹了python中的函數(shù)用法,包括了函數(shù)的定義及參數(shù)的各種注意事項(xiàng)等,對Python初學(xué)者有很好的借鑒價值,需要的朋友可以參考下
    2014-09-09
  • python安裝pandas庫不成功原因分析及解決辦法

    python安裝pandas庫不成功原因分析及解決辦法

    Pandas是python中非常常用的數(shù)據(jù)分析庫,在數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等領(lǐng)域經(jīng)常被使用,下面這篇文章主要給大家介紹了關(guān)于python安裝pandas庫不成功原因分析及解決辦法的相關(guān)資料
    2023-11-11
  • Python設(shè)計(jì)模式之抽象工廠模式原理與用法詳解

    Python設(shè)計(jì)模式之抽象工廠模式原理與用法詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之抽象工廠模式,簡單講述了抽象工廠模式的概念、原理并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用抽象工廠模式的相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01

最新評論

普兰县| 名山县| 武定县| 南部县| 井陉县| 蓬溪县| 洞口县| 冕宁县| 商南县| 马尔康县| 洱源县| 安仁县| 双鸭山市| 青田县| 获嘉县| 绿春县| 宁强县| 睢宁县| 汝阳县| 凯里市| 岳阳市| 上饶市| 滦南县| 彭山县| 衡山县| 临城县| 东城区| 安陆市| 衡山县| 龙南县| 桃江县| 喀喇| 达日县| 永寿县| 清苑县| 龙岩市| 赤壁市| 偏关县| 宿迁市| 兴安县| 成安县|