结巴分词4 您所在的位置:网站首页 提供的英文的词性 结巴分词4

结巴分词4

2024-04-18 18:31| 来源: 网络整理| 查看: 265

1 简介

词性(part-of-speech)是词汇基本的语法范畴,通常也称为词类,主要用来描述一个词在上下文的作用。例如,描述一个概念的词就是名词,在下文引用这个名词的词就是代词。有的词性经常会出现一些新的词,例如名词,这样的词性叫做开放式词性。另外一些词性中的词比较固定,例如代词,这样的词性叫做封闭式词性。因为存在一个词对应多个词性的现象,所以给词准确地标注词性并不是很容易。例如,“改革”在“中国开始对计划经济体制进行改革”这句话中是一个动词,但是在“医药卫生改革中的经济问题”这个句子中是一个名词。把这个问题抽象出来,就是已知单词序列,给每个单词标注词性。词性标注是自然语言处理中一项非常重要的基础性工作。

汉语词性标注同样面临许多棘手的问题,其主要的难点可以归纳为以下三个方面:

- (1) 汉语是一种缺乏词形态变化的语言,词的类别不能像印欧语言那样,直接从词的形态变化来判别;

- (2) 常用词兼类现象严重,越是常用的词,不同的用法越多,尽管兼类现象仅仅占汉语词汇很小的一部分,但是由于兼类使用的程度高,兼类现象纷繁,覆盖面广,涉及汉语中大部分词类,因而造成汉语文本中词类歧义排除的任务量大,而且面广,复杂多样;

- (3) 研究者主观原因造成的困难。语言学界在词性划分的目的、标准等问题还存在分歧;

不同的语言有不同的词性标注集。为了方便指明词的词性,可以给每个词性编码,可以具体参考 ICTCLAS 汉语词性标注集 ,其中,常见的有a表示形容词,d表示副词,n表示名词,p表示介词,v表示动词。

目前采用的词性标注方法主要有基于统计模型的标注方法、基于规则的标注方法、统计方法与规则方法相结合的方法、基于有限状态转换机的标注方法和基于神经网络的词性标注方法。

jieba分词中提供了词性标注功能,可以标注标注句子分词后每个词的词性,词性标注集采用北大计算所词性标注集,属于采用基于统计模型的标注方法,下面将通过实例讲解介绍如何使用jieba分词的词性标注接口、以及通过源码讲解其实现的原理。

PS:

jieba是采用和ICTCLAS兼容的标记法,参考链接:ictclas 词性标注在哪里可以看到? · Issue #47 ,词性 eng 是啥? 为什么官方没有词性对照表? #411;计算所词性标注集的作者是张华平老师,张华平老师也是ICTCLAS的作者,因此ICTCLAS词性标注集就是北大计算所的词性标注集,参考 NLPIR Natural Language Processing & Information Retrieval Sharing Platform 自然语言处理、大数据实验室、智能语义平台 汉语分词、中文语义分析、中文信息处理、语义分析系统、中文知识图谱、大数据分析工具 。ICTCLAS现在已经更新为NLPIR,github地址为 NLPIR-team/NLPIR 。

2 实例讲解

示例代码如下所示,

# 引入词性标注接口 import jieba.posseg as psg text = "去北京大学玩" #词性标注 seg = psg.cut(text) #将词性标注结果打印出来 for ele in seg: print ele

控制台输出,

去/v 北京大学/nt 玩/v

可以观察到“去”是动词,“北京大学”是机构名称,“玩”也是动词。

3 jieba分词系统的词性标注流程

jieba分词的词性标注过程非常类似于jieba分词的分词流程,同时进行分词和词性标注。在词性标注的时候,首先基于正则表达式(汉字)进行判断,1)如果是汉字,则会基于前缀词典构建有向无环图,然后基于有向图计算最大概率路径,同时在前缀词典中查找所分出的词的词性,如果没有找到,则将其词性标注为“x”(非语素字 非语素字只是一个符号,字母x通常用于代表未知数、符号);如果HMM标志位置位,并且该词为未登录词,则通过隐马尔科夫模型对其进行词性标注;2)如果是其它,则根据正则表达式判断其类型,分别赋予“x”,“m”(数词 取英语numeral的第3个字母,n,u已有他用),“eng”(英文)。流程图如下所示,

其中,基于前缀词典构造有向无环图,然后基于有向无环图计算最大概率路径,原理及源码剖析,具体可参考 结巴分词2--基于前缀词典及动态规划实现分词 这篇blog。

