最短路径分词

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最短路径分词
中⽂分词有很多⽅法,⽐如N-最短路径法,N元语⾔模型,CRF模型等等。

⼤致可以分为两类:⼀是机械化的分词,⼆是⽤机器学习⽅法分词。

最短路径算法可以划分到第⼀种。

这个算法效果并不是最好的,⼤体和IK分词打成平⼿。

今天⽤最简洁语⾔描述⼀下:这个算法主要分两步:第⼀,构造DAG(有向⽆环图),第⼆找出最优路径。

以下图为例 "有意见分歧”进⾏分词。

⾸先构造下图中的左边的DAG:节点⽤0~5来表⽰,每条边都有起点和终点构成有向图。

⽐如从0节点开始,0~1和0~2构成了两条边,分别代表右图中的有和有意两个词。

以此类推,1节点:1~2,1~3。

其中,⽤词在词典中出现的频率来代表边的属性。

构建完毕后,我们发现,从0~5有多条路径:0-1-3-5,0-1-2-4-5,0-1-2-3-5,0-1-2-3-4-5,……找出最优路径来,即找出频率之和最⼤的路径,也就是对应每个起点的边的属性最⼤。

⽐如,从0开始,0-1的属性最⼤,然后以1为起点,1-3属性最⼤,再以3为起点,3-5属性最⼤。

即最优路径:0-1-3-5.有意见分歧。

下⾯⽤Python代码简单⽰例之:
1# encoding=utf-8
2
3class WordDictModel:
4def__init__(self):
5 self.word_dict = {}
6 self.stop_words = {}
7
8def load_data(self, filename):
9 with open(filename, "r", encoding="utf-8") as fr:
10for line in fr:
11 words = line.split("")
12for word in words:
13if word in self.stop_words:
14continue
15 self.word_dict[word] = self.word_dict.get(word,0) + 1
16
17class DAGSegger(WordDictModel):
18def build_dag(self, sentence):
19 dag = {}
20for start in range(len(sentence)):
21 tmp = []
22for stop in range(start+1, len(sentence)+1):
23 fragment = sentence[start:stop]
24 num = self.word_dict.get(fragment, 0)
25if num > 0:
26 tmp.append((stop, num))
27 dag[start] = tmp
28return dag
29
30def predict(self, sentence):
31 wordList = []
32 Len = len(sentence)
33 route = []
34 dag = self.build_dag(sentence) # {i: (stop, num)}
35 i = 0
36while i < len(sentence):
37 end = max(dag[i], key=lambda x: x[1])[0]
38 wordList.append(sentence[i:end])
39 i = end
40return wordList
41
42def test(self):
43 cases = [
44"有意见分歧"
45 ]
46for case in cases:
47 result = self.predict(case)
48for word in result:
49print(word)
50print('')
51
52def main():
53 dag_segger = DAGSegger()
54 dag_segger.load_data("words.txt")
55print(dag_segger.word_dict)
56 dag_segger.test()
57
58if__name__ == '__main__':
59 main()
模拟词典:
有见分歧有意有有分分见分见分分歧意见分歧分歧见有意有意见见有意
从词典中统计出词的频率。

这个算法对词典中的词频⾮常敏感。

那么在消除歧义的过程中,⽐如,乒乓球拍卖完了,有很多路径,很显然,在中⽂词典中,乒乓球的频率⼤于乒乓球拍,所以结果是:乒乓球拍卖完了。

和IK分词的基于⾮交叉词元链的消除歧义效果⼀样。

这显然是不合理的。

只考虑词频,不考虑上下⽂不可⾏。

2元语法模型⼀阶马尔科夫链效果要强于这个算法。

p(拍卖|乒乓球)的值在统计语料库中会⾮常低,所以准确度会⼤于这个算法。

相关文档
最新文档