在自然语言理解中,一个词(token)是可以独立行动的最小有意义的语言成分。确定单词是理解自然语言的第一步。只有经过这一步,中文才能像英文一样,过渡到词组划分、概念抽取、主题分析、自然语言理解,最终达到智能计算的最高境界。因此,每个NLP工作者都应该掌握分词技术。一、分词的概念和分类“词”的概念一直是汉语语言学领域挥之不去、挥之不去的难题。“什么是词”(词的抽象定义)和“什么是词”(词的具体定义)这两个基本问题,目前还没有一个权威明确的说法,也没有人认为今天得到大家的认可。词汇。问题的主要难点在于汉语的结构与印欧语系的语言结构差异很大,很难界定词的边界。例如,在英语中,单词本身就是“word”的表达,而一篇英文文章的格式就是“word”加一个分隔符(空格)。在汉语中,词以字为单位,但文章的语义表达仍以词为分。因此,有必要将汉字按照一定的方式组织起来,分词成不同的字。中文分词就是让计算机自动识别句子中的词,然后在词与词之间加上分界符。这个过程看似简单,但实际操作起来要复杂得多。主要难点在于分词歧义。下面是NLP分词的经典场景示例。marriedandnotyetmarried这句话应该分词为“married/of/and/notyet/married/of”还是“married/of/monk/not/married”/of?这个问题,机器是另外,未注册词、分词粒度等都是影响分词效果的重要因素,自中文自动分词提出以来,经过近30年的探索,出现了多种分词方法,主要可以概括为三个流派:规则分词、统计分词和混合分词(规则+统计)。近年来出现了利用深度学习的分词方式,如BILSTM+CRF。规则分词是最早的方法,主要是手工建立词库,按照一定的方式进行匹配和分词,简单高效,但是对于没有入词库的新词处理起来比较困难,然后stati统计机器学习技术应运而生,应用于分词任务时,出现了统计分词方法。这种方法可以更好地应对新词发现等特殊场景。但是在实践中,纯统计分词也有其不足之处:过于依赖语料库的质量。因此在实践中,采用了规则分词和统计分词两种方法相结合的方式,即混合分词。2.规则分词规则分词是一种机械的分词方法,需要不断维护和更新词典。对句子进行分词时,将句子中的每个字符串与词汇表中的每个词一一匹配。点数,如果没有找到,则不分。按照匹配划分,主要有正向最大匹配、反向最大匹配和双向最大匹配三种切分方法。1.前向最大匹配前向最大匹配(MaximumMatch)通常称为MM法,其执行过程如下。从左到右,将待分词中文句子的m个字符作为匹配字段,m为机器词典中最长词条的字符数。查机器字典,做个匹配。如果匹配成功,则匹配字段被分词为一个词。如果匹配不成功,则去掉匹配域中的最后一个词,将剩余的字符串作为新的匹配域进行下一次匹配,重复上述过程,直到所有的词都被切分。比如我们现在有一个字典,最长的单词的长度是5,字典里有三个单词:“南京市长”、“长江大桥”、“大桥”。现在用正向最大匹配对“南京长江大桥”这句话进行分词,然后先从句子中取出“南京长江”的前5个词,发现这个词在字典中不存在,所以减少长度和取前4个词“南京市长”,该词存在于字典中,故确认该词被切分。然后把剩下的“江桥”按同样的方法划分,得到“江”和“桥”,最后分成三个字:“南京市长”、“江”、“桥”。显然,这个结果并不是我们所希望的。前向最大匹配法的示例代码如下。classMM(object):def__init__(self):self.window_size=3defcut(self,text):result=[]index=0text_length=len(text)dic=['research','postgraduate','life','origin']whiletext_length>index:forsizeinrange(self.window_size+index,index,-1):#4,0,-1piece=text[index:size]ifpieceindic:index=size-1breakindexindex=index+1result.append(piece)returnresult分词结果如下图,不尽如人意。text='生命起源研究'tokenizer=MM()print(tokenizer.cut(text))输出结果如下。['毕业','明','德','出身']2.反向最大匹配反向最大匹配简称RMM法。RMM方法的基本原理与MM方法大致相同,区别在于分词的方向与MM方法相反。反向最大匹配法从处理文档的末尾开始匹配扫描,每次取最后m个字符(m为字典中最长的词)作为匹配字段。如果匹配失败,则去掉匹配字段中的第一个词,继续匹配。相应的,它使用的分词词典是一个倒序词典,里面的每一个词条都会倒序存储。实际处理时,先对单据进行倒序,生成倒序单据。然后,根据倒序字典,可以用前向最大匹配法对倒序文档进行处理。由于汉语有很多偏向结构,如果从后往前匹配,可以适当提高准确率。因此,反向最大匹配法的误差小于正向最大匹配法。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用反向最大匹配的错误率为1/245。比如之前的“南京长江大桥”,根据反向最大匹配,最终得到“南京市”和“长江大桥”的分词结果。当然,这样的划分并不代表完全正确。可能有一个叫“蒋大桥”的“南京市长”。反向最大匹配法示例代码如下。classRMM(object):def__init__(self):self.window_size=3defcut(self,text):result=[]index=len(text)dic=['research','postgraduate','life','life','of','origin']whileindex>0:forsizeinrange(index-self.window_size,index):piece=text[size:index]ifpieceindic:index=size+1breakindexindex=index-1result.append(piece)result.reverse()returnresult分词结果如下,这个结果很准确。text='生命起源研究'tokenizer=RMM()print(tokenizer.cut(text))输出结果如下。['研究','生活','的','起源']3。双向最大匹配双向最大匹配法是将正向最大匹配法得到的分词结果与反向最大匹配法得到的结果进行比较,然后按照最大匹配的原则,得到选择词数最少的结果作为结果。根据SunM.S.和BenjaminK.T.,对于大约90.0%的中文句子,正向最大匹配和反向最大匹配的分词结果是完全重合和正确的,只有大约9.0%的句子是使用两种分词方法得到的。不一样,但一定有一个是正确的(歧义检测成功),有不到1.0%的句子,或者正向最大匹配和反向最大匹配的分词结果全错,或者正maximummatching和reversemaximummatching的分割结果不同,但都不正确(歧义检测失败)。这就是双向最大匹配法在实际中文信息处理系统中得到广泛应用的原因。上面列出的“南京长江大桥”使用双向最大匹配法进行切分,中间产生两个结果:“南京市/河流/大桥”和“南京市/长江大桥”,最后选择“南京市/长江大桥”字数较少。/长江大桥”结果。双向最大匹配规则如下。(1)如果正负分词结果的词数不同,则取分词数较小的结果(上例:“南京市/江/桥”的分词数为3,而对于“南京市/长江大桥”的分词个数为2,所以分词结果个数为2)。(2)如果分词结果中的词数相同,则:如果分词结果相同,说明没有歧义,可以返回任何结果。分词结果不同,返回词少的。例如上面的示例代码中,正向最大匹配返回的结果为“['研究生','生活','of','产地']”,其中字数为2;而反向最大匹配返回的结果是“['Research','Life','of','Origin']”,其中单词数为1。所以返回的是反向最大匹配的结果.参考代码如下。#统计词成词的个数defcount_singlechar(word_list):returnsum(1forwordinword_listiflen(word)==1)defbidirectional_segment(text):mm=MM()rmm=RMM()f=mm.cut(text)b=rmm.cut(text)if(len(f)
