算法的整体思想
把词典中的词按照 由长到短递减 的顺序逐字搜索整个待处理的文本,一直到把全部的词切分出来为止。不论分词词典多大,被处理的文本多么小,都得把这个分词词典匹配一遍。
- 首先将词典中的词按降序排序。
- 遍历排序后的词典,把每个词与原文本相匹配。
- 用
python
中的find ()
方法,获取匹配到的字符串在文本中的索引位置。 - 用
python
定义一个字典dict
,value
存放匹配到的字符串,key
是其索引,这样输出分词结果的时候,将dict
按key
升序排序,将value
输出,分词片段的顺序和原文本中出现的顺序保持一致。 find ()
方法返回的是匹配到的字符串在文本中第一次出现的位置,如果一个字符串在文本中出现多次,需要用while
循环,找到该字符串所有的索引位置。每次找到一个索引位置后,将索引和字符串存入dict
,然后在原文本中用与该字符串相同长度的空格替换原字符串。直到所有的字符串都被替换完毕,循环结束。- 遍历结束之后,原文本中的匹配到的字符串都替换成了相同长度的空格,剩下的内容就是未匹配到的字符串,用
split ()
方法将其分割,存入列表list
。然后遍历list
,找到每个字符串的索引位置,同样存入dict
。 - 最后输出
dict
中的value
,就是分词结果。 - 输出
list
中的内容,就是未匹配结果。
Python 实现
1 | # -*- coding: UTF-8 -*- |
示例
text.txt
1
很高兴见到你,我是 Bob,今年 24 岁,来自天津理工大学,我是一个硕士研究生,今年研二。
dict.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 很 adv
高兴 adj
见到 v
你 prep
我 prep
来 prep
来自 v
天津 n
理工 n
大学 n
天津理工 n
理工大学 n
天津理工大学 n
是 v
一 n
一个 n
硕士 n
研究 v
研究生 n
, comma
。 comma
输出:
1
2
3
4
5
6
7
8
9
10 原文本:
很高兴见到你,我是 Bob,今年 24 岁,来自天津理工大学,我是一个硕士研究生,今年研二。
分词结果:
很 / 高兴 / 见到 / 你 /,/ 我 / 是 /Bob/,/ 今年 24 岁 /,/ 来自 / 天津理工大学 /,/ 我 / 是 / 一个 / 硕士 / 研究生 /,/ 今年研二 /。/
未匹配内容:
Bob
今年 24 岁
今年研二