-
中文分词技术
2019-03-29 12:38:18介绍NLP中常见的中文分词技术。中文分词技术
简介
自然语言处理的一项核心技术。在语言理解中,词是最小的能够独立活动的有意义的语言成分。将词确定下来是理解自然语言的第一步,只有跨越这一步,中文才能像英文那样过渡到短语划分、概念抽取以及主题分析,已至自然语言理解,最终达到智能计算的最高境界。因此,每个NLP研究者应该掌握最基本的分词技术。
“词”这个概念一直是汉语语言学界纠缠不清而又绕不开的问题。“词是什么”(词的抽象定义)和“什么是词”(词的具体界定),这两个问题迄今为止也没有权威、明确的表述,更不可能拿出令人认可的词表来。主要的难点在于汉语结构与英语等语种差异很大,对词的构成边界方面很难界定。
在英语中,单词本身就是“词”的表达,一篇英文文章就是“单词”加分隔符(空格或者逗号和句号)来表示的,而在汉语中,词以字为基本单位的,但是一篇文章的语义表达确实 以词来划分的。因此,在处理中文文本时,需要进行分词处理,将句子转化为词的表示。这个切词处理过程就是中文分词,它通过计算机自动识别出句子的词,在词间加入边界标记符,分隔出各个词汇。整个过程看似简单,然而实践起来确实无比复杂的,主要就是因为中文歧义。
分词策略
很多句子人来判定都有问题,更不用说机器了。此外,像未登录词、分词粒度粗细等都是影响分词效果的重要因素。从中文分词提出以来,历经30多年的探索,提出来很多方法,归纳为**规则分词、统计分词和混合分词(规则+统计)**这三个主要流派。
规则分词是最早兴起的办法,主要是通过人工设立词库,按照一定的方式进行匹配切分,其实现简单高效,但对新词很难进行处理。统计分词是随着机器学习的技术兴起,应用到了分词任务上而产生的,它能够较好应对新词发现等特殊场景。然而,实践中统计分词太过依赖语料的质量。混合分词是基于前两者的结合,如今大多采用这种方式。
规则分词
基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时将语句的每个字符串与词表中的词逐一匹配,找到则切分,否则不予切分。按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向匹配法三种。这三种方法每一个都是对前者的优化。基于规则的分词,一般简单高效,但是词典的维护是一个庞大的工程。在网络发达的今天,新词层出不穷,很难通过词典覆盖所有词。
统计分词
随着大规模语料的建立,统计机器学习方法的研究和发展,基于统计的中文分词算法渐渐成为主流。其主要思想是把每个词看做是由词的最小单位的各个字组成的,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。因此我们就可以利用字与字相邻出现的频率来反映成词的可靠度,统计语料中相邻出现的各个字的组合的频度,当组合频度高于某一个临界值时,我们便认为此字组可能会构成一个词语。
基于统计的分词一般做如下两个步骤。
- 建立统计语言模型。
- 对句子进行单词划分,然后对划分结果进行概率计算,获得概率最大的分词方式。这里就用到了统计学习算法,如隐含马尔可夫(HMM)、条件随机场(CRF)等。
主要的有HMM模型、CRF模型、神经网络分词算法(常采用CNN、LSTM等深度学习网络自动发现一些模式和特征,然后结合CRF、softmax等分类算法进行分词预测。)对比机械分词法,统计分词方法不需要耗费人力维护词典,能较好地处理歧义和未登录词,是目前分词的主流方法。但是,其分词的效果很依赖训练语料的质量,且计算量很大。
混合分词
事实上,目前不管是基于规则的算法、还是基于HMM、CRF或者深度学习的方法,其分词效果在具体任务中,其实差距并没有多明显。在实际工程应用中,多是基于一种分词方法,然后用其他分词算法加以辅助。如此,能在保证词典分词准确率的基础上,对未登录词和歧义词有较好的识别,jieba就是如此实现的。
中文分词工具Jieba
北大之前开源的pkuseg在我之前的博客有过介绍。近年来,NLP技术的日益成熟,开源实现的分词工具越来越多,如Ansj、盘古分词等。相对而言,jieba有着如下优势。
- 社区活跃。
GitHub近10000的star,社区反馈快。 - 功能丰富
并不只是分词,其实是一个开源框架,提供了很多分词之上的算法,如关键词提取、词性标注等。 - 多语言实现
官方提供Python、Java、C++、Go、R、iOS等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如ElasticSearch、solr、lucene等。 - 使用简单
API不多,配置不复杂,方便上手。
jieba结合了基于规则和统计两种方法。首先,基于前缀字典的词图扫描;然后,对于未登录词,使用基于汉字成词的HMM模型,采用了Viterbi算法进行推导。
安装
pip install jieba
三种分词模式(见JiebaDemo)
- 精确模式(默认)
- 试图将句子最精确切开,适合文本分析。
- 全模式
- 把句子中可以成词的词语都扫描出来,速度很快,但是不能解决歧义。
- 搜索引擎模式
- 在精确模式的基础上,对长词再次划分,提高召回率,适合用于搜索引擎分词。
Demo
import jieba sentence = "中文分词是文本处理不可或缺的一步!" seg_list = jieba.cut(sentence, cut_all=True) print('全模式', '/'.join(seg_list)) seg_list = jieba.cut(sentence, cut_all=False) print('精确模式', '/'.join(seg_list)) seg_list = jieba.cut(sentence) print('默认精确模式', '/'.join(seg_list)) seg_list = jieba.cut_for_search(sentence) print('搜索引擎模式', '/'.join(sentence))
自定义字典
jieba有默认的一套字典,然而很多情况下,不同的应用场合需要不同的字典,jieba支持用户自定义字典,只要分词之前使用下面的代码加载即可。
jieba.load_userdict('./data/user_dict.utf8')
这个用户自定义的字典格式如下。
- 每行
- 词语 词频(可以省略) 词性(可以省略)
- 需为utf8编码
实战
本案例目标为高频词提取,数据集为搜狗实验室新闻数据。高频词一般指文档中出现频率较高且非无用的词语,其一定程度上代表了文档的焦点所在。针对单篇文档,可以作为关键词看待。对于新闻这样的多篇文档,可以作为热词,发现舆论焦点。高频词提取其实就是NLP中的TF策略。(后面具体介绍)主要有标点符号和停用词(“的”“了”等无意义词)两个干扰项。
下面的代码是使用jieba,针对搜狗实验室新闻数据,进行高频词提取。
def get_content(path): """ 获取文件内容 :param path: :return: """ with open(path, 'r', encoding='gbk', errors='ignore') as f: content = '' for l in f: l = l.strip() content += l return content def get_TF(words, topK=10): """ 计算TF值 :param words: :param topK: :return: """ tf_dic = {} for w in words: tf_dic[w] = tf_dic.get(w, 0) + 1 return sorted(tf_dic.items(), key=lambda x: x[1], reverse=True)[:topK] def stop_words(path): """ 获取停用词 :param path: :return: """ with open(path, encoding='utf-8') as f: return [l.strip() for l in f] stop_words('./data/stop_words.utf8') def main(): """ 主模块 :return: """ # 文件操作模块,允许通配符等 import glob import jieba import random files = glob.glob('./data/news/C000013/*.txt') corpus = [get_content(x) for x in files] # 随机文字进行高频词提取 sample_inx = random.randint(0, len(files)) split_words = [x for x in jieba.cut(corpus[sample_inx]) if x not in stop_words('./data/stop_words.utf8')] print('样本之一:' + corpus[sample_inx]) print('样本分词效果:' + '/ '.join(split_words)) print('样本的topK(10)词:' + str(get_TF(split_words))) if __name__ == '__main__': main()
结果如下图。
补充说明
本问内容参考自《Python自然语言处理实战》此书,具体数据集代码可以查看我的GitHub,欢迎star或者fork
-
中文分词技术
2010-08-05 10:44:00中文分词又叫中文切词,中文划词等,是seo必须掌握的一个基础知识。现有的中文分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 . 1、基于字符串匹配的分词方法 . 这种...中文分词又叫中文切词,中文划词等,是seo必须掌握的一个基础知识。现有的中文分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 .
1、基于字符串匹配的分词方法 .
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个充分大的机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下: .
1)正向最大匹配法(由左到右的方向); ..
2)逆向最大匹配法(由右到左的方向); 版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215,我们收到后立即删除,谢谢!
3)最少切分(使每一句中切出的词数最小)。 版权申明:本站文章均来自网络,本站所有转载文章言论不代表本站观点
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。 对真正的成功者来说,不论他的生存条件如何,都不会自我磨灭
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。 .
2、基于统计的分词方法 .
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。 ..
3、基于理解的分词方法 特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系.
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215 ,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。 .
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。 。
1、歧义识别 .
歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面的”和“表 面的”。这种称为交叉歧义。像这种交叉歧义十分常见,前面举的“和服”的例子,其实就是因为交叉歧义引起的错。“化妆和服装”可以分成“化妆 和 服装”或者“化妆和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。 版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215,我们收到后立即删除,谢谢!
交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必需根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别? ..
如果交叉歧义和组合歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。 根据专家观察,这样的理论和现象都是值得各位站长深思的,所以希望大家多做研究学习,争取总结出更多更好的经验!
2、新词识别 特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系
新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词? .
新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。有兴趣的朋友可以用百度搜索引擎做个尝试,输入不同的关键字,查看百度的返回结果,从中理解百度的分词方法,本人认为这样的学习效率是才最高的。