国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中文分詞教程之前向最大正向匹配算法詳解

2020-01-04 16:27:20
字體:
來源:轉載
供稿:網友

前言

大家都知道,英文的分詞由于單詞間是以空格進行分隔的,所以分詞要相對的容易些,而中文就不同了,中文中一個句子的分隔就是以字為單位的了,而所謂的正向最大匹配和逆向最大匹配便是一種分詞匹配的方法,這里以詞典匹配說明。

最大匹配算法是自然語言處理中的中文匹配算法中最基礎的算法,分為正向和逆向,原理都是一樣的。

正向最大匹配算法,故名思意,從左向右掃描尋找詞的最大匹配。

首先我們可以規定一個詞的最大長度,每次掃描的時候尋找當前開始的這個長度的詞來和字典中的詞匹配,如果沒有找到,就縮短長度繼續尋找,直到找到或者成為單字。

下面話不多說了,來一起看看詳細的介紹吧。

實例:

S1="計算語言學課程是三個課時" ,設定最大詞長MaxLen = 5 ,S2= " "

字典中含有三個詞:[計算語言學]、[課程]、[課時]

    (1)S2="";S1不為空,從S1左邊取出候選子串W="計算語言學";

    (2)查詞表,“計算語言學”在詞表中,將W加入到S2中,S2=“計算語言學/ ”, 并將W從S1中去掉,此時S1="課程是三個課時";

    (3)S1不為空,于是從S1左邊取出候選子串W="課程是三個";

    (4)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="課程是三";

    (5)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="課程是";

    (6)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="課程"

    (7)查詞表,W在詞表中,將W加入到S2中,S2=“計算語言學/ 課程/ ”,并 將W從S1中去掉,此時S1="是三個課時";

    (8)S1不為空,于是從S1左邊取出候選子串W="是三個課時";

    (9)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="是三個課";

    (10)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="是三個";

    (11)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="是三"

    (12)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W=“是”,這時 W是單字,將W加入到S2中,S2=“計算語言學/ 課程/ 是/ ”,并將 W從S1中去掉,此時S1="三個課時";

    (13)S1不為空,從S1左邊取出候選子串W="三個課時";

    (14)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="三個課";

    (15)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="三個";

    (16)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W=“三”,這時 W是單字,將W加入到S2中,S2=“計算語言學/ 課程/ 是/ 三/ ”,并 將W從S1中去掉,此時S1="個課時";

    (17)S1不為空,從S1左邊取出候選子串W="個課時";

    (18)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W="個課";

    (19)查詞表,W不在詞表中,將W最右邊一個字去掉,得到W=“個”, 這時W是單字,將W加入到S2中,S2=“計算語言學/ 課程/ 是/ 三/ 個/ ",并將W從S1中去掉,此時S1="課時";

    (20)S1不為空,從S1左邊取出候選子串W="課時";

    (21)查詞表,W在詞表中,將W加入到S2中,S2=“計算語言學/ 課程/ 是/ 三/ 個/ 課時/ ",并將W從S1中去掉,此時S1=""。

    (22)S1為空,輸出S2作為分詞結果,分詞過程結束。

而至于為什么選擇python這個語言呢?大概是因為我周圍人用得少吧,我就想嘗試突破,不過我也不諱言,我的C/C++,java等等高級語言用的也不多,雖說編程語言這個東西,基本上只要熟悉一個,其他的都好學,不過我在python上嘗到了甜頭,索性就用這個語言了。

中文分詞算法的Python實現:

腳本接受兩個參數,一個是輸入文件的路徑,另一個是詞典的路徑。

它的運行方法如下:

python max-match.py <data> <dict>
#!/usr/bin/env pythonimport cPickle as pickleimport sys# 詞語最大長度為5window_size=5def max_match_segment(line, dic): # write your code here chars = line.decode("utf8") words = [] idx = 0 # 判斷索引是否超過chars的長度 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中是否匹配到數據  if not matched:   i = 1   words.append(chars[idx].encode("utf8"))  idx += i return wordsif __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) ))

當然,這只是最基礎的,還可以有很多高級的優化,比如說改成Trie樹版本的,控制最大詞長度的等等。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庄河市| 九江市| 巨鹿县| 黑山县| 延寿县| 西华县| 柳河县| 门头沟区| 威海市| 安阳县| 启东市| 聂荣县| 通道| 信宜市| 兴宁市| 永德县| 建宁县| 潞城市| 同江市| 镇江市| 佛坪县| 澄迈县| 星子县| 康马县| 大田县| 扶绥县| 江油市| 彭水| 山西省| 丹阳市| 朝阳市| 鹤壁市| 寿宁县| 疏勒县| 崇明县| 澎湖县| 孝感市| 镇原县| 公主岭市| 赫章县| 木兰县|