NLP从零开始------4基础文本处理之分词(1)

1.正则表达式

        在讨论分词之前我们先讨论以下正则表达式。

1.1 概述

        正则表达式是一种用于模式匹配和搜索文本的工具,可以应用于各种编程语言和文本处理工具中,如 JavaScript、Python、Java、Perl 等,通过正则表达式可以对指定的文本实现匹配测试、内容查找、内容替换、字符串分割等功能。

       正则表达式在python中有如下函数中经常使用。

match函数:用于检测字符串开头位置是否匹配。
search函数:用于在整个字符串内查找对应的模式进行匹配。
findall函数:返回的是正则表达式在字符串中所有匹配结果的列表。
sub函数:能够找到所有模式匹配的字符串并用指定的字符串替换。

1.2 元字符

        元字符由特殊符号组成,元字符的应用是正则表达式强大的原因,元字符定义了字符集合、子组匹配、模式重复次数。元字符使得正则表达式不只是可以匹配一个字符串,还可以匹配字符串集合。

1.2.1 字符匹配

        英文句号“.”:匹配任意一个字符,表示匹配除去换行符“\n”之外的任意一个字符。

        中括号“[ ]”:匹配多个字符,表示包含在中括号内部的字符都会被匹配。

        管道符“|”:用于对两个正则表达式进行或操作。

         乘方符号“^”:匹配字符串起始位置的内容。

         货币符号“$”:匹配字符串的结束位置的内容。

        量化符号“?”“*”“+”“{n}”“{n,}”“{m,n}”:匹配需要的字符数。

                                            量化符号的解释说明如表所示

1.2.2 转义字符“\”

        字符串中可以包含任何字符,如果待匹配的字符串中出现“$”“.”“[ ]”等特殊字符,那么这将会与正则表达式的特殊字符发生冲突。 遇到这种情况,Python使用“\”将字符串内的特殊符号进行转义,即表示告诉Python,这个字符当作普通字符处理。 “\”是用于进行转义的,如果字符串包含“\”,那么需要使用“\”将“\”进行转义。 在正则表达式中,通常解释一个反斜杠“\”需要用两个反斜杠“\\”表示。而python中自带的原生字符“r”很好的解决了这个问题。对于文本中的“\”,只需要“r'\'”表示即可。对于需要转义的字符如“\\d”,可以从写成“r'\d'”。

        例如,输入一个字符串 “C:\Users\Administrate\Desktop”,假设直接书写会直接报错。 报错原因是该字符串中带有转义符“\”,第一个转义符后面带有U,则在读取过程中会被人为是“\U”。 特殊字符中不带有这种字符,故而报错,后两个转义符亦是如此。 字符串应改为“C:\\Users\\Administrate\\Desktop”。

                                Python预定义字符的解释说明如下表所示。

        对于专门学习正则表达来说这些肯定是不够的,但是对于nlp操作来说基本够用了。但如若有读者想要深入学习,下面是推荐网址:

        正则表达式 – 教程 | 菜鸟教程 (runoob.com)

1.2.3正则表达式实战练习

思考一:《西游记》字符过滤

        在进行中文分词前,数据格式要求全部是中文,此时需要对文本的以下内容进行过滤处理。 特殊符号 标点 英文 数字 读者也可以根据自己的要求过滤自定义字符。

思考二:自动提取人名与电话号码

        文本人名正则表达式匹配方法如下。 名字首先匹配第一个大写字母采用[A-Z]表示。 名字第二个字符只包含英文句号、空格或字母,统一采用[\.a-zA-Z]表示。 最后用+表示允许匹配多个。 电话号码正则表达式匹配方法如下。 以“(”或数字开头,采用[0-9(]表示。 第二个字符接数字或“)”或英文句号,采用[0-9- ).]表示。 最后用+表示允许匹配多个。

思考三:提取网页标签信息

        例如,一个网页标签内容为“<a href=”http://www.baidu.com“>百度</a> <a href=”http://www.google.com“>谷歌</a>”。 需要提取网页标签中的网址和文本。 通过观察,网址信息保存在href属性中,文本内容则是在特殊字符中间。

        示例代码在下方连接:

NLP从零开始------4基础文本处理之分词(2)-CSDN博客

