中文分词就是经过计算机将句子转化成词的表示,自动识别句子中的词,在词与词之间加入边界分隔符,分割出各个词汇。html
中文分词有两大难点:git
1.歧义github
原文:之前喜欢一我的,如今喜欢一我的算法
这里有两个「一我的」,可是表明的意思彻底不同。spring
2.分词界限数据结构
原文:这杯水尚未冷机器学习
分词一: 这 / 杯 / 水 / 还 / 没有 / 冷函数
分词二: 这 / 杯 / 水 / 还没 / 有 / 冷工具
分词三: 这 / 杯 / 水 / 尚未 / 冷学习
能够说中文分词没有标准的分词算法,只有对应不一样场景更适合的分词算法。
主要能够分为三个方法:机械分词方法,统计分词方法,以及两种结合起来的分词
机械分词方法又叫作基于规则的分词方法:这种分词方法按照必定的规则将待处理的字符串与一个词表词典中的词进行逐一匹配,若在词典中找到某个字符串,则切分,不然不切分。
按照匹配规则的方式,又能够分为:正向最大匹配法,逆向最大匹配法和双向匹配法三种
1.正向最大匹配法(Maximum Match Method,MM 法)是指从左向右按最大原则与词典里面的词进行匹配。假设词典中最长词是 mm 个字,那么从待切分文本的最左边取 mm 个字符与词典进行匹配,若是匹配成功,则分词。
若是匹配不成功,那么取 m−1m−1 个字符与词典匹配,一直取直到成功匹配为止。流程图以下:
算法步骤:
dic
,待分词文本 text
,建立空集 words
。max_len_word
。max_len=max_len_word
个字符做为待匹配字符串 word
。word
与词典 dic
匹配max_len = max_len - 1
,而后word
添加进 words
当中。max_len
个字符max_len
值为 max_len_word
words
2.逆向最大匹配法( Reverse Maximum Match Method, RMM 法)的原理与正向法基本相同,惟一不一样的就是切分的方向与 MM 法相反。逆向法从文本末端开始匹配,每次用末端的最长词长度个字符进行匹配。
另外,因为汉语言结构的问题,里面有许多偏正短语,即结构是:
所以,若是采用逆向匹配法,能够适当提升一些精确度。换句话说,使用逆向匹配法要比正向匹配法的偏差要小。
3.双向最大匹配法(Bi-direction Matching Method ,BMM)则是将正向匹配法获得的分词结果与逆向匹配法获得的分词结果进行比较,而后按照最大匹配原则,选取次数切分最少的做为结果。
基于统计规则的中文分词算法逐渐成为如今的主流分词方法。其目的是在给定大量已经分词的文本的前提下,利用统计机器学习的模型学习词语切分的规律。
统计分词能够这样理解:咱们已经有一个由不少个文本组成的的语料库 D
,如今有一个文本须要咱们分词, 我有一个苹果
,其中两个相连的字 苹
果
在不一样的文本中连续出现的次数越多,就说明这两个相连字极可能构成一个词 苹果
。与此同时 个
苹
这两个相连的词在别的文本中连续出现的次数不多,就说明这两个相连的字不太可能构成一个词 个苹
。因此,咱们就能够利用这个统计规则来反应字与字成词的可信度。当字连续组合的几率高过一个临界值时,就认为该组合构成了一个词语。
语言模型又叫作 N 元文法模型(N-gram)。按照书面解释来讲,以长度为 m 的字符串,目的是肯定其几率分布 P(w1,w2,⋯,wm),其中 w1到 wm 依次为文本中的每一个词语。
这个几率能够用链式法则来求:即
由于咱们是基于语料库的统计模型,因此上面的全部几率均可以经过对语料库的统计计算得到。可是,虽然采用的方法简单粗暴,可是观察上面的式子能够知道,当语料很大的时候,公式从第三项开始计算量就已经十分庞大了。
所以,在语言模型的基础上,衍生出了 nn 元模型。所谓的 nn 元就是在估算条件几率时,忽略掉大于 nn 个或者等于 nn 个上文词的的影响。即将上式子中的每一项简化
能够看到,当 n=1n=1 时,词与词之间基本没有关系。随着 nn 逐渐增大,每一个模型与上文的关系越密切,包含的次序信息也越丰富,可是与此同时计算量也随之大大增长。因此经常使用的通常为二元模型,三元模型。
在天气预测时候,假如咱们知道晴雨云天气之间的相互转换几率,以下图:
有了这个转移几率图,假如咱们知道今天的天气状况的时候,咱们就能推测出明天的天气情况。若今天为晴,那么明天推测为阴天(取其中几率最大的)。这样一种类型就是马可夫模型。
隐马可夫(Hidden Markov Method , HMM)模型是在马可夫模型的特殊状况,更进一步的,咱们在上面马尔可夫的模型中,添加更多的限制条件。
在这个例子当中,将来几每天气状态的序列就叫作隐藏状态序列。而咱们惟一能观测到的是,将来几天空气中的湿度,这些湿度状态就叫作可观测状态。
由于空气湿度与天气有关,所以咱们想要经过能够观测到的空气湿度这一可观测状态序列来推测出将来三天的天气状态这一隐藏状态序列。这类型的问题,就叫作隐马可夫模型。
Python 的第三方的中文分词工具 jieba,省去咱们在实际应用中省掉训练分词马可夫模型的繁琐步骤。而且,jieba 工具用的 HMM算 法与数据结构算法结合使用的方法,比直接单独使用 HMM 来分词效率高不少,准确率也高不少。
首先须要下载第三方的 jieba 工具库:https://github.com/fxsjy/jieba
下面咱们就来经过例子看下 jieba 分词的方法:
import jieba #全模式 string = '我来到北京清华大学' seg_list = jieba.cut(string, cut_all=True) #没法直接显示,若想要显示,能够下面这样。用 ‘/’ 把生成器中的词串起来显示。这个方法在下面提到的精确模式和搜索引擎模式中一样适用。 '/'.join(seg_list) #精确模式 seg_list = jieba.cut(string, cut_all=False) #搜索引擎模式 seg_list = jieba.cut_for_search(string)
jieba 在某些特定的状况下来分词,可能表现不是很好。好比一篇很是专业的医学论文,含有一些特定领域的专有名词。
不过,为了解决此类问题, jieba 容许用户本身添加该领域的自定义词典,咱们能够提早把这些词加进自定义词典当中,来增长分词的效果。调用的方法是:jieba.load_userdic()
。
自定义词典的格式要求每一行一个词,有三个部分,词语,词频(词语出现的频率),词性(名词,动词……)。其中,词频和词性可省略。用户自定义词典能够直接用记事本创当即可,可是须要以 utf-8 编码模式保存。 格式像下面这样:
除了使用 jieba.load_userdic()
函数在分词开始前加载自定义词典以外,还有两种方法在能够在程序中动态修改词典。
使用 add_word(word, freq=None, tag=None)
和 del_word(word)
可在程序中动态修改词典。
使用 suggest_freq(segment, tune=True)
可调节单个词语的词频,使其能(或不能)被分出来。
使用自定义词典,有时候能够取得更好的效果,例如「今每天气不错」这句话,本应该分出「今天」、「天气」、「不错」三个词,而来看一下直接使用结巴分词的结果:
string = '今每天气不错' #添加本身的词 jieba.suggest_freq(('今天', '天气'), True) seg_list = jieba.cut(string, cut_all=False) #从词典中删除词语 jieba.del_word('今每天气') #强制调高词频,使其分为一个词 jieba.add_word('台中')