您的位置:  首页 > 技术杂谈 > 正文

语言处理技术之中文分词在运维领域中的探索实践

2022-06-06 15:00 https://my.oschina.net/yunzhihui/blog/5534990 云智慧AIOps社区 次阅读 条评论

什么是中文分词,其原理与方法又是如何应用在智能运维中的?本篇文章将着重讲解云智慧对中文分词的理解。

一、中文分词面临的问题

在汉语中分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。为什么需要分词呢?一般认为在中文和英文中,词是表达完整含义的的最小单位,同时中文的字和英文中的字母,由于其粒度太小,无法表达完整的含义,而句子的粒度又太大,每句话承载的信息过多导致很难复用,因此在大量的中英文自然语言处理任务中,为了取得更好的效果,就采用分词的方式。

随着深度学习和自然语言处理技术的快速发展,中文分词的准确性也得到了很大的提升,但是该问题并未得到根本的解决,这是因为在中文分词中有一些基本的问题并未很好的定义与解决,研究者们将这些问题总结为以下三类。

  1. 分词规范

汉语的文章一般有如下层级组成:汉字-词语-句子-段落-篇章。在一句话中如何标记一个一个的词是非常重要的话题,并且不同的人会有不同的方案。有一个统一的、标准的规范就非常困难。例如:"自然语言处理被称为人工智能皇冠上的明珠"这句话存在如下不同的分词方式:

  1. 自然/语言处理/被/称为/人工智能/皇冠上的/明珠

  2. 自然语言处理/被/称为/人工智能/皇冠/上的/明珠

  3. 自然/语言/处理/被称为/人工/智能/皇冠/上/的/明珠

词语的界定方式不同,可能会组合出多种的分词结果。

  1. 歧义消解

歧义字段在汉语中是普遍存在的,而歧义字段是汉语切分的一个重要难点。歧义字段有以下两种基本的定义:

交集型切分歧义: 汉字串 AJB 称作交集型切分歧义,如果满足 AJ、JB 同时为词(A、J、B 分别为汉字串)。此时汉字串 J 称作交集串。如大学生(大学/学生)、研究生物(研究生/生物)、结合成(结合/合成)。

组合型切分歧义: 汉字串 AB 称作多义组合型切分歧义,如果满足 A、B、AB 同时为词。如未来(他还未来到)(他认为未来很美好)、学生会(他参与|学生会|组织的活动)(他觉得所有|学生|会来|参与活动)。

歧义字段对于分词来说是一个巨大的挑战,所以想要做出正确的切分判断,一定要结合上下文语境以及相应的先验知识,甚至还需要根据韵律、语气等细节去判断。

  1. 未登陆词识别

未登录词指的是没有收录在分词词表中,但需要在分词时将其切分出来的词。未登录词主要有普通词汇和专有名词,普通词汇主要为网络新词等,专有名词主要有人名、地名、机构名、电影、书籍、产品,领域(例如人工智能领域)等等。为了解决该类问题,对于普通词汇,一般采用新词发现的方式来识别,专有名词一般采用命名实体识别的方式。

在中文分词中,大部分的问题是由未登录词造成的,能有效解决未登录词对于分词系统至关重要。

二、常用中文分词方法简介

常用中文分词方法分类

  1. 基于词典的分词方法

基于词典的方法是经典的分词方法,原理是利用分词词库通过逆向最大匹配、N-最短路径以及 N-Gram 模型等分词方法对句子进行切分。基于词典的分词方法具有以下特点:

  • 可以很容易通过调整分词词典来调整最终的分词效果,比如当某个词无法被正确切分的时候,可以直接在词典当中进行添加,以达到正确切分的目的。

  • 过于依赖于词典导致这种方法对未登录词达不到良好的切分效果,并且手动维护词典耗费资源巨大。

  • 无法从根本上解决歧义切分的问题,例如当词典当中的词出现公共子串的时候,会出现歧义切分的问题,如果想要较好的解决部分歧义切分的问题,就需要合适的词频,但是得到合适的词频并不容易。

  1. 基于字的分词方法

基于字的分词方法将分词过程看作是字序列的标注问题(字分类),其认为每个字在构造词时有一个确定的状态。这种方法能够较好的解决未登录词的问题。

一般情况下,每个字有 4 种状态:B(Begin)、E(End)、M(Middle)、S(Single),对于一个句子的切分就可以转为对句子中每个字打标签的过程,如下例子:

自然语言处理/被/称为/人工智能/皇冠/上/的/明珠。

自 B 然 M 语 M 言 M 处 M 理 E 被 S 称 B 为 S 人 B 工 M 智 M 能 E 皇 B 冠 E 上 S 的 S 明 B 珠 E。

通过对句子中的每个字赋予转台,即 BEMS 中的一个标签,就完成了分词的目的。