2.中文分词概述

        中文分词是指将汉字序列按照一定规范逐个切分为词序列的过程。例如 :北京市民办高中,分词结果:北京市/民办高中。

        在英文中,单词之间以空格为自然分隔符,分词自然地以空格为单位切分,而中文分词则需要依靠一定技术和方法寻找类似英文中空格作用的分隔符。

        分词的单元有如下:

        单词分词:将文本分割成单词,这是最常见的分词方式,适合语句结构较为清晰的语言,如英语。通过空格和标点符号进行分割。适用于大多数基础NLP任务,如文本分类、情感分析等。

        子词分词:将单词进一步分割成更小的单元,如前缀、后缀或词根。能够处理未登录词(OOV),如使用Byte Pair Encoding (BPE)或WordPiece方法。子词分词不会将单词完全拆分,有助于保持一定的语义。广泛用于机器翻译和大型语言模型如BERT、GPT中的输入预处理。

        字符分词:将文本分割成单个字符,适用于形态丰富的语言或深度学习模型。适用于形态复杂或拼写不规则的语言,如汉语、阿拉伯语等。通过这种方式可以细致捕捉词语的构成。适用于对形态变化敏感的任务,如语音识别、字符级语言模型等。

        基于规则的分词是中文分词最先使用的方法,随着统计方法的发展,又提出了一些基于统计的分词模型。

        基于规则的分词:正向最大匹配发、逆向最大匹配法。

        基于统计的分词:隐马尔可夫模型、条件随机场模型。

3.基于规则的分词

        基于规则的分词(又称为基于词典的分词)方法是一种较为机械的分词方法,其基本思想是将待分词语句中的字符串和词典逐个匹配,找到匹配的字符串则切分,不匹配则减去边缘的某些字符,从头再次匹配,直到匹配完毕或者没有找到词典的字符串而结束。

        基于规则分词主要方法如下: 正向最大匹配法(Maximum Match Method,MM法)、 逆向最大匹配法(Reverse Maximum Match Method,RMM法)、 双向最大匹配法(Bi-direction Matching Method,BMM法)。

3.1 正向最大匹配法

        正向最大匹配法(Maximum Match Method,MM法)基本思想如下:

        假设有一个待分词中文文本和一个分词词典,词典中最长的字符串长度为l。 从左至右切分待分词文本的前l个字符,然后查找是否有和词典一致的字符串。 若匹配失败,则删去该字符串的最后一个字符,仅留下前 l-1个字符,继续匹配这个字符串,以此类推。 如果匹配成功,那么被切分下来的第二个文本成为新的待分词文本,重复以上操作直至匹配完毕。如果一个字符串全部匹配失败,那么逐次删去第一个字符,重复上述操作。

        假设待分词文本为“北京市民办高中”,词典为“{"北京市", "北京市民", "民办高中", "天安门广场", "高中"}”。由词典得到最长字符串的长度为5,具体分词步骤如下:

1. 切分待分词文本“北京市民办高中”前5个字符,得到“北京市民办”,在词典中找不到与之匹配的字符串,匹配不成功。

2.删去“北京市民办”的最后一个字符得到“北京市民”,再与词典进行匹配。在词典中找到与之匹配的字符串,匹配成功。此时,将文本划分为“北京市民”“办高中”。

3.将分词后的第二个文本“办高中”作为待分词文本。此时词典中找不到与之匹配的字符串,匹配不成功。

4.删去“办高中”的最后一个字符,匹配失败,直至删去所有字符都没有匹配成功,因此删去“办高中”的第一个字符,匹配“高中”一词成功,将第二个文本划分为“办”、“高中”。

5.正向最大匹配法分词结果:“北京市民”、“办”、“高中”。

          MM法的优点是简单直观,分词速度快,适合处理那些词库中词元较多的语言或文本。但它也有缺点,比如可能会因为过分追求最长匹配而导致错误的分词结果,即所谓的"分词漂移"现象。例如,对于句子"他住在美丽的上海",如果词库中有"美丽的"和"上海"两个词,MM法可能会错误地将其分割为"他住"和"美丽的上海",而不是"他"和"住在美丽的上海"。

3.2 逆向最大匹配法

        逆向最大匹配法(Reverse Maximum Match Method,RMM法)基本思想如下:

         RMM与MM法原理相反,从右至左匹配待分词文本的后l个字符串,查找是否有和词典一致的字符串。 若匹配失败,仅留下待分词文本的后l-1个词,继续匹配这个字符串,以此类推。 如果匹配成功,则被切分下来的第一个文本序列成为新的待分词文本,重复以上操作直至匹配完毕。 如果一个词序列全部匹配失败,则逐次删去最后一个字符,重复上述操作。

        同样以待分词文本“北京市民办高中”为例说明逆向最大匹配法,具体分词步骤如下:

