Python自然語言處理之詞干,詞形與最大匹配算法代碼詳解
本文主要對(duì)詞干提取及詞形還原以及最大匹配算法進(jìn)行了介紹和代碼示例,Python實(shí)現(xiàn),下面我們一起看看具體內(nèi)容。
自然語言處理中一個(gè)很重要的操作就是所謂的stemming和lemmatization,二者非常類似。它們是詞形規(guī)范化的兩類重要方式,都能夠達(dá)到有效歸并詞形的目的,二者既有聯(lián)系也有區(qū)別。
1、詞干提?。╯temming)
定義:Stemmingistheprocessforreducinginflected(orsometimesderived)wordstotheirstem,baseorrootform—generallyawrittenwordform.
解釋一下,Stemming是抽取詞的詞干或詞根形式(不一定能夠表達(dá)完整語義)。
NLTK中提供了三種最常用的詞干提取器接口,即Porterstemmer,LancasterStemmer和SnowballStemmer。
PorterStemmer基于Porter詞干提取算法,來看例子
>>> from nltk.stem.porter import PorterStemmer >>> porter_stemmer = PorterStemmer() >>> porter_stemmer.stem(‘maximum') u'maximum' >>> porter_stemmer.stem(‘presumably') u'presum' >>> porter_stemmer.stem(‘multiply') u'multipli' >>> porter_stemmer.stem(‘provision') u'provis' >>> porter_stemmer.stem(‘owed') u'owe'
Lancaster Stemmer 基于Lancaster 詞干提取算法,來看例子
>>> from nltk.stem.lancaster import LancasterStemmer >>> lancaster_stemmer = LancasterStemmer() >>> lancaster_stemmer.stem(‘maximum') ‘maxim' >>> lancaster_stemmer.stem(‘presumably') ‘presum' >>> lancaster_stemmer.stem(‘presumably') ‘presum' >>> lancaster_stemmer.stem(‘multiply') ‘multiply' >>> lancaster_stemmer.stem(‘provision') u'provid' >>> lancaster_stemmer.stem(‘owed') ‘ow'
Snowball Stemmer基于Snowball 詞干提取算法,來看例子
>>> from nltk.stem import SnowballStemmer >>> snowball_stemmer = SnowballStemmer(“english”) >>> snowball_stemmer.stem(‘maximum') u'maximum' >>> snowball_stemmer.stem(‘presumably') u'presum' >>> snowball_stemmer.stem(‘multiply') u'multipli' >>> snowball_stemmer.stem(‘provision') u'provis' >>> snowball_stemmer.stem(‘owed') u'owe'
2、詞形還原(lemmatization)
定義:Lemmatisation(orlemmatization)inlinguistics,istheprocessofgroupingtogetherthedifferentinflectedformsofawordsotheycanbeanalysedasasingleitem.
可見,Lemmatisation是把一個(gè)任何形式的語言詞匯還原為一般形式(能表達(dá)完整語義)。相對(duì)而言,詞干提取是簡單的輕量級(jí)的詞形歸并方式,最后獲得的結(jié)果為詞干,并不一定具有實(shí)際意義。詞形還原處理相對(duì)復(fù)雜,獲得結(jié)果為詞的原形,能夠承載一定意義,與詞干提取相比,更具有研究和應(yīng)用價(jià)值。
我們會(huì)在后面給出一個(gè)同MaxMatch算法相結(jié)合的更為復(fù)雜的例子。
這里介紹下詞干提取和詞形還原的聯(lián)系與區(qū)別:
詞形還原(lemmatization),是把一個(gè)任何形式的語言詞匯還原為一般形式(能表達(dá)完整語義),而詞干提取
(stemming)是抽取詞的詞干或詞根形式(不一定能夠表達(dá)完整語義)。詞形還原和詞干提取是詞形規(guī)范化的兩類
重要方式,都能夠達(dá)到有效歸并詞形的目的,二者既有聯(lián)系也有區(qū)別
現(xiàn)將共同點(diǎn)和聯(lián)系總結(jié)為以下4方面:
(1)目標(biāo)一致。詞干提取和詞形還原的目標(biāo)均為將詞的屈折形態(tài)或派生形態(tài)簡化或歸并為詞干(stem)
或原形的基礎(chǔ)形式,都是一種對(duì)詞的不同形態(tài)的統(tǒng)一歸并的過程。
(2)結(jié)果部分交叉。詞干提取和詞形還原不是互斥關(guān)系,其結(jié)果是有部分交叉的。一部分詞利用這兩類方法都能達(dá)到相同的詞形轉(zhuǎn)換效果。如“dogs”的詞
干為“dog”,其原形也為“dog”。
(3)主流實(shí)現(xiàn)方法類似。目前實(shí)現(xiàn)詞干提取和詞形還原的主流實(shí)現(xiàn)方法均是利用語言中存在的規(guī)則或利用詞典映射提取詞干或獲得詞的原形。
(4)應(yīng)用領(lǐng)域相似。主要應(yīng)用于信息檢索和文本、自然語言處理等方面,二者均是這些應(yīng)用的基本步驟
二者的區(qū)別歸納為以下5方面:
(1)在原理上,詞干提取主要是采用“縮減”的方法,將詞轉(zhuǎn)換為詞干,如將“cats”處理為“cat”,將“effective”處理為“effect”。而詞形還原主要采用“轉(zhuǎn)變”
的方法,將詞轉(zhuǎn)變?yōu)槠湓危鐚ⅰ癲rove”處理為“drive”,將“driving”處理為“drive”。
(2)在復(fù)雜性上,詞干提取方法相對(duì)簡單,詞形還原則需要返回詞的原形,需要對(duì)詞形進(jìn)行分析,不僅要進(jìn)行詞綴的轉(zhuǎn)化,還要進(jìn)行詞性識(shí)別,區(qū)分相同詞形但
原形不同的詞的差別。詞性標(biāo)注的準(zhǔn)確率也直接影響詞形還原的準(zhǔn)確率,因此,詞形還原更為復(fù)雜。
(3)在實(shí)現(xiàn)方法上,雖然詞干提取和詞形還原實(shí)現(xiàn)的主流方法類似,但二者在具體實(shí)現(xiàn)上各有側(cè)重。詞干提取的實(shí)現(xiàn)方法主要利用規(guī)則變化進(jìn)行詞綴的去除和縮減,從而達(dá)到詞的簡化效果。詞形還原則相對(duì)較復(fù)雜,有復(fù)雜的形態(tài)變化,單純依據(jù)規(guī)則無法很好地完成。其更依賴于詞典,進(jìn)行詞形變化和原形的映射,生成詞典中的有效詞。
(4)在結(jié)果上,詞干提取和詞形還原也有部分區(qū)別。詞干提取的結(jié)果可能并不是完整的、具有意義的詞,而只是詞的一部分,如“revival”詞干提取的結(jié)果為“reviv”,“ailiner”詞干提取的結(jié)果為“airlin”。而經(jīng)詞形還原處理后獲得的結(jié)果是具有一定意義的、完整的詞,一般為詞典中的有效詞。
(5)在應(yīng)用領(lǐng)域上,同樣各有側(cè)重。雖然二者均被應(yīng)用于信息檢索和文本處理中,但側(cè)重不同。詞干提取更多被應(yīng)用于信息檢索領(lǐng)域,如Solr、Lucene等,用于擴(kuò)展檢索,粒度較粗。詞形還原更主要被應(yīng)用于文本挖掘、自然語言處理,用于更細(xì)粒度、更為準(zhǔn)確的文本分析和表達(dá)
相對(duì)而言,詞干提取是簡單的輕量級(jí)的詞形歸并方式,最后獲得的結(jié)果為詞干,并不一定具有實(shí)際意義。詞形還原處理相對(duì)復(fù)雜,獲得結(jié)果為詞的原形,能夠承載一定意義,與詞干提取相比,更具有研究和應(yīng)用價(jià)值
3、最大匹配算法(MaxMatch)
MaxMatch算法在中文自然語言處理中常常用來進(jìn)行分詞(或許從名字上你已經(jīng)能想到它是基于貪婪策略設(shè)計(jì)的一種算法)。通常,英語中一句話里的各個(gè)詞匯之間通過空格來分割,這是非常straightforward的,但是中文卻沒有這個(gè)遍歷。例如“我愛中華人民共和國”,這句話被分詞的結(jié)果可能是這樣的{‘我',‘愛',‘中華',‘人民',‘共和國'},又或者是{‘我',‘愛',‘中華人民共和國'},顯然我們更傾向于后者的分詞結(jié)果。因?yàn)椤腥A人民共和國'顯然是一個(gè)專有名詞(把這樣一個(gè)詞分割來看顯然并不明智)。我們選擇后者的策略就是所謂的MaxMatch,即最大匹配。因?yàn)椤腥A人民共和國'這個(gè)詞顯然要比‘中華',‘人民',‘共和國'這些詞都長。
我們可以通過一個(gè)英文的例子來演示MaxMatch算法(其實(shí)中文處理的道理也是一樣的)。算法從右側(cè)開始逐漸減少字符串長度,以此求得可能匹配的最大長度的字符串。考慮到我們所獲得的詞匯可能包含有某種詞型的變化,所以其中使用了Lemmatisation,然后在詞庫里進(jìn)行匹配查找。
from nltk.stem import WordNetLemmatizer from nltk.corpus import words wordlist = set(words.words()) wordnet_lemmatizer = WordNetLemmatizer() def max_match(text): pos2 = len(text) result = '' while len(text) > 0: word = wordnet_lemmatizer.lemmatize(text[0:pos2]) if word in wordlist: result = result + text[0:pos2] + ' ' text = text[pos2:] pos2 = len(text) else: pos2 = pos2-1 return result[0:-1]
來看看算法的實(shí)現(xiàn)效果
>>> string = 'theyarebirds' >>> print(max_match(string)) they are birds
當(dāng)然,上述代碼尚有一個(gè)不足,就是當(dāng)字符串中存在非字母字符時(shí)(例如數(shù)字標(biāo)點(diǎn)等),它可能會(huì)存在一些問題。有興趣的讀者不妨自己嘗試完善改進(jìn)這個(gè)版本的實(shí)現(xiàn)。
總結(jié)
以上就是本文關(guān)于Python自然語言處理之詞干,詞形與MaxMatch算法代碼詳解的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
如有不足之處,歡迎留言指出。
- python自然語言處理之字典樹知識(shí)總結(jié)
- Python自然語言處理之切分算法詳解
- Python自然語言處理 NLTK 庫用法入門教程【經(jīng)典】
- Python編程使用NLTK進(jìn)行自然語言處理詳解
- 用Python進(jìn)行一些簡單的自然語言處理的教程
- python第三方庫visdom的使用入門教程
- Python自動(dòng)安裝第三方庫的小技巧(pip使用詳解)
- Python文件名的匹配之clob庫
- Python的文本常量與字符串模板之string庫
- python爬蟲請(qǐng)求庫httpx和parsel解析庫的使用測評(píng)
- 能讓你輕松的實(shí)現(xiàn)自然語言處理的5個(gè)Python庫
相關(guān)文章
解決python升級(jí)引起的pip執(zhí)行錯(cuò)誤的問題
今天小編就為大家分享一篇解決python升級(jí)引起的pip執(zhí)行錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python 讀取文件并把矩陣轉(zhuǎn)成numpy的兩種方法
今天小編就為大家分享一篇python 讀取文件并把矩陣轉(zhuǎn)成numpy的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02python函數(shù)的默認(rèn)參數(shù)請(qǐng)勿定義可變類型詳解
這篇文章主要介紹了python函數(shù)的默認(rèn)參數(shù)請(qǐng)勿定義可變類型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Python實(shí)現(xiàn)提取或替換PPT中文本與圖片的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)提取保存ppt中的圖片和替換ppt模板的文本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01pandas的排序、分組groupby及cumsum累計(jì)求和方式
這篇文章主要介紹了pandas的排序、分組groupby及cumsum累計(jì)求和方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python計(jì)算機(jī)視覺OpenCV庫實(shí)現(xiàn)實(shí)時(shí)攝像頭人臉檢測示例
這篇文章主要為大家介紹了python使用OpenCV實(shí)現(xiàn)實(shí)時(shí)攝像頭人臉檢測的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10python獲取元素在數(shù)組中索引號(hào)的方法
這篇文章主要介紹了python獲取元素在數(shù)組中索引號(hào)的方法,實(shí)例分析了Python中index方法的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07python實(shí)現(xiàn)時(shí)間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程
這篇文章主要介紹了python實(shí)現(xiàn)時(shí)間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06pandas DataFrame 根據(jù)多列的值做判斷,生成新的列值實(shí)例
今天小編就為大家分享一篇pandas DataFrame 根據(jù)多列的值做判斷,生成新的列值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05