「hmm分词java」hmm分词算法
今天给各位分享hmm分词java的知识,其中也会对hmm分词算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
HMM 中文分词
隐马尔科夫模型 HMM 通常用于处理 时间序列数据 ,数据包含长度一样的隐藏状态和观测序列,可以通过观测数据预测出隐藏状态。例如在分词时,观测序列是 ”我喜欢计算机“,其中每个字对应的隐藏状态是 ”SBEBME“。HMM 也可以用于语音识别,给定一段音频 (观测序列),识别出里面的每个文字 (隐藏状态)。
假设系统拥有不同的状态,每个时刻状态都会发生变化,我们可以用马尔科夫模型总结出系统状态变化的规律。以天气变化为例,现在有三种天气 {晴天,雨天,多云},和很多天的天气状态序列 D1, D2, D3,..., DM。则我们可以根据前 n 天的天气,预测第 M+1 个天气状态的概率。
这也称为 n 阶马尔科夫模型,即当前状态仅依赖于前面 n 个状态,通常比较常用的是一阶马尔科夫模型,即当前预测的状态仅依赖于前一时刻的状态。
一阶马尔科夫模型可以定义一个 状态转移矩阵 T , T 的行数和列数均等于状态个数, T 描述了从一个状态转移到另一个状态的概率,如下图所示。
即如果今天是雨天,则明天是晴天的概率是 0.3。除了 状态转移矩阵 ,还需要定义一个 初始概率向量 I ,表示第一天时,每种天气状态的概率。初始概率向量如下:
总的来说,定义一个一阶马尔科夫模型需要:
马尔科夫模型还有一个性质,不管今天的天气如何,在很多天之后的状态分布会收敛到一个固定的概率分布,称为 稳态分布 。例如第一天是晴天,给定的 T 如上文所示,则很多天 (n天) 之后的概率分布 p 为:
这是因为 T 自乘无穷次之后,每一行的数值都是一样的,因此不管第一天天气如何,无穷天后的概率分布都是稳定的。
有的时候我们只能看到观察的序列,而不能直接看到隐藏的状态,此时就需要使用隐马尔科夫模型。例如有一个被关在一个密闭的房间里,没办法查看到天气,但是可以通过一个湿度计查看湿度。
由于湿度 (观察状态) 和天气 (隐藏状态) 之间存在联系,HMM 可以根据给出的观测状态序列,估计出对应的隐藏状态序列,同时可以对未来的隐藏状态和观察状态进行预测。
隐马尔科夫模型还需要增加一个 发射概率矩阵 E , E 的行数等于隐藏状态个数,列数为观察状态个数, E ij 表示隐藏状态为 i 时,观察状态为 j 的概率。
总的来说,定义一个一阶隐马尔科夫模型以下参数,这些就是 HMM 的参数:
隐马尔科夫模型比较常见的三个问题分别是:评估问题,解码问题和学习问题。
评估问题 :我们已经知道模型的参数 ( S , O , T , I , E ),给定一个观测序列 X (例如 干燥、干燥、潮湿、....、适中),评估问题要计算出得到这样一个观测序列 X 的概率值。求解评估问题的方法有 前向算法 和 后向算法 。
解码问题 :已经知道模型的参数 ( S , O , T , I , E ),给定一个观测序列 X ,找出使观测序列概率最大的隐藏状态序列 Y 。求解的方法有 Viterbi 算法 。
学习问题 :学习问题是指在未知模型参数的时候,通过数据集学习出模型的参数 ( S , O , T , I , E )。学习问题包监督学习方法和非监督学习方法,如果我们同时拥有观察序列 X 和状态序列 Y ,则可以采用监督学习;如果只有观测序列 X ,则只能采用非监督学习,非监督学习的算法有 Baum-Welch 算法。
HMM 可以用于中文分词的任务,其隐藏状态包含 4 种,分别是 SBME,S 表示单个字的词,而 B 表示多字词的第一个字,M 表示多字词中间的字,E 表示多字词最后一个字,如下图所示。
用 HMM 进行中文分词,要通过观察序列找出最有可能的隐藏状态序列,主要涉及 学习问题 和 解码问题 。
可以使用已经标注好的数据 (即有观察序列 X 和隐藏状态序列 Y ) 的数据集进行有监督学习。数据集包含很多句子,每个句子都有 X 和 Y 。那么我们就可以通过统计得到 HMM 的状态转移矩阵、发射矩阵和初始概率向量。
状态转移矩阵 T : T ij 表示从状态 i 转移到状态 j 的概率,需要统计数据集里面从状态 i 转移到 状态 j 的个数 A ij,然后除以状态 i 转移到所有状态的个数 A i。
例如我们可以用下面的公式计算从状态 B 转到状态 E 的概率:
中文分词的时候是不存在从状态 B 到状态 B 的,也不存在 B 到 S,所以 Count(BB) 和 Count(BS) 都是 0。
发射概率矩阵 E : E ij 表示在状态 i 时得到观察值 j 的概率。计算方法是统计状态 i 且观察值为 j 的个数 B ,然后除以状态 i 的个数。
初始概率向量 I :I 只要统计每个句子第一个状态,得到第一个状态的概率分布即可。
在学习得到 HMM 的参数后,可以通过 HMM 解码算法 (Viterbi 算法) 求解出句子的隐状态,最终分词。具体做法可以参考《统计学习方法》。
《统计学习方法》
自然语言处理(NLP)的基础难点:分词算法
自然语言处理(NLP,Natural Language Processing)是人工智能领域中的一个重要方向,主要研究人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理的底层任务由易到难大致可以分为词法分析、句法分析和语义分析。分词是词法分析(还包括词性标注和命名实体识别)中最基本的任务,也是众多NLP算法中必不可少的第一步,其切分准确与否往往与整体结果息息相关。
金融领域分词的难点
分词既简单又复杂。简单是因为分词的算法研究已经很成熟了,大部分的算法(如HMM分词、CRF分词)准确率都可以达到95%以上;复杂则是因为剩下的5%很难有突破,主要可以归结于三点:
▲粒度,即切分时的最小单位,不同应用对粒度的要求不一样,比如“融资融券”可以是一个词也可以是两个词
▲歧义,比如“恒生”一词,既可指恒生公司,又可指恒生指数
▲未登录词,即未出现在算法使用的词典中的词,比如不常见的专业金融术语,以及各种上市公司的名称
在金融领域中,分词也具有上述三个难点,并且在未登录词方面的难点更为突出,这是因为金融类词汇本来就多,再加上一些专有名词不仅有全称还有简称,这就进一步增大了难度。
在实际应用中,以上难点时常会造成分词效果欠佳,进而影响之后的任务。尤其是在一些金融业务中,有许多需要与用户交互的场景,某些用户会用口语化的词汇描述业务,如果分词错误会影响用户意图的解析,这对分词的准确性提出了更高的要求。因此在进行NLP上层应用开发时,需要对分词算法有一定的了解,从而在效果优化时有能力对分词器进行调整。接下来,我们介绍几种常用的分词算法及其应用在金融中的优劣。
几种常见的分词算法
分词算法根据其核心思想主要分为两种:
第一种是基于字典的分词,先把句子按照字典切分成词,再寻找词的最佳组合方式,包括最大匹配分词算法、最短路径分词算法、基于N-Gram model的分词算法等;
第二种是基于字的分词,即由字构词,先把句子分成一个个字,再将字组合成词,寻找最优的切分策略,同时也可以转化成序列标注问题,包括生成式模型分词算法、判别式模型分词算法、神经网络分词算法等。
最大匹配分词寻找最优组合的方式是将匹配到的最长词组合在一起,主要的思路是先将词典构造成一棵Trie树(也称为字典树),Trie树由词的公共前缀构成节点,降低了存储空间的同时可以提升查找效率。
最大匹配分词将句子与Trie树进行匹配,在匹配到根结点时由下一个字重新开始进行查找。比如正向(从左至右)匹配“他说的确实在理”,得出的结果为“他/说/的确/实在/理”。如果进行反向最大匹配,则为“他/说/的/确实/在理”。
这种方式虽然可以在O(n)时间对句子进行分词,但是只单向匹配太过绝对,尤其是金融这种词汇较丰富的场景,会出现例如“交易费/用”、“报价单/位”等情况,所以除非某些词的优先级很高,否则要尽量避免使用此算法。
最短路径分词算法首先将一句话中的所有词匹配出来,构成词图(有向无环图DAG),之后寻找从起始点到终点的最短路径作为最佳组合方式,例:
我们认为图中每个词的权重都是相等的,因此每条边的权重都为1。
在求解DAG图的最短路径问题时,总是要利用到一种性质:即两点之间的最短路径也包含了路径上其他顶点间的最短路径。比如S-A-B-E为S到E到最短路径,那S-A-B一定是S到B到最短路径,否则会存在一点C使得d(S-C-B)d(S-A-B),那S到E的最短路径也会变为S-C-B-E,这就与假设矛盾了。利用上述的最优子结构性质,可以利用贪心算法或动态规划两种求解算法:
(1)基于Dijkstra算法求解最短路径,该算法适用于所有带权有向图,求解源节点到其他所有节点的最短路径,并可以求得全局最优解;
(2)N-最短路径分词算法,该方法是对Dijkstra算法的扩展,在每一步保存最短的N条路径,并记录这些路径上当前节点的前驱,在最后求得最优解时回溯得到最短路径。这种方法的准确率优于Dijkstra算法,但在时间和空间复杂度上都更大。
相较于最大匹配分词算法,最短路径分词算法更加灵活,可以更好地把词典中的词组合起来,能更好地解决有歧义的场景。比如上述“他说的确实在理”这句话,用最短路径算法的计算结果为“他/说/的/确实/在理”,避免了正向最大匹配的错误。但是对于词典中未存在的词基本没有识别能力,无法解决金融领域分词中的“未登录词”难点。
N-Gram(又称N元语法模型)是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。在此种假设下,可以简化词的条件概率,进而求解整个句子出现的概率。
现实中,常用词的出现频率或者概率肯定比罕见词要大。因此,可以将求解词图最短路径的问题转化为求解最大概率路径的问题,即分词结果为“最有可能的词的组合“。
计算词出现的概率,仅有词典是不够的,还需要充足的语料,所以分词任务已经从单纯的“算法”上升到了“建模”,即利用统计学方法结合大数据挖掘,对“语言”(句子出现的概率)进行建模。
我们将基于N-gram模型所统计出的概率分布应用到词图中,可以得到词的概率图。对该词图用最短路径分词算法求解最大概率的路径,即可得到分词结果。
相较于前两种分词算法,基于N-Gram model的分词算法对词频进行了统计建模,在切分有歧义的时候力求得到全局最优值,比如在切分方案“证券/自营/业务”和“证券/自/营业/务”中,统计出“证券/自营/业务”出现的概率更大,因此结果有更高的准确率。但也依然无法解决金融场景中未登录词的问题。
生成式模型主要有隐马尔可夫模型(HMM,Hidden Markov Model)、朴素贝叶斯分类等。HMM是常用的分词模型,基于Python的jieba分词器和基于Java的HanLP分词器都使用了HMM。
HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,另一种是隐状态序列,即观测序列的标签。假设观测序列为X,隐状态序列是Y,则因果关系为Y-X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。
HMM算法可以在一定程度上解决未登录词的问题,但生成式模型的准确率往往没有接下来要谈到的判别式模型高。
判别式模型主要有感知机、支持向量机(SVM,Support Vector Machine)、条件随机场(CRF,Conditional Random Field)、最大熵模型等,其中感知机模型和CRF模型是常用的分词模型。
(1)平均感知机分词算法
感知机是一种简单的二分类线性模型,通过构造超平面,将特征空间(输入空间)中的样本分为正负两类。通过组合,感知机也可以处理多分类问题。但由于每次迭代都会更新模型的所有权重,被误分类的样本会造成很大影响,因此采用平均的方法,在处理完一部分样本后对更新的权重进行平均。
(2)CRF分词算法
CRF可以看作一个无向图模型,假设给定的标注序列为Y,观测序列为X,CRF对条件概率P(Y|X)进行定义,而不是对联合概率建模。
平均感知机算法虽然速度快,但仍不够准确。适合一些对速度要求高、对准确性要求相对不那么高的场景。CRF分词算法可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词也有很好的识别能力,是目前在速度、准确率以及未登录词识别上综合表现最突出的算法,也是我们目前所采用的解决方案,但速度会比感知机慢一些。
在NLP中,最常用的神经网络为循环神经网络(RNN,Recurrent Neural Network),它在处理变长输入和序列输入问题中有着巨大的优势。LSTM(Long Short-Term Memory,长短期记忆网络)为RNN变种的一种,在一定程度上解决了RNN在训练过程中梯度消失和梯度爆炸的问题。
目前对于序列标注任务,业内公认效果最好的模型是BiLSTM+CRF。相比于上述其它模型,双向循环神经网络BiLSTM,可以更好地编码当前字等上下文信息,并在最终增加CRF层,核心是用Viterbi算法进行解码,以得到全局最优解,避免B,S,E这种不可能的标记结果的出现,提高准确率。
神经网络分词虽然能在准确率、未登录词识别上有更好的表现,但RNN无法并行计算,在速度上没有优势,所以该算法通常在算法研究、句子精确解析等对速度要求不高的场景下使用。
分词作为NLP底层任务之一,既简单又重要,很多时候上层算法的错误都是由分词结果导致的。因此,对于底层实现的算法工程师,不仅需要深入理解分词算法,更需要懂得如何高效地实现和调试。
而对于上层应用的算法工程师,在实际分词时,需要根据业务场景有选择地应用上述算法,比如在搜索引擎对大规模网页进行内容解析时,对分词对速度要求大于精度,而在智能问答中由于句子较短,对分词的精度要求大于速度。
HMM是什么意思?
隐马尔可夫模型(HMM)是指隐马尔可夫模型,是一种用于描述参数未知的马尔可夫过程的统计模型。困难在于从可观察的参数中确定过程的隐藏参数。这些参数然后被用于进一步的分析,例如模式识别。
隐马尔可夫模型最早是由伦纳德·鲍姆(Leonard E. Baum)和其他作者在20世纪60年代下半叶的一系列统计论文中描述的。隐马尔可夫模型的最初应用之一是语音识别,始于20世纪70年代中期。
20世纪80年代后半期,隐马尔可夫模型开始应用于生物序列的分析,特别是DNA。自此,隐马尔可夫模型逐渐成为生物信息学领域不可或缺的技术。
扩展资料:
隐马尔可夫模型三大假设。
1)齐次马尔可夫假设。又叫一阶马尔可夫假设,即任意时刻的状态只依赖前一时刻的状态,与其他时刻无关。符号表示为:
2)观测独立性假设。任意时刻的观测只依赖于该时刻的状态,与其他状态无关。
3)参数不变性假设。上面介绍的三大要素不随时间的变化而改变,即在整个训练过程中一直保持不变。
参考资料来源:百度百科-隐马尔可夫模型
如何用HMM做中文分词?
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
分词算法HMM隐马尔可夫模型
在网上看了很多关于马尔可夫模型的资料,有很多文章写得不错,在此记录自己学习过程中的笔记
隐马尔可夫模型(Hidden Markov Model, HMM)是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为 状态序列 ;每个状态生成一个观测,而由此产生的观测的随机序列,称为 观测序列 。序列的每一个位置又可以看作是一个时刻。
隐马尔可夫模型由初始概率分布、状态转移概率分布以及观测概率分布确定。
一个简单的例子
假设我们有3颗不同的骰子。第一个是6面体、第二个是4面体、第三个是8面体,对应每一面数值分别为(1,2,3,4,5,6)、(1,2,3,4)、(1,2,3,4,5,6,7,8),出现概率分别为
我们开始掷骰子,我们从这三个骰子里挑选一个骰子的概率为 。我们掷骰子的数值在1~8之间。当不停的掷骰子我们会得到一串数字序列。例如(掷骰10次):1、6、3、5、2、7、3、5、 2、4。
上图可以看出马尔可夫模型为节点为隐含状态,边为转移概率的有向图模型,接下来我们通过这个例子介绍几个概念。
可见状态链(观测序列) :掷骰子得到的这串数字对应概念中我们可观察的参数。
隐含状态链(状态序列) :在这个掷骰子的例子中隐含状态链为我们掷的骰子的序列(有多种可能)。隐含状态(骰子)之间存在转换概率,D4的下一个状态D4、D6、D8的概率都是 。
转换概率(状态转移概率): 隐含状态转换(骰子改变)的概率
输出概率(发射状态): 尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率。就我们的例子来说,六面体掷出1的概率为 ,四面体掷出1的概率为 ,八面体掷出1的概率为 。
当然转换概率和输出概率我们都是随意更改的,比如输出概率方面我们对骰子做点手脚可以让例如六面体掷出1的概率为 ,其它数字的概率为 。转换概率方面我们可以放入比如在2颗D6、4颗D4、4颗D8中选择筛子,然后有放回的选择筛子,转换概率D6为0.2, D4为0.4,D8为0.4。
使用维特比算法(Viterbi algorithm)进行分词根据观测序列推断出状态序列
观察值序列:小明硕士毕业于中国科学院计算所
隐含状态集:隐含状态指的是每个字的状态。 有词语的开头、词语的中间字、词尾、单个字,这里的隐含状态集有4个状态对应的英文字母{B,M,E,S}
输入:小明硕士毕业于中国科学院计算所
输出:BEBEBMEBEBMEBES(BE/BE/BME/BE/BME/BE/S =小明/硕士/毕业于/中国/科学院/计算/所)
1、定义V[id][字的状态] = 概率,注意这里的概率,前几个的字的状态都确定下来了(概率最大),这里的概率就是一个累乘的概率了。
2、因为第一个字为‘小’,所以第一个字的概率V[1][B]= 初始概率[B] *发射概率[B][‘小’],同理可得V[1][M]、V[1][E]、V[1][S]选择其中概率最大的一个加入到结果序列。
3、从第二个字开始,对于字的状态Y,都有前一个字的状态是X的概率* X转移到Y的概率 * Y状态下输出字为‘明’的概率。因为前一个字的状态Y有四种可能,所以Y的概率有四个,选取其中较大一个作为V[2][字的状态]的概率,同时加入到结果序列中。
4、比较V[15][B]、V[15][M]、V[15][E]、V[15][S],找出较大的哪一个对应的序列,就是最终结果。
hmm分词java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于hmm分词算法、hmm分词java的信息别忘了在本站进行查找喔。