一种基于自动机的快速分词方法
分词是自然语言处理入门的第一步,我参照导师的论文和写了一个基于自动机的快速分词方法;
其主要内容是字典的构建,字典的结构能够决定分词的效率;
本系统分词的实现,第一个字的查找采用的是hash,分词的时间复杂度为O(1);第二个字的查找是用二分查找实现的,时间复杂度为1+log2(n);其余部分采用的是顺序查找,整体的时间复杂度跟词的长度有关。
实现的框架如下:
const int START1 = 0XB0, START2 = 0XA1, END1 = 0XF8, END2 = 0XFF; //不用说,这个对于自然语言处理的人都知道是什么意思;
const int MAXWORDLEN = 48; //读文件的长度;struct ThirdWord //除了第一二个字之外,其他字存储的数据节点;
{string key; //存的是这个字;bool isPhrase; //以这个字结尾有没有形成一个词?ThirdWord *L,*R; //L表示的是与该节点同一层次的节点的指针,R表示的是该节点的下一个字,或者说是当前词中这个字的下一个字;ThirdWord(string Key, bool IsPhrase = false, ThirdWord* l = 0, ThirdWord* r = 0): //构造函数咯;key(Key), isPhrase(IsPhrase), L(l), R(r) {}
};struct SecondWord //第二个字节点
{string key; //存这个字 bool isPhrase; //... ...ThirdWord *child; //指向儿子节点,也就是它后面的字节点;SecondWord(string Key,bool IsPhrase ,ThirdWord* Child):key(Key),isPhrase(IsPhrase),child(Child) {}
};struct HeadWord
{string key; //第一个字;vector<SecondWord> secWord; //第二个字的表;
};class Dictionary //字典类;
{
private :ifstream fin; //读文件的;vector <HeadWord> head; //第一个字表;int HASH[END1-START1+1][END2-START2+1]; //哈希表,存的是当前字在head中对应的下标;int getNumber(); //读书字;bool IsCC(char c); //是中文字;bool IsEC(char c); //是英文字;string getLine(); //读一行;void loadDictionary(); //加载字典;int StrtoInt(string s); //转化,string到int;unsigned CharToInt(char c); //转化;int biSearch(unsigned x,string secWd); //二分查找;ThirdWord* seqSearch(ThirdWord* p, string cc); //第三个字开始的查找;void printRemain(string s,ThirdWord* &child); //打印第二个字后面的;void processRemain(string s , ThirdWord* &child); //处理第二个字后面的;void skipNoChinese(string s, vector<string> &test,unsigned &sp, unsigned &ep); //跳过非中文开头的字;
public :Dictionary(string file); //构造字典;void print(); //打印;void segment(string s,vector<string> & test); //分词;
};
转载于:https://www.cnblogs.com/Chinese-Coder-Clarence/articles/2244886.html
一种基于自动机的快速分词方法相关推荐
- html webservice数据交互_一种基于WebService的数据交换方法
一种基于WebService的数据交换方法 [专利摘要]本发明涉及数据交换[技术领域],特别涉及一种基于WebService的数据交换方法.本发明是以Web服务为依托,通过定义参数的方式进行传入内容和 ...
- matlab车辆测距,一种基于单目视觉的车辆测距方法
一种基于单目视觉的车辆测距方法 [专利说明]一种基于单目视觉的车辆测距方法 所属技术领域 [0001] 本发明属于目标检测与测距领域,尤其涉及一种基于单目视觉的车辆测距方法. [背景技术] [0002 ...
- matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...
本发明是一种基于谱聚类的图像分割方法与系统,涉及聚类.机器学习和人工智能领域.特别涉及通过相关性将已经学习到的知识运用到图像分割中,并在此基础上构造性地改造谱聚类方法,从而达到快速精确地分割彩色图像的 ...
- matlab 指纹,一种基于matlab的指纹识别方法
一种基于matlab的指纹识别方法 [技术领域] [0001 ] 本发明涉及指纹识别领域,特别涉及一种基于MTLAB的指纹识别方法. [背景技术] [0002] 传统的安防系统主要采用基于令牌或密码的 ...
- 火焰识别python_一种基于人工智能的火焰图像识别方法与流程
技术领域 本发明涉及消防技术领域,具体来说,涉及一种基于人工智能的火焰图像识别方法. 背景技术: 目前,随着社会科技的不断发展,人工智能系统是一种能模拟生物脑神经元在大脑中的真实链接,并对外来信号有自 ...
- 计算机视觉在仓储中的应用,一种基于计算机视觉的物流仓储监控方法
一种基于计算机视觉的物流仓储监控方法 [技术领域] [0001] 本发明涉及的是一种基于计算机视觉的智能监控方法,属于计算机视觉中的目标 检测与跟踪领域.通过把视频帧的光照不变性特征和基于循环矩阵的核 ...
- uvm 形式验证_一种基于UVM的总线验证方法与流程
本发明涉及芯片设计的功能验证领域,尤其是一种基于UVM的总线验证方法. 背景技术: 随着集成电路工艺的不断进步,集成电路的规模和复杂度也在不断地提高,验证的难度也越来越大.在集成电路设计中,验证工作已 ...
- linux 网络监控 邮件,一种基于Linux的邮件监控方法与流程
本发明涉及计算机安全技术领域,具体地说是一种实用性强.基于Linux的邮件监控方法. 背景技术: 随着计算机的普及以及人们对个人信息安全的重视,如何保障计算机乃至个人信息的安全成为了一个至关重要的问题 ...
- python检索论文_一种基于Python的音乐检索方法的研究
应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...
最新文章
- Scrapy爬虫-必备插件
- oracle 存储过程= 1,oracle 存储过程1
- Unity UGUI——遮罩效果(Mask)
- memcache 启动 储存原理 集群
- 面试官 | 线程间是如何通信的?
- UVA11398 The Base-1 Number System【进制】
- 【node】---记忆内容
- java在微信的应用_java版微信公众平台消息接口应用示例
- java小游戏 : 飞翔的小鸟 (完整版)
- E-Prime2.0安装避坑指南
- Convert to RINEX安装及简单使用
- 我的世界服务器无限背包,我的世界 无限背包MOD 我的世界1.7无限背包MOD
- 一些优秀的源码开源网站
- 【MindSpore易点通机器人-01】你也许见过很多知识问答机器人,但这个有点不一样
- [ABAP]批量查询工艺路线
- gpio_set_value 函数
- 感恩,生命的馈赠(2014年终总结)
- 洛谷-运输(P2094)
- C语言 扑克牌小游戏
- 详解nginx服务器绑定域名和设置根目录的方法