基于字的方法将传统的分词问题,转换为一个更加容易建模的序列标注问题,这样就可以用最大熵模型为每个字进行标签分类;也可以利用 HMM 将其看作一个解码问题;或者考虑句子间的时序关系,利用判别模型 CRF 来建模;也可以用深度模型进行建模。

常用分词算法

  1. 正向最大匹配

正向即从左往右取词,取词的最大长度为词典中长词的长度,如果没有匹配到,则右边减一个字,直到词典中存在或者剩下一个单字。对于如下的例子:

待分词的句子为:为人民办公益

词典为:['为','为人','人民','民办',''办',办公','公益']

那么词的最大长度为 4

因此,第一次轮匹配为:

第一次:『为人民办』,扫描词典,无

第二次:『为人民』,扫描词典,无

第三次:『为人』,扫描词典,有

故输出的第一个词为『为人』

第二轮匹配为:

第一次:『民办公益』,扫描词典,无

第二次:『民办公』,扫描词典,无

第三次:『民办』,扫描词典,有

故输出的第二个为『民办』

按照如上的方式,则最后的分词结果为:

为人/民办/公益

  1. 逆向最大匹配

逆向最大匹配算法的即从右往左开始匹配,而其他的逻辑与正向最大匹配相同。即从右往左取词,取词的最大长度为词典中长词的长度,如果没有匹配到,则左边减一个字,直到词典中存在或者剩下一个单字。

有如下示例:

待分词的句子为:为人民办公益

词典为:['为','为人','人民','民办',''办',办公','公益']

那么词的最大长度为 4

因此,第一次轮匹配为:

第一次:『民办公益』,扫描词典,无

第二次:『办公益』,扫描词典,无

第三次:『公益』,扫描词典,有

故输出的第一个词为『公益』

第二轮匹配为:

第一次:『为人民办』,扫描词典,无

第二次:『人民办』,扫描词典,无

第三次:『民办』,扫描词典,有

故输出的第二个词为『民办』

按如上的方法,依次有结果为:

为人/民办/公益

  1. 双向最大匹配

用正向最大匹配和逆向最大匹配分词后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

例如可以用如下的规则:

  1. 如果分词数量结果不同:选择数量较少的那个

  2. 如果分词数量结果相同

  • 分词结果相同,返回任意一个

  • 分词结果不同,返回单字数较少的一个

  • 若单字数也相同,任意返回一个

  1. 最短路径分词算法

对于待分词的文本:『为人民办公益』

构建如下的图:其中边为字或词,权重均为 1

即目标为求 0 到 6 的最短路径。

在这种情况下,可以求出一条最短路径,也可以求出 N 条最短路径。一般采用狄克斯特拉(dijkstra)算法来求解最短路径。在该示例中,求得的最终结果为:为人/民办/公益。可见在部分的文本中其效果并不是很好。

  1. N-gram 分词

语言模型的目标为构建一句话出现的概率,即一句话的联合概率可以表示为:

其概率越大,越接近自然语言的正确表达方式。上述的概率并不好计算,因此有一些假设条件对该联合概率进行简化。

  • 1-gram(unigram),一元模型,即句子中的每个词都是相互独立的,那么上面的公式可以简化为:

  • 2-gram(bigram),二元模型,句子中的每个词仅仅依赖于前面的一个词:

  • 3-gram(trigram),三元模型,句子中的每个词依赖于前面两个词:

对于示例『为人民办公益』,二元模型为如下图:

计算上图的的最大概率路径,即得到的结果为最终的分词结果。

  1. 隐马尔可夫模型(HMM)

在此是将分词的问题转化为序列标注的问题。状态集合 Q 为{B,E,M,S},分别表示词的开始、结束、中间以及字符独立成词。例如,『为人民办公益』通过 HMM 求解的状态序列为「SBESBE」,则分词的结果为『为/人民/办/公益』。隐马尔可夫模型有三个基本的问题:概率计算问题,学习问题,解码问题。中文分词即对应解码问题。

  1. 条件随机场(CRF)

CRF 可以看作一个无向图模型,对于给定的标注序列 Y 和观测序列 X,对条件概率 P(Y|X)进行定义,而不是对联合概率建模。CRF 可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。

输入的句子 S 相当于序列 X,输出的标签序列 L 相当于序列 Y,我们要训练一个模型,使得在给定 S 的前提下,找到其最优对应的 L。

训练该模型的关键点就是特征函数 F 的选取以及每个特征函数权重 W 的确定,而对于每个特征函数而言,其输入有如下四个要素:

  • 句子 S,即待标注的句子

  • i 句子 S 中第 i 个单词

  • l(i )表示要评分的标注序列该第 i 个单词标注的词性

  • l(i-1 )表示要评分的标注序列该第 i-1 个单词标注的词性

三、运维领域日志中的分词

