分词是自然语言处理入门的第一步,我参照导师的论文和写了一个基于自动机的快速分词方法;

其主要内容是字典的构建,字典的结构能够决定分词的效率;

本系统分词的实现,第一个字的查找采用的是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

一种基于自动机的快速分词方法相关推荐

  1. html webservice数据交互_一种基于WebService的数据交换方法

    一种基于WebService的数据交换方法 [专利摘要]本发明涉及数据交换[技术领域],特别涉及一种基于WebService的数据交换方法.本发明是以Web服务为依托,通过定义参数的方式进行传入内容和 ...

  2. matlab车辆测距,一种基于单目视觉的车辆测距方法

    一种基于单目视觉的车辆测距方法 [专利说明]一种基于单目视觉的车辆测距方法 所属技术领域 [0001] 本发明属于目标检测与测距领域,尤其涉及一种基于单目视觉的车辆测距方法. [背景技术] [0002 ...

  3. matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...

    本发明是一种基于谱聚类的图像分割方法与系统,涉及聚类.机器学习和人工智能领域.特别涉及通过相关性将已经学习到的知识运用到图像分割中,并在此基础上构造性地改造谱聚类方法,从而达到快速精确地分割彩色图像的 ...

  4. matlab 指纹,一种基于matlab的指纹识别方法

    一种基于matlab的指纹识别方法 [技术领域] [0001 ] 本发明涉及指纹识别领域,特别涉及一种基于MTLAB的指纹识别方法. [背景技术] [0002] 传统的安防系统主要采用基于令牌或密码的 ...

  5. 火焰识别python_一种基于人工智能的火焰图像识别方法与流程

    技术领域 本发明涉及消防技术领域,具体来说,涉及一种基于人工智能的火焰图像识别方法. 背景技术: 目前,随着社会科技的不断发展,人工智能系统是一种能模拟生物脑神经元在大脑中的真实链接,并对外来信号有自 ...

  6. 计算机视觉在仓储中的应用,一种基于计算机视觉的物流仓储监控方法

    一种基于计算机视觉的物流仓储监控方法 [技术领域] [0001] 本发明涉及的是一种基于计算机视觉的智能监控方法,属于计算机视觉中的目标 检测与跟踪领域.通过把视频帧的光照不变性特征和基于循环矩阵的核 ...

  7. uvm 形式验证_一种基于UVM的总线验证方法与流程

    本发明涉及芯片设计的功能验证领域,尤其是一种基于UVM的总线验证方法. 背景技术: 随着集成电路工艺的不断进步,集成电路的规模和复杂度也在不断地提高,验证的难度也越来越大.在集成电路设计中,验证工作已 ...

  8. linux 网络监控 邮件,一种基于Linux的邮件监控方法与流程

    本发明涉及计算机安全技术领域,具体地说是一种实用性强.基于Linux的邮件监控方法. 背景技术: 随着计算机的普及以及人们对个人信息安全的重视,如何保障计算机乃至个人信息的安全成为了一个至关重要的问题 ...

  9. python检索论文_一种基于Python的音乐检索方法的研究

    应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...

最新文章

  1. Scrapy爬虫-必备插件
  2. oracle 存储过程= 1,oracle 存储过程1
  3. Unity UGUI——遮罩效果(Mask)
  4. memcache 启动 储存原理 集群
  5. 面试官 | 线程间是如何通信的?
  6. UVA11398 The Base-1 Number System【进制】
  7. 【node】---记忆内容
  8. java在微信的应用_java版微信公众平台消息接口应用示例
  9. java小游戏 : 飞翔的小鸟 (完整版)
  10. E-Prime2.0安装避坑指南
  11. Convert to RINEX安装及简单使用
  12. 我的世界服务器无限背包,我的世界 无限背包MOD 我的世界1.7无限背包MOD
  13. 一些优秀的源码开源网站
  14. 【MindSpore易点通机器人-01】你也许见过很多知识问答机器人,但这个有点不一样
  15. [ABAP]批量查询工艺路线
  16. gpio_set_value 函数
  17. 感恩,生命的馈赠(2014年终总结)
  18. 洛谷-运输(P2094)
  19. C语言 扑克牌小游戏
  20. 详解nginx服务器绑定域名和设置根目录的方法

热门文章

  1. 语音聊天源码开发之常用动画效果的实现
  2. MacOS连接VPN 提醒 “IPSec共享密钥”丢失。请验证您的设置并尝试重新连接。
  3. 飞腾FT2000/4 CPU UEFI开发 固件配置
  4. 我爱天文 - 月亮从哪边升出来?
  5. 高等数学(三) 极限
  6. 数字化转型,有你有我
  7. IPinfo上架uTools插件中心
  8. Python 【爬虫3】_微信小程序_小游戏数据助手数据爬取
  9. 浅谈软件可视化分析内存消耗综述中的识别方法
  10. 最新YGbook小说网自适应源码 自动采集笔趣阁 附详细图文安装教程