隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注

笔记转载于GitHub项目https://github.com/NLP-LOVE/Introduction-NLP

7. 词性标注

7.1 词性标注概述

  1. 什么是词性

    在语言学上,词性(Par-Of-Speech, Pos )指的是单词的语法分类,也称为词类。同一个类别的词语具有相似的语法性质,所有词性的集合称为词性标注集。不同的语料库采用了不同的词性标注集,一般都含有形容词、动词、名词等常见词性。下图就是HanLP输出的一个含有词性的结构化句子。

    我/r 的/u 希望/n 是/v 希望/v 张晚霞/nr 的/u 背影/n 被/p 晚霞/n 映/v 红/a

    每个单词的后边跟的就是词性标签:

    词性标签 词性
    r 代词
    u 动词
    n 名词
    v 动词
    nr 人名
    p 介词
    a 形容词
  2. 词性的用处

    词性的作用是提供词语的抽象表示,词的数量是无穷的,但词性的数量是有限的。词性支撑着许多高级应用,当下游应用遇到 OOV 时,可以通过 OOV 的词性猜测用法,比如上面的句子“林晚霞”就识别为人名进行处理,而不会拆开。

    词性也可以直接用于抽取一些信息,比如抽取所有描述特定商品的形容词等。

  3. 词性标注

    词性标注指的是为句子中每个单词预测一个词性标签的任务。它有以下两个难点:

    • 汉语中一个单词多个词性的现象很常见,但在具体语境下一定是唯一词性。
    • OOV 是任何自然语言处理任务的难题。
  4. 词性标注模型

    统计方法为这两个难点提供了解决方案,那就是我们熟悉的序列标注模型。只需将中文分词中的汉字替换为词语,{B,M,E,S} 替换为“名词、动词、形容词等”,序列标注模型马上就可以用来做词性标注。

    词性标注既可以看作中文分词的后续任务,也可以与中文分词集成为同一个任务。其中就可以把分词语料库加上词性标签就可以了,这样同时进行多个任务的模型称为联合模型。由于综合考虑了多种监督信号,联合模型在几乎所有问题上都要优于独立模型。

    然而工业界就没有那么理想,同时具有分词和词性标注的语料库非常少,需要大量的人力进行标注。

7.2 词性标注语料库与标注集

同中文分词一样,语言学界在标注规范上存在分歧,导致目前还没有一个被广泛接受的汉语词性划分标准。无论是词性划分的颗粒度,还是词性标签都不统一。一方面,各研究机构各持己见、派系林立,标注了大量互不兼容的语料库。另一方面,部分语料库受到严格版权控制,成为内部材料,得不到充分共享利用。

本节选取其中一些授权宽松, 容易获得的语料库作为案例。

以下示例我们选取 PKU 标注的《人民日报》语料库的标注集。

7.3 基于隐马尔可夫模型的词性标注

之前我们就介绍过隐马尔可夫模型,详细见: 4.隐马尔可夫模型与序列标注

隐马尔可夫模型词性标注代码见(程序会自动下载 PKU 语料库): hmm_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/hmm_pos.py

运行代码后结果如下:

一阶隐马尔可夫模型:
r, u, n, v, v, v
他/r 的/u 希望/n 是/v 希望/v 上学/v
他/代词 的/助词 希望/名词 是/动词 希望/动词 上学/动词
李狗蛋/动词 的/动词 希望/动词 是/动词 希望/动词 上学/动词

二阶隐马尔可夫模型:
r, u, n, v, v, v
他/r 的/u 希望/n 是/v 希望/v 上学/v
他/代词 的/助词 希望/名词 是/动词 希望/动词 上学/动词
李狗蛋/动词 的/动词 希望/动词 是/动词 希望/动词 上学/动词

可见隐马尔可夫模型成功的辨别出“希望”的两种词性 n 和 v。但 OOV问题就出现了,无法把“李狗蛋”识别成人名,隐马尔可夫模型一步走错满盘皆输,其根本原因在于隐马尔可夫模型只能利用单词这一个状态特征,无法通过姓氏“李”来推测“李狗蛋”是人名。

7.4 基于感知机的词性标注

之前我们就介绍过感知机模型,详细见: 5.感知机分类与序列标注

按照中文分词时的经验,感知机能够利用丰富的上下文特征,是优于隐马尔可夫模型的选择,对于词性标注也是如此。

感知机模型词性标注代码见(程序会自动下载 PKU 语料库): perceptron_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/perceptron_pos.py

运行会有些慢,结果如下:

李狗蛋/nr 的/u 希望/n 是/v 希望/v 上学/v
李狗蛋/人名 的/助词 希望/名词 是/动词 希望/动词 上学/动词

这次的运行结果完全正确,感知机成功的识别出 OOV “李狗蛋”的词性。

7.5 基于条件随机场的词性标注

之前我们就介绍过条件随机场模型,详细见: 6.条件随机场与序列标注

条件随机场模型词性标注代码见(程序会自动下载 PKU 语料库): crf_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/crf_pos.py

运行时间会比较长,结果如下:

李狗蛋/nr 的/u 希望/n 是/v 希望/v 上学/v
李狗蛋/人名 的/助词 希望/名词 是/动词 希望/动词 上学/动词

依然可以成功识别 OOV “李狗蛋”的词性。

7.6 词性标注评测

将 PKU 语料库按 9:1 分隔为训练集和测试集,分别用以上三种模型来训练,准确率如下:

算法 准确率
一阶隐马尔可夫模型 44.99%
二阶隐马尔可夫模型 40.53%
结构化感知机 83.07%
条件随机场 82.12%

从上图可知,结构化感知机和条件随机场都要优于隐马尔可夫模型,判别式模型能够利用更多的特征来进行训练,从而提高更多的精度。

7.7 自定义词性

在工程上,许多用户希望将特定的一些词语打上自定义的标签,称为自定义词性。比如,电商领域的用户希望将一些手机品牌打上相应标签,以便后续分析。HanLP 提供了自定义词性功能。具体有两种实现。

  1. 朴素实现

    可以使用HanLP挂载的方式实现:

    from pyhanlp import *
    
    CustomDictionary.insert("苹果", "手机品牌 1")
    CustomDictionary.insert("iPhone X", "手机型号 1")
    analyzer = PerceptronLexicalAnalyzer()
    analyzer.enableCustomDictionaryForcing(True)
    print(analyzer.analyze("你们苹果iPhone X保修吗?"))
    print(analyzer.analyze("多吃苹果有益健康"))

    当然,此处以代码的方式插入自定义词语,在实际项目中也可以用词典文件的方式,运行效果如下:

    你们/r 苹果/手机品牌 iPhone X/手机型号 保修/v 吗/y ?/w
    多/ad 吃/v 苹果/手机品牌 有益健康/i

    从结果来看,词典只是机械的匹配,将“吃苹果”也当成了手机品牌,犯了所有规则系统的通病,看来词典同样解决不了词性标注,词性标注还是应当交给统计方法。

  2. 标注语料

    词性的确定需要根据上下文语境,这恰好是统计模型所擅长的。为了实现自定义词性,最佳实践是标注一份语料库,然后训练一个统计模型。

    至于语料库规模,与所有机器学习问题一样,数据越多,模型越准。

7.8 GitHub

HanLP何晗--《自然语言处理入门》笔记:

https://github.com/NLP-LOVE/Introduction-NLP

项目持续更新中......

目录


章节
第 1 章:新手上路
第 2 章:词典分词
第 3 章:二元语法与中文分词
第 4 章:隐马尔可夫模型与序列标注
第 5 章:感知机分类与序列标注
第 6 章:条件随机场与序列标注
第 7 章:词性标注
第 8 章:命名实体识别
第 9 章:信息抽取
第 10 章:文本聚类
第 11 章:文本分类
第 12 章:依存句法分析
第 13 章:深度学习与自然语言处理

原文地址:https://www.cnblogs.com/mantch/p/12294619.html

时间: 2024-08-29 22:16:34

隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注的相关文章

隐马尔可夫(HMM)、前/后向算法、Viterbi算法

