python中文分詞教程之前向最大正向匹配算法詳解
前言
大家都知道,英文的分詞由于單詞間是以空格進(jìn)行分隔的,所以分詞要相對(duì)的容易些,而中文就不同了,中文中一個(gè)句子的分隔就是以字為單位的了,而所謂的正向最大匹配和逆向最大匹配便是一種分詞匹配的方法,這里以詞典匹配說(shuō)明。
最大匹配算法是自然語(yǔ)言處理中的中文匹配算法中最基礎(chǔ)的算法,分為正向和逆向,原理都是一樣的。
正向最大匹配算法,故名思意,從左向右掃描尋找詞的最大匹配。
首先我們可以規(guī)定一個(gè)詞的最大長(zhǎng)度,每次掃描的時(shí)候?qū)ふ耶?dāng)前開(kāi)始的這個(gè)長(zhǎng)度的詞來(lái)和字典中的詞匹配,如果沒(méi)有找到,就縮短長(zhǎng)度繼續(xù)尋找,直到找到或者成為單字。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
實(shí)例:
S1="計(jì)算語(yǔ)言學(xué)課程是三個(gè)課時(shí)" ,設(shè)定最大詞長(zhǎng)MaxLen = 5 ,S2= " "
字典中含有三個(gè)詞:[計(jì)算語(yǔ)言學(xué)]、[課程]、[課時(shí)]
(1)S2="";S1不為空,從S1左邊取出候選子串W="計(jì)算語(yǔ)言學(xué)";
(2)查詞表,“計(jì)算語(yǔ)言學(xué)”在詞表中,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ ”, 并將W從S1中去掉,此時(shí)S1="課程是三個(gè)課時(shí)";
(3)S1不為空,于是從S1左邊取出候選子串W="課程是三個(gè)";
(4)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="課程是三";
(5)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="課程是";
(6)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="課程"
(7)查詞表,W在詞表中,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ 課程/ ”,并 將W從S1中去掉,此時(shí)S1="是三個(gè)課時(shí)";
(8)S1不為空,于是從S1左邊取出候選子串W="是三個(gè)課時(shí)";
(9)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="是三個(gè)課";
(10)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="是三個(gè)";
(11)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="是三"
(12)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W=“是”,這時(shí) W是單字,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ 課程/ 是/ ”,并將 W從S1中去掉,此時(shí)S1="三個(gè)課時(shí)";
(13)S1不為空,從S1左邊取出候選子串W="三個(gè)課時(shí)";
(14)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="三個(gè)課";
(15)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="三個(gè)";
(16)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W=“三”,這時(shí) W是單字,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ 課程/ 是/ 三/ ”,并 將W從S1中去掉,此時(shí)S1="個(gè)課時(shí)";
(17)S1不為空,從S1左邊取出候選子串W="個(gè)課時(shí)";
(18)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W="個(gè)課";
(19)查詞表,W不在詞表中,將W最右邊一個(gè)字去掉,得到W=“個(gè)”, 這時(shí)W是單字,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ 課程/ 是/ 三/ 個(gè)/ ",并將W從S1中去掉,此時(shí)S1="課時(shí)";
(20)S1不為空,從S1左邊取出候選子串W="課時(shí)";
(21)查詞表,W在詞表中,將W加入到S2中,S2=“計(jì)算語(yǔ)言學(xué)/ 課程/ 是/ 三/ 個(gè)/ 課時(shí)/ ",并將W從S1中去掉,此時(shí)S1=""。
(22)S1為空,輸出S2作為分詞結(jié)果,分詞過(guò)程結(jié)束。
而至于為什么選擇python這個(gè)語(yǔ)言呢?大概是因?yàn)槲抑車(chē)擞玫蒙侔桑揖拖雵L試突破,不過(guò)我也不諱言,我的C/C++,java等等高級(jí)語(yǔ)言用的也不多,雖說(shuō)編程語(yǔ)言這個(gè)東西,基本上只要熟悉一個(gè),其他的都好學(xué),不過(guò)我在python上嘗到了甜頭,索性就用這個(gè)語(yǔ)言了。
中文分詞算法的Python實(shí)現(xiàn):
腳本接受兩個(gè)參數(shù),一個(gè)是輸入文件的路徑,另一個(gè)是詞典的路徑。
它的運(yùn)行方法如下:
python max-match.py <data> <dict>
#!/usr/bin/env python import cPickle as pickle import sys # 詞語(yǔ)最大長(zhǎng)度為5 window_size=5 def max_match_segment(line, dic): # write your code here chars = line.decode("utf8") words = [] idx = 0 # 判斷索引是否超過(guò)chars的長(zhǎng)度 while idx < len(chars): matched = False for i in xrange(window_size, 0, -1): cand=chars[idx:idx+i].encode("utf8") if cand in dic: words.append(cand) matched = True break # 判斷for中是否匹配到數(shù)據(jù) if not matched: i = 1 words.append(chars[idx].encode("utf8")) idx += i return words if __name__=="__main__": try: fpi=open(sys.argv[1], "r") except: print >> sys.stderr, "failed to open file" sys.exit(1) try: dic = pickle.load(open(sys.argv[2], "r")) except: print >> sys.stderr, "failed to load dict %s" % sys.argv[2] sys.exit(1) try: fpo = open("out.txt","w") except: print >> sys.stderr, "failed to load out.txt" sys.exit(1) for line in fpi: fpo.write("\t".join( max_match_segment(line.strip(), dic) ))
當(dāng)然,這只是最基礎(chǔ)的,還可以有很多高級(jí)的優(yōu)化,比如說(shuō)改成Trie樹(shù)版本的,控制最大詞長(zhǎng)度的等等。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- python實(shí)現(xiàn)中文分詞FMM算法實(shí)例
- Python中文分詞實(shí)現(xiàn)方法(安裝pymmseg)
- Python結(jié)巴中文分詞工具使用過(guò)程中遇到的問(wèn)題及解決方法
- Python中文分詞工具之結(jié)巴分詞用法實(shí)例總結(jié)【經(jīng)典案例】
- python中文分詞,使用結(jié)巴分詞對(duì)python進(jìn)行分詞(實(shí)例講解)
- python使用jieba實(shí)現(xiàn)中文分詞去停用詞方法示例
- python中文分詞庫(kù)jieba使用方法詳解
- Python中文分詞庫(kù)jieba,pkusegwg性能準(zhǔn)確度比較
- Python3爬蟲(chóng)中關(guān)于中文分詞的詳解
- Python jieba 中文分詞與詞頻統(tǒng)計(jì)的操作
- Python中文分詞庫(kù)jieba(結(jié)巴分詞)詳細(xì)使用介紹
相關(guān)文章
使用Python 自動(dòng)生成 Word 文檔的教程
今天小編就為大家分享一篇使用Python 自動(dòng)生成 Word 文檔的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02對(duì)pandas的dataframe繪圖并保存的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇對(duì)pandas的dataframe繪圖并保存的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Python的Tornado框架實(shí)現(xiàn)異步非阻塞訪問(wèn)數(shù)據(jù)庫(kù)的示例
Tornado框架的異步非阻塞特性是其最大的亮點(diǎn),這里我們將立足于基礎(chǔ)來(lái)介紹一種簡(jiǎn)單的Python的Tornado框架實(shí)現(xiàn)異步非阻塞訪問(wèn)數(shù)據(jù)庫(kù)的示例:2016-06-06python3.7安裝matplotlib失敗問(wèn)題的完美解決方法
由于學(xué)習(xí)需要安裝matplotlib庫(kù),閱讀網(wǎng)上教程后一直出現(xiàn)各種各樣的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于python3.7安裝matplotlib失敗問(wèn)題的完美解決方法,需要的朋友可以參考下2022-07-07Python隨機(jī)生成信用卡卡號(hào)的實(shí)現(xiàn)方法
這篇文章主要介紹了Python隨機(jī)生成信用卡卡號(hào)的實(shí)現(xiàn)方法,可實(shí)現(xiàn)生成信用卡卡號(hào)的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Python如何爬取b站熱門(mén)視頻并導(dǎo)入Excel
這篇文章主要介紹了Python如何爬取b站熱門(mén)視頻并導(dǎo)入Excel,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08