其中,基于隐马尔科夫模型进行词性标注,就是将词性标注视为序列标注问题,利用Viterbi算法进行求解,原理及源码剖析,具体可参考 结巴分词3--基于汉字成词能力的HMM模型识别未登录词 这篇blog。

4 源码分析

jieba分词的词性标注功能,是在jieba/posseg目录下实现的。

其中,\_\_init\_\_.py实现了词性标注的大部分函数;

char\_state\_tab.py存储了离线统计的字及其对应的状态;

prob\_emit.py存储了状态到字的发射概率的对数值;

prob\_start.py存储了初始状态的概率的对数值;

prob\_trans.py存储了前一时刻的状态到当前时刻的状态的转移概率的对数值;

viterbi.py实现了Viterbi算法;

4.1 主调函数

jieba分词的词性标注接口的主调函数是cut函数,位于jieba/posseg/\_\_init\_\_.py文件中。

默认条件下,jieba.pool是None,jieba.pool is None这个条件为True,会执行下面的for循环。

def cut(sentence, HMM=True): """ Global `cut` function that supports parallel processing. Note that this only works using dt, custom POSTokenizer instances are not supported. """ global dt # 默认条件下,此条件为True if jieba.pool is None: # 执行for循环 for w in dt.cut(sentence, HMM=HMM): yield w else: parts = strdecode(sentence).splitlines(True) if HMM: result = jieba.pool.map(_lcut_internal, parts) else: result = jieba.pool.map(_lcut_internal_no_hmm, parts) for r in result: for w in r: yield w

for循环中的dt = POSTokenizer(jieba.dt),POSTokenizer就是jieba分词中的词性标注定义的类,其中jieba.dt是jieba自己实现的分词接口。POSTokenizer类在初始化的时候,会读取离线统计的词典(每行分别为字、频率、词性),加载为词--词性词典。

最终,程序会执行dt.cut函数。

cut函数是默认条件下jieba分词的词性标注过程的执行函数,位于jieba/posseg/\_\_init\_\_.py文件定义的POSTokenizer中。cut函数会执行\_\_cut\_internal这个函数。

\_\_cut\_internal函数会首先根据标志位,选择不同的分割函数,然后会首先基于正则表达式对输入句子进行分割,如果是汉字,则根据分割函数进行分割;否则,进一步根据正则表达式判断其类型。

默认情况下,HMM标志位为True,因此cut\_blk = self.\_\_cut\_DAG,也就会使用HMM模型来对未登录词进行词性标注。

def __cut_internal(self, sentence, HMM=True): self.makesure_userdict_loaded() sentence = strdecode(sentence) blocks = re_han_internal.split(sentence) # 根据标志位判断,选择不同的分割函数 if HMM: # 使用HMM模型 cut_blk = self.__cut_DAG else: # 不使用HMM模型 cut_blk = self.__cut_DAG_NO_HMM for blk in blocks: # 匹配汉字的正则表达式,进一步根据分割函数进行切割 if re_han_internal.match(blk): for word in cut_blk(blk): yield word # 没有匹配上汉字的正则表达式 else: tmp = re_skip_internal.split(blk) for x in tmp: if re_skip_internal.match(x): yield pair(x, 'x') else: for xx in x: # 匹配为数字 if re_num.match(xx): yield pair(xx, 'm') # 匹配为英文 elif re_eng.match(x): yield pair(xx, 'eng') # 未知类型 else: yield pair(xx, 'x')4.2 基于有向无环图计算最大概率路径

\_\_cut\_DAG函数会首先根据离线统计的词典(每行分别为字、频率、词性)构建前缀词典这个词典。然后基于前缀词典构建有向无环图,然后基于有向无环图计算最大概率路径,对句子进行分割。基于分割结果,如果该词在词--词性词典中,则将词典中该词的词性赋予给这个词,否则赋予“x”;如果前缀词典中不存在该词,则这个词是未登录词,则利用隐马尔科夫模型对其进行词性标注;如果上述两个条件都没有满足,则将词性标注为“x”。

def __cut_DAG(self, sentence): # 构建有向无环图 DAG = self.tokenizer.get_DAG(sentence) route = {} # 计算最大概率路径 self.tokenizer.calc(sentence, DAG, route) x = 0 buf = '' N = len(sentence) while x = 0: route[i] = state state = mem_path[i][state] i -= 1 # 返回最大概率及各个时刻的状态 return (prob, route)

相关优化:

- 1 根据前一时刻的状态和状态转移矩阵,提前计算当前时刻的状态集合,再根据当前的观察值获得当前时刻的可能状态集合,再与上一步骤计算的状态集合取交集,可以减少当前时刻的所处的状态数目;

5 Reference



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有