设计实现一个中文分词系统,将任意给定的一段中文切分成一个单独的词。掌握动态存储分配,文件读写等功能。
- 词典维护:导入,增删查改,保存。
- 索引维护:提高字典查找比对速度。词典发生变化时,索引需响应更新。需要保存硬盘
- 待处理中文文本的输入:多个段落,多个句子,字数不限,标点符号。键盘输入/文件导入
- 输入的中文文本进行分词处理:分割后用“|”分隔,保持原文次序,保存到文本文件
- 用户界面
按照扫描方向的不同分为正向和逆向,按照不同长度优先分配分为最大和最小匹配。
- 正向
要求每一句的切分结果中词组的总数最少。 (减字匹配法)
注意:
1. 字典中最长词汇的长度
之后直接进行匹配即可
- 逆向,是从句子的结尾开始扫描,直至句首。
- 最少切分分词法:使每一句中切出的词组数目最小
- 双向匹配法:将正向最大和逆向最大进行组合
用于对字典进行索引,这是两种数据结构状态。
由于对于结构体TrieNode中child数组的长度未定,所以需要通过变长数组进行动态的添加。 c语言变长数组实现
见文件/reference/dict.txt
-
对词典建立索引(hash或者Trie)
-
处理用户输入
- 首先对于输入进行处理(",。、!?")=>["xx","xx"],由于存在段落,所以需要保存
\n
。 - 接着处理数组中的内容,此时使用字符串匹配分词法进行比对。
- 首先对于输入进行处理(",。、!?")=>["xx","xx"],由于存在段落,所以需要保存
-
分词处理后,插入"|",插入"\n",(应当处理段落前的进位符)
用户界面使用qt。
不断从字典中进行查找匹配
- 对英文、中文、数字的区分
a-z 01100001 - 01111010 A-Z 01000001 - 01011010 0-9 00110000 - 00111001 1
(1) 每个结点都是词语中的一个汉字。
(2) 结点中的指针指向了该汉字在某一个词中的下一个汉字。这些指针存放在以汉字为key的hash结构中。
(3) 结点中的"#"表示当前结点中的汉字是从根结点到该汉字结点所组成的词的最后一个字。