简易中文分词系统实现 c++

这是一个使用C++编写的简易中文分词系统,基于机械字典匹配法,使用搜狗互联网词库,实现了对UTF-8编码文档的分词处理。系统首先将文档读入字符串,然后通过迭代器匹配不同长度的词语,最长匹配成功后保存在词频映射中,并插入分词符号。未在词典中出现的词会被过滤掉。
摘要由CSDN通过智能技术生成

*******************************中文分词模块*********************************************************
****************************************************************************************************
#所需函数声明在:segment.h头文件中。
#字典的建立和数据结构:采用c++ STL中map<string 词,int 频数>;map底层实现为红黑树。
#采用机械字典匹配法,词库为搜狗互联网词库:http://www.sogou.com/labs/dl/w.html 大约13万词汇。算法采用简单模式的mmseg。处理文档全部为UTF-8编码,其他编码方式需要先转换文档格式为UTF-8。
#具体处理方法:将文档写入string字符串变量:file_string。取得指向第一个字节的迭代器string::iterator iter,由于中文汉字的编码为三个字节,而英文等符号的编码可能为一个或两个字节;因此对迭代器开始的每个连续的6字节(二字词,ex:中国),9字节(三字词:ex:研究所)………27字节(9字词)进行匹配[说明:本算法假设所有的可能被切分出的词的字个数是:2-9个;不包含一个字的词ex:我]。用以个bitset<8> bitflag保存从一个位置开始的可能的存在的匹配项目,然后取最长字数的词匹配。然后将这个匹配结果保存在map_save(key为切分词,value为一个切分词在一篇输入文章中的频数)中,然后将这个词的后面插入一个分词符号,比如‘/’;然后迭代器指向‘/’后面第一个字节。如果对于八种可能都没有与字典相同的匹配结果则,抛弃iter所指的当前一个字节【注意是字节,这样可以将单字节标点符号等全部去除】,然后迭代器iter++。遍历file_string中的每个字节直到iter+5>=file_string.end()即迭代停止时剩余的字节数已经小于6,所以一定不可能匹配成功。迭代过程全部结束后,将stirng_file写入指定文件。算法结束,本算法的主要实现函数是:segment()

说明:由于此分词算法是为后续文本分类做准备,所以分词结果并不是全部文本都保留而是去除了不匹配的词和标点字符和单个字。分词结果出现的词是在词典中出现的,词典中不出现的词全部过滤掉。这对于未登陆词的处理时粗暴的,因此算法简单但还有许多可改进扩展之处。(粗暴的原因:对于数字 部分人名 英文等含有信息量的内容无法匹配————这是后续考虑改进的问题)

creat_map.cpp______________________________

#include<string>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<sstream>
#include<map>
using namespace std;
//map<string,int> dic; 已经在main中定义了

ifstream& openfile(ifstream& in,const string filename)//将文件输入流绑定指定的文件,安全打开,一定要返回ifstream& 用于判断!!!
{in.close();
 in.clear();
 in.open(filename.c_str());
 return in;
}

void creatmap(ifstream &in,map<string,int>& dic)
//此function仅针对file“sougou”文件的词汇存储格式
//creatmap函数的参数为安全检测完毕并初始化完毕的文件流的引用和要创建的字典的引用
{  
   string str;
   if(!in)
   cout<<"there is an error when open file&#

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值