中文分词--最大正向匹配算法python实现

最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。

下面以“我们在野生动物园玩”为例详细说明一下正向与逆向最大匹配方法:

1、正向最大匹配法:

正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。

第1次:“我们在野生动物”,扫描7字词典,无

第2次:“我们在野生动”,扫描6字词典,无

。。。。

第6次:“我们”,扫描2字词典,有

扫描中止,输出第1个词为“我们”,去除第1个词后开始第2轮扫描,即:

第2轮扫描:

第1次:“在野生动物园玩”,扫描7字词典,无

第2次:“在野生动物园”,扫描6字词典,无

。。。。

第6次:“在野”,扫描2字词典,有

扫描中止,输出第2个词为“在野”,去除第2个词后开始第3轮扫描,即:

第3轮扫描:

第1次:“生动物园玩”,扫描5字词典,无

第2次:“生动物园”,扫描4字词典,无

第3次:“生动物”,扫描3字词典,无

第4次:“生动”,扫描2字词典,有

扫描中止,输出第3个词为“生动”,第4轮扫描,即:

第4轮扫描:

第1次:“物园玩”,扫描3字词典,无

第2次:“物园”,扫描2字词典,无

第3次:“物”,扫描1字词典,无

扫描中止,输出第4个词为“物”,非字典词数加1,开始第5轮扫描,即:

第5轮扫描:

第1次:“园玩”,扫描2字词典,无

第2次:“园”,扫描1字词典,有

扫描中止,输出第5个词为“园”,单字字典词数加1,开始第6轮扫描,即:

第6轮扫描:

第1次:“玩”,扫描1字字典词,有

扫描中止,输出第6个词为“玩”,单字字典词数加1,整体扫描结束。

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”

2、python代码实现

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Thu Jul 19 08:57:56 2018
 4 
 5 @author: Lenovo
 6 """
 7 
 8 test_file = 'train/train.txt'#训练语料
 9 test_file2 = 'test/test.txt'#测试语料
10 test_file3 = 'test_sc/test_sc_zhengxiang.txt'#生成结果
11 
12 def get_dic(test_file): #读取文本返回列表
13     with open(test_file,'r',encoding='utf-8',) as f:
14         try:
15             file_content = f.read().split()
16         finally:
17             f.close()
18     chars = list(set(file_content))
19     return chars
20 
21 dic = get_dic(test_file)           
22 def readfile(test_file2):
23     max_length = 5 
24     
25     h = open(test_file3,'w',encoding='utf-8',) 
26     with open(test_file2,'r',encoding='utf-8',) as f:
27         lines = f.readlines()
28 
29     for line in lines:#分别对每行进行正向最大匹配处理
30         max_length = 5 
31         my_list = []
32         len_hang = len(line)
33         while len_hang>0 :
34             tryWord = line[0:max_length]
35             while tryWord not in dic:
36                 if len(tryWord)==1:
37                     break
38                 tryWord=tryWord[0:len(tryWord)-1]
39             my_list.append(tryWord)
40             line = line[len(tryWord):]
41             len_hang = len(line)
42         
43         for t in my_list:#将分词结果写入生成文件
44             if t == '\n' :
45                 h.write('\n')
46             else:
47                 h.write(t + "  ")
48     
49     h.close()
50         
51 readfile(test_file2)

3、训练语料和测试语料见附件。

猜你喜欢

转载自www.cnblogs.com/Jm-15/p/9403352.html