*******************************中文分词模块*********************************************************
****************************************************************************************************
#所需函数声明在: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&#