日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python最大分词_中文分词算法之最大正向匹配算法(Python版)

發布時間:2024/8/23 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python最大分词_中文分词算法之最大正向匹配算法(Python版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

實例:

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實現:

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

它的運行方法如下:

python max-match.py

#!/usr/bin/env python

import cPickle as pickle

import sys

window_size=5

def max_match_segment(line, dic):

# write your code here

chars = line.decode("utf8")

words = []

idx = 0

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

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) ))

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

總結

以上是生活随笔為你收集整理的python最大分词_中文分词算法之最大正向匹配算法(Python版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。