HMM的模型  图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下图: 代表:c确定时a和b独立.(c为实心圆代表:c已经被确定) 这时,如果把z1看成a,x1看成b,z2看成c的话,则因为第一个图的z1是不可观测的(所以z1是空心圆),也就是没确定,则x1和z2就一定有联系. 进一步,如果把z2.x2合在一起看成c的话,则x1和z2.x2就一定有联系,则x1和x

隐马尔科夫模型 HMM(Hidden Markov Model)

本科阶段学了三四遍的HMM,机器学习课,自然语言处理课,中文信息处理课:如今学研究生的自然语言处理,又碰见了这个老熟人: 虽多次碰到,但总觉得一知半解,对其了解不够全面,借着这次的机会,我想要直接搞定这个大名鼎鼎的模型,也省着之后遇到再费心. Outline 模型引入与背景介绍 从概率图讲起 贝叶斯网络.马尔科夫模型.马尔科夫过程.马尔科夫网络.条件随机场 HMM的形式化表示 Markov Model的形式化表示 HMM的形式化表示 HMM的两个基本假设 HMM的三个基本问题 Evalution

Python实现HMM(隐马尔可夫模型)

1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别.文本翻译.序列预测.中文分词等多个领域.虽然近年来,由于RNN等深度学习方法的发展,HMM模型逐渐变得不怎么流行了,但并不意味着完全退出应用领域,甚至在一些轻量级的任务中仍有应用.本系列博客将详细剖析隐马尔科夫链HMM模型,同以往网络上绝大多数教程不同,本系列博客将更深入地分析HMM,不仅包括估计序列隐状态的维特比算法(HMM解码问题).前向后向算法等,而且还着重的分析HMM的EM训练过程,并

隐马尔可夫模型(HMM:Hidden Markov Models)

理论部分转载自:http://blog.csdn.net/likelet/article/details/7056068 手动计算例子转载自:http://blog.sina.com.cn/s/blog_953f8a550100zh35.html 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值.平时,经常能接触到涉及 HMM 的相关文章,一直

理论沉淀:隐马尔可夫模型(Hidden Markov Model, HMM)

理论沉淀:隐马尔可夫模型(Hidden Markov Model, HMM) 参考链接:http://www.zhihu.com/question/20962240 参考链接:http://blog.csdn.net/ppn029012/article/details/8923501 本博文链接:http://www.cnblogs.com/dzyBK/p/5011727.html 1 题设 假设有n个骰子(从1~n编号),每个骰子有m面,每面标有一个数字且不重复,数字取值限制在[1,m].(1

隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到.在李航的<统计学习方法>中,这个算法的讲解只考虑了单个观测

理解隐马尔科夫(HMM)模型

前言 在李航的<统计学方法>第十章有对隐马尔科夫模型(Hidden Markov Model,HMM)比较详细的介绍和推导公式,我参考公式结合中文分词应用实现了隐马模型观测序列的生成.前向算法.维特比算法. 本文在此针对HMM模型在中文分词中的应用,讲讲实现原理.我尽可能的撇开公式,撇开推导.结合实际开源代码作为例子,争取做到雅俗共赏,童叟无欺. 没有公式,就没有伤害. 理解一个算法,我认为需要做到:会其意,知其形.本文回答的,其实主要是第一点.但是这一点呢,恰恰是最重要,而且很多书上不会讲的

HMM隐马尔科夫模型

马尔科夫过程 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷·马尔可夫得名.马尔可夫过程是不具备记忆特质的(memorylessness).换言之,马尔可夫过程的条件概率仅仅与系统的当前状态相关,而与它的过去历史或未来状态,都是独立.不相关的. 一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程.这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态.最简单的马尔科夫过程是一阶模型,它的状态

隐马尔可夫模型(HMM)中文分词

1. 马尔可夫模型 如果一个系统有n个有限状态$S=\{s_{1} , s_{2} ,\dots s_{n}\}$,随着时间推移,该系统将从某一状态转移到另一状态,$Q=\{q_{1},q_{2},\dots q_{n}\}$位一个随机变量序列,该序列中的变量取值为状态集S中的某个状态,其中$q_{t}$表示系统在时间t的状态.那么:系统在时间t处于状态$s_{j}$的概率取决于其在时间1,2, $\dots$  t-1的状态,该概率为: $$P(q_{t} = s_{j} | q_{t-1}