1. 切分待分词文本“北京市民办高中”后5个字符,得到“市民办高中”,在词典中找不到与之匹配的字符串,匹配不成功。

2.删去“市民办高中”的第一个字符得到“民办高中”,再与词典进行匹配,匹配成功,将文本划分为“北京市”、“民办高中”。

3将分词后的第一个文本“北京市”作为待分词文本,与词典匹配成功。

4.逆向最大匹配法分词结果: “北京市”“民办高中”。

        RMM法的优点是能够有效避免MM法中出现的"分词漂移"现象,因为它从文本的末尾开始,更容易识别出整个词的边界。但是,RMM法也有其局限性,例如在某些情况下可能会将词库中不存在的词错误地分割开。

        因此为了提高分词的准确性,实际应用中通常会结合使用RMM法和MM法,或者使用双向最大匹配法(Bi-directional Maximum Matching,BMM法),即先使用RMM法进行逆向分词,再使用MM法进行正向分词,最后根据上下文信息决定最终的分词结果。这种方法可以综合两种方法的优点,减少分词错误。

3.3双向最大匹配法

         双向最大匹配法(Bi-direction Matching Method,BMM法)基本思想如下:

         双向最大匹配法基本思想是将MM法和RMM法的结果进行对比,选取两种方法中切分次数较少的作为切分结果。 用正向最大匹配法和逆向最大匹配法对“北京市民办高中”进行分词,结果分别为“北京市民”、“办”、“高中”和“北京市”、“民办”、“高中”。 选取切分次数最少的结果为“北京市”、“民办高中”。 研究表明,利用正向最大匹配法和逆向最大匹配法匹配,中文分词大约90%的词句完全重合且正确,有9%左右的句子得到的结果不一样,但其中有一个是正确的。剩下不到1%的句子使用两种方法进行切分都是错误的。 因而,双向最大匹配法在中文分词领域中得以广泛运用。

        BMM法的优点在于它结合了MM法和RMM法的优点,能够在一定程度上减少分词错误,提高分词的准确性。然而,这种方法也可能会增加计算的复杂度,因为需要同时进行正向和逆向的匹配,并且在处理冲突时可能需要更多的规则和上下文信息。

        在实际应用中,BMM法通常与其他分词技术(如基于统计的分词、基于机器学习的分词等)结合使用,以进一步提高分词的准确性和效率。

4.基于统计的分词

        基于规则的中文分词常常会遇到歧义问题和未登录词问题。

        中文歧义问题主要包括交集型切分歧义和组合型切分歧义两大类。交集型切分歧义:指一个字串中间的某个字或词,不管切分到哪一边都能独立成词,如“打折扣”一词,“打折”和“折扣”可以是两个独立的词语。 组合型切分歧义:指一个字串中每个字单独切开或者不切开都能成词,如“将来”一词,可以单独成词,也可以切分为单个字。

        未登录词也称为生词,即词典中没有出现的词,未登录词可以分为四大类。 第一类是日常生活出现的普通新词汇,尤其是网络热门词语,这类词语更新换代快,且不一定符合现代汉语的语法规定; 第二类是专有名词,主要指人名、地名和组织机构名,它还包括时间和数字表达等; 第三类是研究领域的专业名词,如化学试剂的名称等; 第四类是其他专用名词,如近期新上映的电影、新出版的文学作品等。遇到未登录词时,分词技术往往束手无策。

        基于统计分词能够有效的解决中文分词遇到歧义问题和未登录词问题。基于拥挤分词的基本思想是中文语句中相连的字出现的次数越多,作为词单独使用的次数也越多,语句拆分的可靠性越高,分词的准确率越高。实现基于统计分词的一般需要两个步骤:建立统计语言模型;运用模型划分语句,计算被划分语句的概率,选取最大概率的划分方式进行分词。 常见的基于统计的分词方法有n元语法模型和隐马尔可夫模型。

        基于统计分词说的最简单就是一句话:统计词出现的次数,次数足够高的词作为单独的词语被保留。他有自己的优势能够较好地处理未登录词和歧义词,不需要人为的搭建和维护词典,但是需要依靠语料库进行分词,语料库的准确度不一定高,计算量较大,分词速度一般。

