中文分词,c++应用,想到jieba分词,结果还的自己封装。探索中

news2024/11/23 17:17:16

一、研究背景   

       随着互联网的快速发展,信息也呈了爆炸式的增长趋势。在海量的信息中,我们如何快速抽取出有效信息成为了必须要解决的问题。由于信息处理的重复性,而计算机又善于处理机械的、重复的、有规律可循的工作,因此自然就想到了利用计算机来帮助人们进行处理。在用计算机进行自然语言处理时,主要使用的还是基于统计的方法,并且实际的使用中取得了不错的效果。

       因为中文句子的特点——没有分隔符来分离句子中的词,所以在进行中文处理的时候,首先要做的就是如何对中文语句进行分词。这也是本次工程所要实现的功能。

       在这个工程中,实现的是一个分词系统。系统的主要的内容就是建立隐马尔科夫模型,用《人民日报语料库》进行训练得到模型参数,然后再用维特比算法求出最可能的隐含序列,最后将输入的句子分成一个个词的形式。

      

二、模型方法

       本工程主要使用的是隐马尔科夫模型和维特比算法。

       隐马尔科夫模型是一个统计模型,它可以用一个5元组来表示:{S,O,π,A,B}。下面对隐马尔科夫模型的五元组的学术含义和工程含义进行说明,通过对比直观的了解五元组在实际工程中的含义:

HMM五元素

学术含义

工程含义

S

隐含转态

词中4种状态:词头、词中、词尾、单字成词

O

观察状态

语料库中的全部汉字

π

初始状态概率矩阵

各种隐含状态的初始概率

A

隐含状态转移概率矩阵

4种隐含状态的转移概率

B

观察状态转移概率矩阵

每一个汉字到四种状态的概率

       在本工程中,为每个汉字设置了可能的四种状态:词头([/B]Begin)、词中([/M]Middle)、词尾([/E]End)和单字成词([/S]Single)。

       根据设置的状态,举个例子说明五个参数:

       假设输入的语句为:我是中国人

              S={/B、/M、/E、/S}

              O={迈、向、新、充、满、……}(语料库中的所有不重复汉字)

              π={P(我|B)、P(我|M)、P(我|E)、P(我|S)}

              A=

/B

/M

/E

/S

/B

0

0.3

0.7

0

/M

/E

/S

              B=

/B

0.3

/M

/E

0.6

/S

       上述涉及到的概率均可从语料库中根据统计得到。

三、系统设计

       本分词系统主要分为两个部分,一个部分是通过语料库训练出需要的文件。该部分只要执行一次即可。另一个部分是根据输入的语句,构建具体的模型参数(通过上面也可以看到,根据具体输入得到对应的概率),然后执行维特比算法求出最佳的隐含状态序列。根据隐含状态序列得到最终的分词结果。

       系统的开发语言是C++。C++在处理中文方面显得有点不方便——表示英文字符时用的是一个字节,表示中文时用的是两个字节(可以通过判断字符是否小于0来分出是ASCII字符还是中文字符)。但是最后还是通过一些技巧解决了C++处理中文的不便带来的问题。

       1、语料库处理

              (1)去掉原语料库中的词性

                     A、原始语料库如图所示:

                     B、处理后的语料库(在每行前面加了一个空格并去掉了词性)

                     C、处理流程图

              (2)统计每个状态中出现的字及其个数

                     A、设计的数据结构如下:

 struct node

{

       string name;//保存单个字

       int quantity;//字出现的次数

       bool operator ==(const node & a){

                return name==a.name;

       }

 };



 struct Word

 {

       string name;//状态名

      long long num;//状态出现次数

       list<node> chinese;

       bool operator ==(const Word & a){

                return name==a.name;

       }

       bool findCh(string ch)

       {

                node temp;

                temp.name=ch;

                temp.quantity=1;

                list<node >::iterator it;

                it=find(chinese.begin(),chinese.end(),temp);

                if(it==chinese.end()){

                        chinese.push_back(temp);

                }

                else{

                        it->quantity++;

                }

                return true;

       }

 };

                     B、处理步骤

                            a、从语料库读入一行字符串,再遍历字符串获得一个中文字

                            b、判断字的前后是否是空格,得到字对应的状态(S:前面是空格后面不是;M:前后都不是空格;E:前面不是空格后面是空格;S:前后都是空格)

                            c、根据字的状态,判断该字是否在该状态下出现过。是,对应字个数加1,否,插入新节点并且个数设置为1)

                            d、读到文件末尾结束

                     C、结束后得到如下的文件

              (3)统计状态间的转换,求得状态转移矩阵

                     A、统计出各个状态间转换在语料库中出现的次数及状态转换的总次数,计算出对应的概率

                     B、该步骤的输入语料库如下:

                           

                     C该过程结束后可以得到4*4的状态转移矩阵

       2、viterbi算法解码,求最佳隐含序列

              (1)维特比算法是一种动态规划算法。在本工程中,通过当前状态的前一个状态,计算出在前面状态出现的条件下出现当前状态的概率,并取最大值作为当前状态出现的概率。通过迭代可以计算出到最后一个字时,哪个状态出现的概率最大。最后通过回溯得到最佳的隐含状态序列。

              (2)算法伪代码如下:

四,系统演示与分析

       1、测试样例及结果

       2、结果分析

              (1)商品和服务->BESBE->商品/和/服务/

              (2)中国在比赛中取得了胜利->BESBESBESBE->中国/在/比赛/中/取得/了/胜利/

              (3)分词说明:根据维特比算法求得了隐含序列后,顺序输出,当该字是处于E状态或者S状态时,在该字后添加‘/’,输出后即可看到分词的效果。

              (4)由于每个字都有一个状态,所以在分词过程中,有可能会把原来是词的分开了,原来不是词的合成了词,造成错误的分词。比如上面的“明天”被拆开了,而“天会”被则被合成起来了。再比如,“和尚”和“尚未”都被分开了,即使词库中有这两个字。

       3、改进方案

              本工程仅仅依靠HMM实现,因此必然存在一定的缺陷。为了改进该系统,可以结合其他的分词方法,在HMM实现过程中或实现结束后再做进一步分析,以得到更好的分词效果。

五,参考资料

       1、http://www.tuicool.com/articles/FRZ77b 利用统计进行中文分词与词性分析

       2、基于N最短路径和隐马尔科夫模型的中文POI分词系统的研究 唐霄

       3、基于逆向隐马尔可夫模型的中文分词方法研究

       4、http://blog.csdn.net/sight_/article/details/43307581  隐马尔科夫模型详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术必备:接口自动化测试数据校验神器【JSonPath】

我们今天不讲如何开发一款自定义开发校验规则库&#xff0c;而是给大家分享一款在开发自定义校验规则库或者常规的接口自动化测试时&#xff0c;经常会用到的一款数据提取神器&#xff1a;JSonPath。 1. JSonPath介绍 JSonPath是一种简单的方法来提取给定JSON文档的部分内容。…

Visual Components对重型机械工业的影响 衡祖仿真

一、重型机械行业面临的挑战 此行业制造商面临着许多挑战&#xff0c;首先是世界各地实施的环境法规不断增多&#xff0c;可持续建筑实践、改善空气质量和减少排放已成为产品设计和开发背后的主要驱动力&#xff0c;健康和安全标准也在不断发展&#xff0c;给已经面临熟练劳动…

Mongodb入门--头歌实验MongoDB 复制集 分片

一、MongoDB之副本集配置 1.1MongoDB主从复制 主从复制是MongoDB最早使用的复制方式&#xff0c; 该复制方式易于配置&#xff0c;并且可以支持任意数量的从节点服务器&#xff0c;与使用单节点模式相比有如下优点&#xff1a; 在从服务器上存储数据副本&#xff0c;提高了数…

