中文分詞 雙向最大匹配實現

2021-10-03 18:47:13 字數 3045 閱讀 6872

雙向最大匹配法(bi-directction matching method,bm)

雙向最大匹配法是將正向最大匹配法得到的分詞結果和逆向最大匹配法的到的結果進行比較,從而決定正確的分詞方法。據sunm.s. 和 benjamin k.t.(1995)的研究表明,中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正確,只有大概9.0%的句子兩種切分方法得到的結果不一樣,但其中必有乙個是正確的(歧義檢測成功),只有不到1.0%的句子,或者正向最大匹配法和逆向最大匹配法的切分雖重合卻是錯的,或者正向最大匹配法和逆向最大匹配法切分不同但兩個都不對(歧義檢測失敗)。這正是雙向最大匹配法在實用中文資訊處理系統中得以廣泛使用的原因所在。

準備中文詞庫,提供乙個中文詞庫:

只考慮中文分詞,所以將其他的非中文本元都統一替換成空格。

從左至右,一次匹配,每次盡量匹配較長的詞語。設詞庫中詞語長度最長的為max_len,設每次擷取的長度為len,初始化擷取長度len=max_len(當然len不能超過當前句子長度,即取再取乙個min),每次擷取後len減一,若發現擷取詞語與在詞庫中,則退出迴圈,說明找到了最大的匹配詞語,然後對剩下的句子依次進行。

將「我們在野生動物園」拆分

其中19為詞庫中詞語最大長度

結果解釋:

因為詞庫中詞語最長為19,該句子的長度為8,所以從長度8開始擷取,從第乙個字開始,第一次擷取為整個句子,發現詞庫中沒有整個句子,再擷取長度為7,長度為6…,最終發現從第一字開始,長度為2的詞語存在,即「我們」;再從『在』開始匹配,過程與前面的一樣。

ps:『在野』的確是個詞語

從上面的結果,可以發現正向最大匹配不一定正確

過程與正向最大匹配相反,從後往前依次找最大長度的詞語。

1、正向最大匹配,得到分詞結果ans1

2、逆向最大匹配,得到分詞結果ans2

3、若ans1等於ans2,返回任意乙個

4、若ans1不等於ans2

4.1>返回ans1與ans2詞語數量較少的

4.2>若ans1與ans2詞語數量相等,返回ans1與ans2單字較少的(單字數量還相等,任意返回乙個)

import re

import numpy as np

#中文匹配,把非中文本元換成空格

def extractchinese(s):

import re

pattern="[\u4e00-\u9fa5]+"#中文正規表示式

regex = re.compile(pattern) #生成正則物件

results = regex.findall(s) #匹配

return " ".join(results)

#讀取詞語,以及詞頻,在下面的雙向最大匹配中,詞頻沒有實際意義

max_len=0 #記錄最大單詞長度

word_dic=dict()

with open("webdict_with_freq.txt", "r",encoding='utf-8') as f:

for line in f.readlines():

str=re.split('[, \n]',line)

word_dic[str[0]]=int(str[1])

max_len=max(max_len,len(str[0]))

print(max_len)

#讀取測試集

test=

with open("test.txt", "r",encoding='utf-8') as f:

for line in f.readlines():

str = extractchinese(line)

str=re.split('[ ]',str)

for i in str:

#正向最大匹配

def fmm(text):

ans=

id=0

while id0:

tt=text[id:id+ll]

#print(tt)

if word_dic.__contains__(tt):

flag=true

break

ll-=1

if flag:

#找到最大匹配

id+=ll

else:

#詞庫中沒有這個字開頭的詞,直接跳過

id+=1

return ans

#逆向最大匹配

def bmm(text):

ans =

id = len(text)

while id>0:

ll = min(id, max_len)

flag = false # 判斷是否找到最大匹配

while ll > 0:

tt = text[id-ll:id]

#print(tt)

if word_dic.__contains__(tt):

flag = true

break

ll -= 1

if flag:

# 找到最大匹配

id -= ll

else:

# 詞庫中沒有這個字開頭的詞,直接跳過

用雙向最大匹配法進行中文分詞

中文分詞任務,採用的是sighan2004 backoff2005微軟資料 資料。給出訓練集和測試集,對測試集進行中文分詞,要求給出的分詞結果f score盡量大。以選出匹配的單詞盡可能長為目標分詞,具體操作是從乙個方向不斷嘗試匹配出最長單詞,再進行下一次匹配,直到匹配完成為止。同樣以選出匹配的單詞...

雙向匹配中文分詞實驗報告

一 摘要 這次實驗的內容是中文分詞,現有的分詞演算法可分為三大類 基於規則匹配的分詞方法 基於統計的分詞方法和基於理解的分詞方法。按照是否與詞性標註過程相結合,又可以分為單純分詞方法和分詞與標註相結合的一體化方法。我們這次用的分詞方法是基於規則的雙向匹配分詞法,即正向最大匹配法和逆向最大匹配法的結合...

中文分詞 正向最大匹配與逆向最大匹配

正向 前向 最大匹配與逆向 後向 最大匹配。中文分詞目前可以分為 規則分詞 統計分詞 混合分詞 規則 統計 這三個主要流派。這次介紹下基於規則的分詞,其是一種機械的分詞方法,主要通過維護詞典,在切分語句時,將語句的每個字串與詞表中的詞逐一進行匹配,找到則切分,否則不予切分。正向最大匹配演算法 這裡需...