在运维领域处理文本相关的内容时,大部分情况下是需要分词的。以日志模式场景为例,该场景旨在识别出一条日志中的常量和变量。其中由常量和通配符组成的文本为日志的模式。例如对于原始日志消息:Received block blk_43348874343765408 of size 343290 from /10.1.91.84,需要识别出该条日志的模式为:Received block <> of size <> from / <*>。好的分词效果能够提高模式识别的准确性。

常见的日志为英文和中英混合,所以分词时不仅要考虑中文分词的效果,还要考虑英文分词的效果。普通的英文文本,用空格和常见的特殊字符就能很好的分词,但是在日志中,这种方式并不可行。日志中有一些 ip,url,email,path 等等实体,需要将字符分到一起组成完整的实体,这样才能准确的把握日志的含义,进而在日志模式解析中获取较好的结果。

相较中文分词而言,纯英文的日志分词主要面临的挑战为分词规范以及未登录词的识别。对于如下日志:

61.163.128.248 - https [30/Sep/2021:23:59:59 +0800] "POST /mp-service/login HTTP/1.1" 500 34 "``https://mp-service.iciba.com/``"

"Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0"

"-" "api-edu.wps.cn" "10.19.211.121:30423" "-" 0.003 0.003

其中的"Firefox/78.0",有时需要将其看做一个整体,有时需要将其分开,变为"Firefox"和"78.0"。对于"api-edu.wps.cn",可以分词为"api","edu","wps","cn",也可以直接看做一个整体。这种规范的难以统一对于日志分词而言是一个很大的挑战。在日志中会含有大量的计算机领域的专有名词,这种专有名词一般会随着技术的发展大量出现,例如上述日志中的"Windows NT 10.0" ,当需要将其作为一个整体时,会因为未登录词的缘故将其按空格拆分。

日志的书写是自由随意的,有些信息系统中会让日志记录大量的信息。为了能够将日志更好的分词可以借鉴中文分词的方式,将日志分词看作是一个序列标注和实体识别的问题。日志中有许多规则可以识别的实体,例如 ip、url、email,json 等等,在识别该类实体的过程中,即可将其分词为一个整体。对于如下的两个日志:

首先进行 json 的实体识别,将 json 作为一个整体识别出来。对于没有特定规则的,则采用 HMM 或 CRF 的方式进行序列标注,例如对与其中的[org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-8],它首先会拆分为一个序列['[', 'org', '.' ,'springframework', '.', 'amqp' ,'.', 'org', '.' ,'rabbit', '.', 'RabbitListenerEndpointContainer' ,'#', '0', '-' , '8', ']',],通过序列标注模型识别的结果为[BMMMMMMMMMMMMMMME],因此它们为一个整体。对于上述的日志,最终的分词结果如下:

以上的两条分词后的日志最终会形成一个模式为:

这样在不损失日志重要信息的同时,将其压缩合并成了一条,便可以让大量的日志合并为数量不多的日志模式,为后续的任务提供支持。

四、总结

日志分词在日志处理中是一个基础的步骤,对日志的信息提取与挖掘有着重要的意义。随着人工智能以及 AIOps 的发展,日志的信息越来越被人们重视,深度学习模型由于其突出的表现,在日志的语义提取任务上被越来越多的使用与研究。虽然分词在中文和日志上都取得了很好的效果,但是仍然存在诸多的挑战。因此在日志分词中,以下的问题值得继续探索:

构建日志的预训练模型,并在不同的数据源上进行微调;由于日志的复杂性和多变性,其分词标准并不能统一。多准则,多粒度的分词能够使用不同的数据源来提升分词的准确性;分词任务和下游任务紧密的结合,分词任务一般都是为了提高下游任务的准确性的,但由于分词的效果评价并不与下游任务直接相关,因此存在错误传播的先天缺陷,将与下游任务紧密结合后可一定程度避免该缺陷。

参考文献

[1]黄昌宁、赵海:中文分词十年回顾.中文信息学报, 21(3), 2007, pp. 8–20.

[2]中文分词十年又回顾 : 2007-2017. / 赵海; 蔡登; 黄昌宁; 揭春雨.

[3]孙茂松, 邹嘉彦. 汉语自动分词研究评述[J]. 当代语言学, 2001, 3(1): 22-32.

开源福利

云智慧已开源数据可视化编排平台 FlyFish 。通过配置数据模型为用户提供上百种可视化图形组件,零编码即可实现符合自己业务需求的炫酷可视化大屏。 同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置, 面向复杂需求场景能够保证高效开发与交付。

点击下方地址链接,欢迎大家给 FlyFish 点赞送 Star。参与组件开发,更有万元现金等你来拿。

GitHub 地址: https://github.com/CloudWise-OpenSource/FlyFish

Gitee 地址:https://gitee.com/CloudWise/fly-fish

万元现金活动: http://bbs.aiops.cloudwise.com/t/Activity

微信扫描识别下方二维码,备注【飞鱼】加入AIOps社区飞鱼开发者交流群,与 FlyFish 项目 PMC 面对面交流~

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接