4.1n元语法模型

        n元语法模型(n-gram)是一种在自然语言处理中广泛使用的统计语言模型。它通过分析一个给定文本中单词的相邻关系,来预测下一个单词。这种模型的基本思想是,考虑一个单词的出现概率依赖于它前面n-1个单词。

        N-gram类型

        一元语法(Uni-gram):只考虑单个项目的概率,不考虑其他上下文。

        二元语法(Bi-gram):考虑两个连续项目的概率,即一个词的出现依赖于它前面的一个词。

        三元语法(Tri-gram):考虑三个连续项目的概率,即一个词的出现依赖于它前面的两个词。

        更高阶N-gram:以此类推,可以构建更高阶的N-gram模型,但会面临数据稀疏性问题。

       

        其数学原理内容过于多,我会后续整理,如果大家急看,可以先参考大佬的详解:

NLP:n-gram模型-CSDN博客

        中文分词与n元语法模型:

        假设语句序列为s={小孩,喜欢,在家,观看,动画片},估计这一语句的概率。以二元语法模型为例,需要检索语料库中每一个词以及和相邻词同时出现的概率。假设语料库中总词数7542,单词出现的次数如下图所示。

       

         语句 s 在当前语料库中出现的概率的计算过程如下式所示。

        语句 s 在当前语料库下出现的概率约为0.2122347。

4.2隐马尔可夫模型

        隐马尔可夫模型(Hidden Markov Model,HMM)是一种概率模型,用于解决序列预测问题,可以对序列数据中的上下文信息进行建模。HMM用于描述含有隐含未知参数的马尔可夫过程。 在HMM中,有两种类型的节点,分别为观测序列与状态序列。状态序列是不可见的,它们的值是需要通过从观测序列进行推断而得到的。很多现实应用可以抽象为此类问题,如语音识别、NLP中的分词、词性标注、计算机视觉中的动作识别等。

4.2.1马尔可夫模型

        马尔可夫模型是一种统计模型,用于描述一个系统在不同状态之间的转移过程。其特点是未来状态仅依赖于当前状态,与过去状态无关。这种特性称为马尔可夫性。

        每个状态的转移只依赖于之前的n个状态,这个过程被称为1个n阶的模型,其中n是影响转移状态的数目。最简单的马尔可夫过程就是一阶过程。

4.2.2HMM

        马尔可夫模型中的状态是可见的,而 HMM的状态则是部分可见的。HMM描述了观测变量和状态变量之间的概率关系。与马尔可夫模型相比,HMM 不仅可对状态建模,而且可对观测值建模。不同时刻的状态值之问,同一时刻的状态值和观测值之间,都存在概率关系。

4.2.3中文分词与HMM

        中文分词可以看作是中文的标注问题。标注问题是给定观测序列预测其对应的标记序列。 假设标注问题的数据是由HMM生成的,利用HMM的学习与预测算法进行标注。 下面以中文分词问题为例,介绍HMM如何用于中文标注。

        对于句子“我是中华人民共和国国民”,在这里观测序列 为“我是中华人民共和国国民”,每个字为每个时刻的观测值。状态序列为标注的结果,每个时刻的状态值有4种情况{B,M,E,S},其中B代表该字是起始位置的字,M代表中间位置的字,E代表末尾位置的字,S代表能够单独成字的字。 对待分词语句进行序列标注,如果得到状态序列Q为{S S B E B M E},则有“我/S 是/S 一/B 位/E 程/B 序/M 员/E”。 得到了这个标注结果后,即可得到分词结果。遇到S,则为一个单字词,遇到B,则为一个词的开始,直到遇到下一个E,则为一个词的结尾。 这样句子“我是中华人民共和国国民”的分词结果为“我/是/中华人民共和国/国民”。

4.2.4维特比算法

        维特比算法(Viterbi algorithm)是机器学习中应用非常广泛的动态规划算法,在求解HMM模型预测问题中用到该算法。 实际上,维特比算法不仅是很多NLP的解码算法,也是现代数字通信中使用最频繁的算法。 中文分词问题可以利用维特比算法求解,得到标注的状态序列值。

  

        马尔可夫算法要详细解释数学原理也十分复杂,大家如果感兴趣可以看看大佬文章:

机器学习算法之——隐马尔可夫模型原理详解及Python实现_Python_迈微AI研发社_InfoQ写作社区

           由于分词与词性标注内容过多将会分为两期,望周知

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值