| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 中文分词:隐马尔可夫-维特比算法(HMM-Viterbi)附源码 -> 正文阅读 |
|
[人工智能]中文分词:隐马尔可夫-维特比算法(HMM-Viterbi)附源码 |
目录 0、先验知识有关隐马尔科夫模型(HMM)可以查看: 马尔可夫链 以及 隐马尔可夫模型(HMM)_Flag_ing的博客-CSDN博客https://blog.csdn.net/Flag_ing/article/details/123123575?spm=1001.2014.3001.5502有关 维特比(Viterbi)算法可以查看: Viterbi算法(维特比算法)_Flag_ing的博客-CSDN博客https://blog.csdn.net/Flag_ing/article/details/123123660?spm=1001.2014.3001.5502中文分词数据集下载链接:icwb2-data中文分词数据集 - 数据集下载 - 超神经 (hyper.ai) 1、什么是中文分词与英文句子这样天生就是用空格隔开的构造不同,中文语句是连贯的,中文分词就是把连贯的中文语句拆分成分离的词语。要想让机器理解中文句子的关键信息,很多情况下需要对句子做分词处理。 比如对中文语句“很高兴遇到你。”这句话进行分词的结果就是“很_高兴_遇到_你_。”,一般来说,中文分词的结果不是唯一的,因为有些字可以认为独立成词,也可以与别的字连贯成词。 2、数据集的构造中文分词数据集一般都是人工标注的,如下图所示。每行都是一句话,相应的词语已经用空格隔开。 有了这些原始数据集,我们需要给他们打上标签(对应 HMM 中的隐藏状态),相当于做一个映射。可以根据个人喜好给每个词语打上标签,举个例子: 个词语开头的字可以用数字“0”代替,中间的字统统用数字“1”代替,结尾的字用数字“2”代替,如果是一个字或者标点等单独成词的话就用数字“3”代替。比如词“满怀信心”的标签就是“0112”,对于单独成词的“我”的标签就是“3”。由已分好的词可以得到相应的状态链,反过来由一条语句的状态链可以得到这条语句的分词结果。 3、训练及预测过程简述数据集的训练过程就是得到 HMM 的转移矩阵 A、观测概率矩阵 B、初始状态概率矩阵??的过程,如下图所示。 模型的预测过程就是输入观测向量 O(观测序列)得到状态序列 I(分词结果)的过程,如下图所示。 以下分别介绍相关矩阵的获取。 4、训练阶段:统计隐马尔可夫模型的参数在训练阶段,三个矩阵的获取都较为简单
该矩阵就是统计所有语句的开始第一个字的状态分布,根据前述,一共只能有两种可能的状态,即一个词的开始状态“0”或单独成词状态“3”,统计出所有训练集中的开始字的根部状态概率即可,结果为一个 ?的向量[p,0,0,1-p]。
统计训练集中每条语句每个词语的状态转移情况,最终归一化为概率,结果是一个 ?的矩阵。注意该矩阵每行的概率和为1,以及确定转移概率为 0 的位置,可用来检查训练结果。
统计四种状态中每个汉字及标点在每种状态下出现的次数,最终以行为单位进行归一化。假设汉字和标点共有 M 个,最终结果是一个 ?的矩阵 得到上述三个矩阵后训练阶段就完成了,可以看出,训练阶段其实就是对训练集数据做一个简单的统计。 接下来讲解如何使用训练出来的三个矩阵并利用Viterbi算法进行语句分词的预测。 5、预测阶段:应用 Viterbi 算法以输入一条语句“很高兴遇到你”为例,用 HMM 图形化表示如下图: 图中状态序列就是理想输出结果,观测序列就是我们的输入语句,根据马尔可夫模型?预测的状态序列即可得出最终的分词结果。这个过程称作解码。 在使用维特比算法解码过程中需要计算两个矩阵,下面分别介绍。 首先画出“很高兴遇到你”的状态转移图如下,图中已画出最优的状态连接。 计算图示路线概率的方法如下 由前述维特比算法的过程可知,图中最终会留下4条候选路径。如果想存储 状态转移图 中的信息,则需要两个矩阵: 1、一个?矩阵D存储路线的连接方式 2、一个 ?的矩阵P存储矩阵 D 中对应路线的概率。 第一个矩阵 ?存储候选路径的连接方向。状态转移图 的示例线路的存储方式见下表,如何理解这个矩阵呢?把上述 状态转移图 顺时针旋转90度就是了。 例如。P[1,0]=3代表字符“高”的状态“0”最有可能是字符“很”的状态“3”转移来的,对应着 状态转移图 中字符“很”的状态“3”连接字符“高”的状态“0”。 另一个矩阵 ?存储候选路线的概率。每行代表依次输入语句中的一个字符,每列代表该字符所处的状态。这里的概率对应矩阵 D 相应连线上的概率。第一行的概率由初始状态 Π 与观测矩阵 B 计算得来,接下来的每一行由上一行通过转移矩阵 A 与观测矩阵 B 计算得来。 例如,P[1,0]位置代表字符“很”的状态“3”连接到字符“高”的状态“0”的概率,而这个概率正是由字符“很”的4个状态与字符“高”的状态“0”的四种连接方式中挑出来的最高的那个。 有了上述两个矩阵就可以通过回溯来找出最优路径了:首先找出矩阵 P 最后一行的最大值,这个最大值就是最优路径的概率,该最大值的索引位置就是最后一个字符“你”的状态位,然后再矩阵 D 中找出相应位置的状态,这个 D 中的状态就是字符“你”所连接的上一个字符“到”的状态,此时矩阵 P 就结束了使命,接下来继续在矩阵 D 中向前回溯即可得到最终的最优状态链,根据该状态链就可以的出相应的分词结果。 有了上述 HMM—Viterbi 实现中文分词的原理及过程,就可以通过编程实现了。 6、完整的 Python 实现代码使用时注意修改相应的 文件路径?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:21:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |