文章目录
成果
一、模型设计
1.1 汉语自动分词:
1.1.1 基本理论:
词是自然语言中能够独立运用的最小单位,是自然语言处理的基本单位。自动词法分析就是利用计算机对自然语言的形态 (morphology) 进行分析,判断词的结构和类别等。词性或称词类(Part-of-Speech, POS)是词汇最重要的特性,是连接词汇到句法的桥梁。
1.1.2 算法基本思想:
正向最大匹配算法 (Forward MaxMatch, FMM) 描述:
假设句子:S = c1c2…cn ,某一词:w = c1c2…cm,m 为词典中最长词的字数。
(1)令 i=0,当前指针 pi 指向输入字串的初始位置,执行下面的操作。
(2)计算当前指针 pi 到字串末端的字数(即未被切分字串的长度)n,如果 n=1,转 第四步,结束算法。否则,令 m=词典中最长单词的字数,如果 n<m, 令 m=n;
(3)从当前 pi 起取 m 个汉字作为词 wi,判断:
a.如果 wi 确实是词典中的词,则在 wi 后添加一个切分标志,转(c);
b.如果 wi 不是词典中的词且 wi 的长度大于 1,将wi 从右端去掉一个字,转(a)步;否则(wi 的长度等于 1),则在 wi 后添加一个切分标志(单字),执行 (c)步;
c.根据 wi 的长度修改指针 pi 的位置,如果 pi 指向字串末端,转(4),否则,i=i+1,返回第二步;
(4)输出切分结果,结束分词程序。
1.1.3 算法评价:
优点:
- 程序简单易行,开发周期短;
- 仅需要很少的语言资源(词表),不需要任何词法、句法、语义资源;
缺点:
-
歧义消解的能力差;
-
切分正确率不高,一般在 95%左右。
二、系统设计
2.1 汉语自动分词:
2.1.1 数据结构:
unordered_map<string, int> StrInt_Hash : 哈希表存储词典(便于查询)
2.1.2 算法实现:
-
对词典进行预处理,截取出所有中文汉字。
循环读入字符串(遇到空格刚好读出一个字符串),直到文件结束。在此过程中,记录下词典中最长词的字节数。
实现函数:
void InitText(string infile);
-
正向最大匹配算法。
对汉语自动分词的正向匹配算法的实现(模型方法中有详细叙述),并将生成好的分词结果写入到文件中。
实现函数:
void PositiveMaxMatch(string _infile, string _outfile);
2.1.3 算法评估:
理论上,时间复杂度最差为:(Maxlen*Maxlen) (Maxlen 代表词典中最长词的字节数)
三、开发环境
操作系统:Windows 10
编程语言:C/C++
开发工具:Visual Studio 2017
四、源码
项目链接:
https://download.csdn.net/download/weixin_45525272/65216294
源代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <