(三)NLP HMM应用之中文分词

NLP HMM应用之中文分词

HMM的典型介绍就是这个模型是一个五元组:

  1. StatusSet: 状态值集合(隐状态)
  2. ObservedSet: 观察值集合(输出文字集合)
  3. TransProbMatrix: 转移概率矩阵(隐状态)
  4. EmitProbMatrix: 发射概率矩阵(隐状态表现为显状态的概率)
  5. InitStatus: 初始状态概率(隐状态)
    HMM解决的三种问题:
    参数(StatusSet, TransProbMatrix, EmitRobMatrix, InitStatus)已知的情况下,求解观察值序列概率。
    参数(ObservedSet, TransProbMatrix, EmitRobMatrix, InitStatus)已知的情况下,求解状态值序列S。
    参数(ObservedSet)已知的情况下,求解(TransProbMatrix, EmitRobMatrix, InitStatus)。

一、使用HMM解决中文分词问题

问题属性:参数(ObservedSet, TransProbMatrix, EmitRobMatrix, InitStatus)已知的情况下,求解状态值序列S。

1、问题假设

对于中文分词问题,我们认为一个中文序列是由某种隐含状态序列生成的,隐含状态集合StatusSet
为(B, M, E, S): {B:begin, M:middle, E:end, S:single}。
每个状态分别代表的是该字在词语中的位置:
• B代表该字是词语中的起始字;
• M代表是词语中的中间字;
• E代表是词语中的结束字;
• S则代表是单字成词。
即每个状态可以产生所有汉子中的每一个汉字,但产生的概率不同。理解的话可以将状态B,M,E,S理解成四个面不同的筛子 ,每个筛子产生数字1到10的概率都不相同。其中数字1到10就相当于所有汉字。
而在这些汉字中,任意选一个到多个组成序列有很多很多,这些序列组成的集合叫做观察值集合ObservedSet:我们认为生活中的所有句子(包括标点符号)都是在观察值集合中取出来的。如:句子“小明硕士毕业于中国科学院计算所”就是观察值集合的一个元素
约束:决定了隐含状态之间的转换概率
StatusSet & ObservedSet:
B后面只可能接(M or E),不可能接(B or S)。而M后面也只可能接(M or E),不可能接(B, S)。

实际上根据我们的假设,一句话产生过程如下:
状态B产生了汉字接着
状态E产生了汉字接着
状态B产生了汉字接着
状态E产生了汉字接着
状态B产生了汉字接着
状态M产生了汉字接着
状态E产生了汉字接着
状态B产生了汉字接着
状态E产生了汉字接着
状态B产生了汉字接着
状态M产生了汉字接着
状态E产生了汉字接着
状态B产生了汉字接着
状态E产生了汉字接着
状态S产生了汉字接着

状态序列:B E B E B M E B E B M E B E S
输出序列:小明硕士毕业于中国科学院计算所
注: 个人认为也可以反过来假设,
输出序列:B E B E B M E B E B M E B E S
状态序列:小明硕士毕业于中国科学院计算所

2、问题解决

知道了我们产生句子的过程,我们也就能明白我们要做的事情,
那就是根据输出序列小明硕士毕业于中国科学院计算所
计算出 状态序列 B E B E B M E B E B M E B E S
要计算出状态序列首先我们需要知道:

1、InitStatus初始状态概率分布:

即根据处理后的语料,我们要统计出,句子的第一个字属于{B,E,M,S}这四种状态的概率。(注:-3.14e+100作为负无穷,也就是对应
的概率值是0。下同)
在这里插入图片描述

2、TransProbMatrix转移概率矩阵:

TransProbMatrix转移概率矩阵:是马尔科夫链很重要的一个知识点。
• 马尔科夫链最大的特点就是当前T=i时刻的状态Status(i),只和T=i时刻之前的n个状态有关。
也就是: {Status(i-1), Status(i-2), Status(i-3), … Status(i - n)}
TransProbMatrix,其实就是一个4x4 (4就是状态值集合的大小)的二维矩阵。 矩阵的横坐标和纵
坐标顺序是BEMS x BEMS。
即根据处理后的语料以及约束条件,我们要计算或者统计出隐含状态之间转移概率矩阵:
在这里插入图片描述

3、EmitProbMatrix发射概率矩阵:

发射概率矩阵也就是输出概率矩阵:即隐含状态输出某一个汉字的概率写到一起而构成的矩阵。
根据HMM模型的基本假设“观察值独立性假设”,观察值只取决于当前状态值,也就是:
在这里插入图片描述
其中P(Observed[i] | Status[j])这个值就是从EmitProbMatrix中获取。
发射概率矩阵的行坐标和列
坐标顺序是BEMS x 汉字个数。
根据处理后的语料,我们要统计出发射概率矩阵:

在这里插入图片描述
整理一下题目:已知输出序列为:小明硕士毕业于中国科学院计算,所根据HMM模型求出隐含状态序列。
解法:使用维特比算法(Viterbi algorithm)可计算出隐含状态链
首先利用初始状态概率分布和发射矩阵计算出产生的最大概率对应的隐含状态,经计算为状态B
在这里插入图片描述
在状态B的基础上利用转移概率矩阵和发射矩阵计算出产生的最大概率对应的隐含状态,经计算为状态E
转移概率矩阵B行的4个值与列的4个值对应相乘 ,取最大值对应的状态。以此类推可得数所有隐含状态值。

二、jieba分词

jieba分词作为一个开源项目,在准确度和速度方面均不错,是我们平时常用的分词工具。
jieba分词是一个开源项目,地址为https://github.com/fxsjy/jieba
支持三种分词模式:

  1. 精确分词:试图将句子最精确的切开,适合文本分析
  2. 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义
  3. 搜索引擎模式:在精确模式基础上,对长词进行再次切分,提高recall,适合于搜索引擎
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# HMM实现中文分词是一种基于隐马尔可夫模型中文分词方法。在这种方法中,首先将待分词的文本转化为一个字符序列,然后使用隐马尔可夫模型对这个字符序列进行分词。具体来说,隐马尔可夫模型将每个字符视为一个状态,将每个词视为一个观测值,通过计算每个状态到下一个状态的转移概率和每个状态到观测值的概率,来确定最可能的分词结果。 在C#中,可以使用第方库Jieba.NET来实现中文分词。Jieba.NET支持种分词模式:精确模式、全模式和搜索引擎模式,并且支持添加自定义词典和自定义词。此外,Jieba.NET还提供了Counter类来统计词频,方便用户进行文本分析。 下面是一个使用Jieba.NET进行中文分词的示例代码: ``` var segmenter = new JiebaSegmenter(); var segments = segmenter.Cut("在数学和计算机科学之中,算法(algorithm)为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。"); foreach (var segment in segments) { Console.WriteLine(segment); } ``` 输出结果为: ``` 在 数学 和 计算机科学 之中 , 算法 ( algorithm ) 为 任何 良 定义 的 具体 计算步骤 的 一个 序列 , 常用 于 计算 、 数据处理 和 自动 推理 。 精确 而言 , 算法 是 一个 表示 为 有限 长 列表 的 有效 方法 。 算法 应 包含 清晰 定义 的 指令 用于 计算 函数 。 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值