机器学习——模型融合:Boosting算法

机器学习——模型融合&#xff1a;Boosting算法 1. Boosting核心思想 Boosting算法是一种集成学习方法&#xff0c;其核心思想是通过组合多个弱学习器&#xff08;即准确率略高于随机猜测的学习器&#xff09;来构建一个强学习器&#xff08;即准确率较高的学习器&#xff09…

【C++】——list的介绍及使用 模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.…

open-sora

Open-Sora&#xff0c;高效复现类Sora视频生成方案开源&#xff01;魔搭社区最佳实践教程来啦&#xff01;https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

蓝桥杯真题Day48 倒计时5天 练了几道真题小程序+回溯剪枝应用一个小程序

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从0到 n−1&#xff0c;你可以将其视作是一个具有n位的十进制数字num&#xff0c;小蓝可以从num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次…

系统思考—策略性陪伴

每次与客户的相遇和合作&#xff0c;我都深感这不仅是工作的一部分&#xff0c;更是缘分的一种体现。释迦摩尼曾说&#xff1a;“只有很深很深的缘份&#xff0c;才能在同一条路上走了又走&#xff0c;同一个地方去了又去&#xff0c;同一个人见了又见。” 这些话让我更加珍惜与…

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树 738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈…

自然语言控制机械臂:ChatGPT与机器人技术的融合创新(上)

引言&#xff1a; 自OpenAI发布ChatGPT以来&#xff0c;世界正迅速朝着更广泛地将AI技术融合到机器人设备中的趋势发展。机械手臂&#xff0c;作为自动化与智能化技术的重要组成部分&#xff0c;在制造业、医疗、服务业等领域的应用日益广泛。随着AI技术的进步&#xff0c;机械…

数据结构篇:深度剖析跳跃表及与B+树优劣分析

本文旨在探讨跳跃表的特性及其在实际应用场景中的作用&#xff0c;同时对其与B树进行比较&#xff0c;以帮助更好地理解和运用这两种数据结构。 跳跃表 什么是跳跃表&#xff08;skip list&#xff09; 跳跃表是一种基于跳跃链表的有序数据结构&#xff0c;它是一种多层链表&…

阿里云租用服务器GPU配置报价单_1年_一个月_1小时价格表

阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用&#xff0c;阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云GPU…

高创新 | [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测

高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测 目录 高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现 [24年新算…

dPET论文笔记

PBPK论文笔记 题目&#xff1a;Self-supervised Learning for Physiologically-Based Pharmacokinetic Modeling in Dynamic PET 摘要 动态正电子发射断层扫描成像 &#xff08;dPET&#xff09; 提供示踪剂的时间分辨图像。从 dPET 中提取的时间活动曲线 &#xff08;TAC&a…

竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

npm 切换成淘宝源,以及遇到npm 报错如何解决

淘宝源&#xff1a;npm config set registryhttps://registry.npmmirror.com/ 然后再npm下 package-lock.json这个删了 npm i再试一下

兮兮牧场养殖小游戏积分兑换互动商城引流模式

刚注册的新会员必须要进入牧场才能激活所有功能 一、获得动物的途径的方式 第一种是邀请好友注册获得&#xff0c;第二种是看广告获得 邀诘好友注册获得动物明细: 1、从兮兮牧场的邀请好友的链接去邀请好友才能获得&#xff0c;其他邀请码无效 2、注册赠送小鸡一只; 3、邀…

unity在linux环境下videoplayer 无法播放问题解决路径

1、问题 一个项目需要在linux下播放视频&#xff0c;并且视频在机器上&#xff0c;也就是要使用应用外的视频文件进行播放。 视频的格式当前提供的事avi格式&#xff0c;并且使用videoplayer 在windows下播放正常。 但是发出包之后再Ubuntu环境怎么都无法播放。 2、测试环境…

ThingsBoard通过MQTT发送属性数据

MQTT基础 客户端 MQTT连接 属性上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…