自然语言处理之词性标注
词性标注作为NLP领域的一项基本任务,其与分词任务同等重要,是很多任务的基础,比如句法分析,命名实体识别等。命名实体识别在一定程度上也属于标注任务,不过,难度相比一般的词性标注而言,上升了不少。对于词性标注而言,不论是中文还是英文,其难点在于对于不同的语境,词性的多变化;另一方面,随着社会的发展,很多词都会潜移默化的产生额外的词性。相信这些现象,大家都有所感触,也经常遇到这些情况,就不再举例了。从技术来说,词性标注也依赖于分词,不同的分词,对于结果的标注也会不同,比如“读书”,如果分词结果为“/读/书/”,那显然是“动词+名词”的序列结构;如果是“/读书/”,则是“名词”的单个词性。因此在进行词性标注任务时,一般都需要先将句子进行分词,然后基于分词的结果再进行词性标注。
目前,词性标注的方法也比较多,在AI领域,有很多词性标注器,这些方法都已经嵌入到成型的自然语言处理工具包中,比如jieba软件,HanLP,NLTK等。然而,从自然语言的层面上来看待词性标注问题,不同的语言,词性标注的难度截然不同,比如英文和中文。对于英文而言,分词不仅相比中文要简单,而且词性标注也相比中文要简单,即使单独通过词的形态学来处理也可以获得很高的标注准确率,这里的词的形态学指的是词的结构,包括前缀,后缀,时态等等,英文的时态丰富,前缀、后缀具有明显的区分标志,甚至不用考虑上下文,就可以获得很好的标注效果。而中文缺少形态变化,不能从词的形态来识别词性;另外一个难点在于,对于不同的词性标注器,其拥有属于自己的一套标注符号集,也就是说,使用不同的标注器,标注的词性可能相同,但是,符号不同,不统一,因为,词类的划分粒度和标记符号不同,目前还没有一个统一的标准,比如LDC标注语料中,将中文词性划分为33类,而北大语料库则分为26类。词类划分标准和标记符号的不统一,以及分词规范的含糊,都给词性标注带来了很大的困难。还有很多问题还未解决,因此,看似这些已经基本解决的NLP基础问题,其实还需要投入很大的研究精力来挖掘潜在的价值。
词性标注算法从目前的使用情况来看,主要分为两类,一种是基于规则的方法,主要指的是基于字符串匹配的词典查找算法;另外一种是基于数据驱动的方法,比如机器学习方法。首先,基于字符串匹配的词典查找算法,主要过程为:先对句子进行分词,然后从词典中查找每个词语的词性,对其进行标注即可。这种方法非常简单,但是无法解决一词多词性问题。而采用机器学习方法的词性标注算法,比如HMM,CRF等方法具有非常好的效果。对于HMM,其包括3个量,初始状态概率向量、状态转移概率矩阵、观测概率矩阵。在具体的词性标注问题上,观测序列为分词后的句子,状态序列(或者标记序列、隐状态序列都一个意思)为经过标注后的词性标注序列。而模型的3个量可以通过大量的语料计算得到。这样,对于标注问题,很容易计算得到HMM模型参数,再结合分词后的原句子序列,便将问题转换为模型的预测问题,即已知模型和观测序列,来预测标记序列(或者说状态序列)。这是HMM的经典应用场景。
在工业界,比较常用的中文处理软件包括jieba,hanLP等,在这里,以jieba软件为例,并对其原理进行剖析。jieba的词性标注的结果,对于每个词的词性,采用和ICTCLAS兼容的标记法。使用方法如下:
# -*- coding:utf-8 -*-
import jieba.posseg as pseg
words = pseg.cut("我喜欢研究算法")
for word, flag in words:print("%s %s" % (word, flag))
运行后,结果如下:
下面对pseg.cut()的原理进行一波分析:
1.准备工作:首先检查词典是否初始化好,如果没有则先初始化词典,比如上面的“红色字体”显示。将句子的编码解码为unicode编码格式。根据正则表达式进行匹配,将输入文本切分成一个个的句子。
2.遍历句子组成的列表,对每一个句子进行单独分词和词性标注。
3.如果句子中含有未登录词,使用HMM进行处理。
jieba分词的主程序源码如下:
def cut(self, sentence, cut_all=False, HMM=True):'''本函数的主要作用是将句子切分成词参数:- sentence: 要被切分的句子,必须是unicode编码,如果是其他编码,必须要解码为unicode- cut_all: 选择的切分方法,是采用全模式还是精确模式。对于全模式,是为了把句子中所有的可能成词的词语都切分出来,速度快,但是不能解决歧义。而精确模式,试图将句子进行最精确的切分,一般是我们最想要的结果,适合文本分析。- HMM: 是否使用HMM,一般对于含有未登录词的句子的分词,采用HMM会获得更好的分词效果'''sentence = strdecode(sentence) # 将句子解码为unicode编码# 模式选择,对于不同的模式,选择不同的正则表达式对象if cut_all:re_han = re_han_cut_allre_skip = re_skip_cut_allelse:re_han = re_han_defaultre_skip = re_skip_default# 设置不同模式下的cut_block的分词方法if cut_all:cut_block = self.__cut_allelif HMM:cut_block = self.__cut_DAGelse:cut_block = self.__cut_DAG_NO_HMMblocks = re_han.split(sentence)# 先采用正则表达式进行粗切分,通过yield返回词语生成器,生成器的好处是可以节约内存for blk in blocks:if not blk:continueif re_han.match(blk):for word in cut_block(blk):yield wordelse:tmp = re_skip.split(blk)for x in tmp:if re_skip.match(x):yield xelif not cut_all:for xx in x:yield xxelse:yield x
分词之后,便可以进行词性标注了,这里主要介绍如何使用HMM来对未登录词进行处理。通过大规模的语料计算,可以计算得到HMM的参数,然后结合模型的预测算法,将观测序列(分词之后的句子)转换为标注序列(状态序列)。这样便完成了未登录词的词性标注。
最后,做个总结。jieba作为一个高效的NLP软件包,它可以在分词的同时完成词性标注,因此标注的速度是非常快的。而且,在整个过程中,通过字典查询的方法识别词的词性,通过HMM模型来完成对未登录词的词性标注,从而达到对整个句子的分词和词性标注。但是,字典查询的方式无法解决一词多词性的问题,因此,在精度上还是有所欠缺的。关于jieba软件的更多细节,请参见官方源码https://github.com/fxsjy/jieba。
自然语言处理之词性标注相关推荐
- 【自然语言处理】词性标注(北大,宾州)
文章目录 词性标注规范 前言 北大词性标注集 宾州词性标注集 词性标注规范 前言 词性标注在中文领域暂无统一的标注标准,最常见较为主流的是北大和宾州词性标注集. 北大词性标注集 词性编码 词性名称 注 ...
- 自然语言处理之——词性标注和命名实体识别
1. 摘要 基于上次分享的分词技术介绍,本次继续分享在分词后与词相关联的两个技术:词性标注和命名实体识别.词性是词汇基本的语法属性,也可以称为词类.词性标注的行为就是在给定的中文句子中判定每个词的语法 ...
- 自然语言处理:词性标注
步骤一:导入 jieba 库,对文本内容进行分词处理. 导入 jieba 库的 posseg 模块,对文本进行分词标注. 步骤二: 词性统计: 导入 pandas 库,提取出标注返回结果的每项元素的 ...
- 自然语言处理基础技术之词性标注
声明:转载请注明出处,谢谢:https://blog.csdn.net/m0_37306360/article/details/84502176 另外,更多实时更新的个人学习笔记分享,请关注: 知乎: ...
- 自然语言处理6 -- 情感分析
系列文章,欢迎阅读 NLP预训练模型1 – 综述 NLP预训练模型2 – BERT详解和源码分析 Transformer家族1 – Transformer详解和源码分析 自然语言处理1 – 分词 自然 ...
- 分词与词性标注--第一周学习总结07-28
分词与词性标注--第一周学习总结07-28 词性标注与自然语言处理 相关概念 理论基础 算法依赖 应用领域 个人学习笔记 HMM(隐含马尔可夫模型) 分词与词性标注 自然语言处理 相关学习链接推荐 词 ...
- Machine Learning | (2) sklearn数据集与机器学习组成
Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...
- 资源 | 机器学习必知的15大框架,欢迎补充!
来源:机器学习算法与Python学习 本文约4000字,建议阅读8分钟. 本文向我们介绍了机器学习中必须掌握的15个大框架. 机器学习工程师是开发产品和构建算法团队中的一部分,并确保其可靠.快速和成规 ...
- 干货丨机器学习必知的15大框架
文章来源:云栖社区 不管你是一个研究人员,还是开发者,亦或是管理者,想要使用机器学习,需要使用正确的工具来实现.本文介绍了当前最流行15个机器学习框架. 机器学习工程师是开发产品和构建算法团队中的一部 ...
最新文章
- opencvsharp 如何提取十字交叉点坐标_如何提取OpenFOAM计算结果的体心坐标
- TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
- 当我们在谈深度学习时,到底在谈论什么(二)--转
- oracle数据库用户密码将要过期处理办法(ORA-28002)
- 牛客 - Across the Firewall(最大流)
- 面试中说这些话,到手的offer很容易飞
- 如何看计算机几核,windows7系统怎么看CPU是几核的?win7查看CPU是几核的方法
- Nuget 管理报repositories.config 访问路径被拒绝 解决办法
- tensorflow之variables_to_restore
- matlab的基本使用
- 基于开源SDN控制器的下一代金融云网络的研究与实践
- 计算机术语中bug指的是,你知道电脑漏洞为什么叫bug吗?
- 3DES解密之网页解密(xhr断点及追栈)
- Kubernetes 核心概念介绍
- 怎样恢复win10分区误删的数据
- 阿里YunOS推开放平台 提高开发者体验
- the installation cannot continue as the installer file may be damaged. Download the installer file
- 差分隐私理论入门科普
- react 前端 实现打印机打印功能
- 2021陇剑杯线上——机密内存取证