基於詞表的中文分詞演算法

2021-09-23 22:35:41 字數 3837 閱讀 3140

對於輸入的一段文字從左至右,以貪心的方式切分出當前位置上長度最大的詞.正向最大匹配法是基於詞典的分詞方法,其分詞原理是:單詞的顆粒度越大,所能表示的含義越確切.

該演算法主要分兩個步驟:

一般從乙個字串的開始位置,選擇乙個最大長度的詞長的片段,如果序列不足最大詞長,則選擇全部序列.

首先看該片段是否在詞典中,如果是,則算為乙個分出來的詞,如果不是,則從右邊開始,減少乙個字元,然後看短一點的這個片段是否在詞典中,依次迴圈,直到只剩下乙個.

序列變為第2步驟擷取分詞後剩下的部分序列.

示例:0

1234

5678

9我畢業

於湖北科

技學院

posremain characters

start characters

max matching

0我畢業於湖北科技學院我我

1畢業於湖北科技學院畢畢業

3於湖北科技學院於於

4湖北科技學院

湖北科技學院

湖北科技學院

**實現:

words_dic = 

def init():

"""讀取詞典檔案

載入詞典

:return:

"""with open('dic/dic.txt','r',encoding='utf8') as dic_inp:

for word in dic_inp:

#實現正向匹配演算法中的切詞方法

def cut_words(raw_sentence,word_dic):

#統計詞典中最長的詞

max_length = max(len(word) for word in words_dic)

sentence = raw_sentence.strip()

#統計序列長度

words_length = len(sentence)

#儲存切分好的詞語

cut_word_list =

while words_length > 0:

max_cut_length = min(max_length,words_length)

subsentence = sentence[0 : max_cut_length]

while max_cut_length > 0:

if subsentence in words_dic:

break

elif max_cut_length == 1:

break

else:

max_cut_length = max_cut_length - 1

subsentence = subsentence[0:max_cut_length]

sentence = sentence[max_cut_length:]

words_length = words_length - max_cut_length

words = "/".join(cut_word_list)

return words

def main():

init()

while true:

print("請輸入您要分詞的序列")

input_str = input()

if not input_str:

break

result = cut_words(input_str,words_dic)

print("分詞結果")

print(result)

if __name__ == "__main__":

main()

測試結果:

請輸入您要分詞的序列

我畢業於湖北科技學院,就職於華為

分詞結果

我/畢業/於/湖北科技學院/,/就職於/華為

反向最大匹配法的基本原理與正向最大匹配法類似,只是分詞順序變為從左至右

示例0

1234

5678

9我畢業

於湖北科

技學院

posremain characters

start characters

max matching

4我畢業於湖北科技學院

湖湖北科技學院

3我畢業於於於

1我畢業畢畢業

0我我我

**實現:

words_dic = 

def init():

with open('dic/dic.txt','r',encoding="utf8") as dic_input:

for word in dic_input:

#實現逆向最大匹配演算法的切詞演算法

def cut_words(raw_sentence,words_dic):

max_length = max(len(word) for word in words_dic)

sentence = raw_sentence.strip()

words_length = len(sentence)

cut_word_list =

while words_length>0:

max_cut_length = min(max_length,words_length)

subsentence = sentence[-max_cut_length:]

while max_cut_length > 0:

if subsentence in words_dic :

break

elif max_cut_length == 1 :

break

else:

max_cut_length = max_cut_length - 1

subsentence = subsentence[-max_cut_length:]

sentence = sentence[0:-max_cut_length]

words_length = words_length - max_cut_length

cut_word_list.reverse()

words = "/".join(cut_word_list)

return words

def main():

init()

while true:

print("請輸入您要分詞的序列")

input_str = input()

if not input_str:

break

result = cut_words(input_str,words_dic)

print("分詞結果")

print(result)

if __name__ == '__main__':

main()

測試結果:

請輸入您要分詞的序列

我畢業於湖北科技學院

分詞結果

我/畢業/於/湖北科技學院

雙向最大匹配演算法是將正向最大匹配演算法得到的分詞結果和逆向最大匹配法得到的結果進行比較,從而決定正確的分詞方法.

啟發式規則

如果正反向分詞結果詞數不同,則取分詞數量較少的那乙個.

如果分詞結果次數相同

a. 分詞結果相同,就說明沒有歧義,可返回任意乙個.

b. 分詞結果不同,返回單字較少的那個

基於正向最大化詞表中文分詞法。

以前做知識管理系統的時候,由於需要建立全文檢索和統計詞頻,需要對中文文字進行分詞。對於中文分詞,國內做到好的應該是中科院自然研究所,但是相對比較複雜,我看了幾次沒有看明白.由於平常我們的知識系統 對分詞的要求沒有這麼高,所以 就選擇了最大化的詞表分詞法.詞表選擇的是人民 97版的詞表.實際效果可以達...

基於規則的中文分詞

正向最大匹配 maximum match method,mm法 的基本思想為 假定分詞詞典中的最長詞有i個漢字字元,則用被處理文件的當前字串中的前i個字作為匹配字段,查詢字典。若字典中存在這樣的乙個i字詞,則匹配成功,匹配欄位被作為乙個詞切分出來。如果詞典中找不到這樣的乙個i字詞,則匹配失敗,將匹配...

中文分詞演算法

基於詞的頻度統計的分詞方法 基於知識理解的分詞方法 中文分詞演算法基本上可以分基於詞典的演算法 詞庫匹配以及基於詞頻的方法 將詞典中所有的詞按照從長到短的順序在文章中進行檢索,直至文章結束。效率比較低 漢字欄位與乙個 充分大 的詞典進行匹配,如果匹配成功,則識別出乙個詞。根據掃瞄方向的不同分為正向匹...