C/C++小案例:汉语自动分词器

成果

在这里插入图片描述

一、模型设计

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 <
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我心向阳iu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值