基於規則的雙向最大匹配演算法的分詞

2021-09-23 18:35:51 字數 2101 閱讀 8321

雙向最大匹配演算法(bi-directction matching method)是將最大匹配法得到的分詞結果和逆向最大匹配法得到的結果通過雙向最大匹配演算法的規則進行篩選而得到。

#-*- coding:utf-8 -*-

'''@project: exuding-nlp-all

@author: texuding

@time: 2019-05-27 15:45:46

'''#正向最大匹配演算法

class mm(object):

def __init__(self):

self.window_size = 3

def cut(self,text,dict):

result =

index = 0

text_length = len(text)

while text_length > index:

for size in range(self.window_size+index,index,-1):

piece = text[index:size]

#print(piece)

if piece in dict:

index = size -1

#print(index,'-->')

break

index = index +1

#print(index)

return result

#逆向最大匹配演算法

class rmm(object):

def __init__(self):

self.window_size = 3

def cut(self,text,dict):

result =

index = len(text)

while index>0:

for size in range(index-self.window_size,index):

piece = text[size:index]

if piece in dict:

index = size +1

break

index = index -1

result.reverse()

return result

if __name__ =='__main__':

text = '我在北京師範大學學習,一樣找不到女朋友'

dict = ['我', '在', '北京師範大學', '北京', '師範大學', '大學','學習','北京師範','一樣','找','找不到','不到','女朋友','朋友']

tokenizer_rmm = rmm()

res_rmm = tokenizer_rmm.cut(text,dict)

tokenizer_mm = mm()

res_mm = tokenizer_mm.cut(text,dict)

#雙向最大匹配規則

if len(res_mm) == len(res_rmm):

if res_rmm == res_mm:

res = res_rmm

else:

temp_rmm =

for i in res_rmm:

if len(i) == 1:

temp_mm =

for j in res_mm:

if len(j) == 1:

res = [res_rmm if len(temp_rmm) < len(temp_mm) else res_mm]

else:

res = [res_rmm if len(res_rmm)輸出結果:

[『我』, 『在』, 『北京』, 『師』, 『範』, 『大學』, 『學習』, 『,』, 『一樣』, 『找不到』, 『女朋友』]

可以看到分詞結果對於北京師範大學沒有良好的分開,這是規則分詞的弊端造成的,當我把self.window_size設定為5時,分詞結果如下:

[『我』, 『在』, 『北京師範』, 『大學』, 『學習』, 『,』, 『一樣』, 『找不到』, 『女朋友』]

所以某些詞,尤其是長一點的實體詞長度大於視窗大小時會影響分詞結果。後面會繼續研究一下基於hmm模型的統計分詞來對比基於規則分詞的弊端。

python雙向最大匹配演算法 雙向最大匹配分詞演算法

usr bin python encoding gbk import sys dictmaxlength 5 dctdict encoding gbk 初始化字典 初始化最大詞長 def initdct dct global dctdict global dictmaxlength dctobj o...

基於邊緣的模板匹配演算法

vs2017以上 vcpkg 使用vcpkg安裝opencv,否則需要調整cmakelist 的相應內容 cmake最新版 opencv 4.3 演算法庫 這個演算法庫是基於linemod演算法實現的,類似於halcon的形狀匹配,其實opencv 也有類似的演算法類 cv linemod,不過需要...

分類 基於規則的分類 RIPPER演算法

在 分類 基於規則的分類技術 中已經比較詳細的介紹了基於規則的分類方法,ripper演算法則是其中一種具體構造基於規則的分類器的方法。在ripper演算法中,有幾個點是演算法的重要構成部分,需要強調一下 ripper演算法中採用的仍然是基於類的規則排序方式,不過獨特的地方是,它先將各個類按頻率 即類...