0%

1-中文分词算法

1-中文分词算法

  1. 正向最大匹配法
  2. 逆向最大匹配法
  3. 双向最大匹配法

正向最大匹配法

这个顾名思义有 正向跟最大 两个词,步骤大概是

  1. 假定最大分词长度为maxlen, 则从被处理的当前字符串的前maxlen个字作为匹配字段,查找
  2. 若存在,则匹配成功,将当前字符串已匹配的去掉,将剩余字符串当成当前被处理字符串
  3. 若不存在,则将maxlen-1 ,当前被处理字符串的前maxlen-1个字作为匹配字段
  4. 重复循环2,3步

举个例子

正向即从前往后取词,从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,非词典词为1。

环境为python3.6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#coding=gbk
# 定义匹配的词典
array = ['我','我们','是','中国','中','国','人']
# 定义结果集
result = []
# 定义目的串
string = "我们是中国人"
# 求词典最大分词长度
maxlen = 0
for i in array:
length = len(i)
if length > maxlen:
maxlen = length

# 求字符串长度
length = len(string)
# 定义开始和结束的长度为start,end
start = 0
end = len(array)
# 记录已匹配数
count = 0

while count < length:
# 获取最大分词长度
size = maxlen
while size > 0:
# 中间转换
middle = string[start:start+size]
# 若不在词典里跳过此次匹配
if middle not in array:
size -= 1
continue
# 在则加入结果集
result.append(middle)
count += size
# 重新定义开始
start = count
break
# 若size为0,则证明都未匹配到
print(result)
if size == 0:
print("error, couldn't find it")
break

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/e1fe0412/
版权声明:转载请注明出处!