python 英语分词_中文分词简介

之前挂课的时候看到有同事在讲中文分词,风格很有学校里做presentation的感觉,于是我想接着课程里分享的内容,再扯一点分词算法的东西。这里只讲算法不涉及代码实现,大家有兴趣的话可以在阅读的过程中一起思考。

068c1442a71a365247151ce3e1b16077.png

日常生活中,我们经常会使用搜索引擎,而在搜索的过程中,我们并不一定只搜一个词语而是一句话。于是问题就来了,搜索引擎如何准确用户要搜什么呢?我们知道一句话是由许多词语组成的,而中文句子里词语并不像英语那样由空格分开,这就使得对中文的语义分析又要多加一个分词的步骤来切分一句话。

试想这样一个短语:“中外科学名著”,作为native speaker来说一点不难理解,而对于歪果仁和电脑来说可能就是“四六级难点”了。我们可以发现这句话中包含了好多词语:中外,外科,科学,学名,名著,这就使得切分句子变得很困难。我们一般把这种前后都能成词的情况称为“交集型歧义”,这也是中文分词的主要难点。

人们自然会想到一种朴素的办法,便是“从左到右的最大匹配法”了,这个在网大课程里介绍过。从句子的最左端开始,不断匹配最长的词,不能成词的单字就单独分开,直到把句子分完。这很好理解,这也符合我们人类的阅读习惯,而且往往能正确分词,比如上述的“中外科学名著”,按照最大匹配算法就正确切分了,大家可以自行脑补一下切分过程。

然而构造一个反例也很简单,考虑这样一句话:“上海大学生前往应聘”,我们发现它会被分为“上海大学/生前/往/应聘”。为了修正一些错误,我们需要完善一下算法。可以维护一个特殊规则表,包含例如:“不可能”要分成“不/可能”,“xx的确切yy”中的yy如果是抽象名词时要分成“xx/的/确切/yy”等规则。在特殊规则下,可以解决一部分最大匹配法不能解决的分词歧义。

为了进一步解决交集型歧义,我们可以维护一个一般不单独成词的字表。这些字一般需要和前后文组成词语,比如“民”。当这些字被单独划分时,需要重新考虑分词可能性。比如“为人民服务”,利用最大匹配法,会先分出“为人”,于是发现这么分“民”就会单独成词,查看“一般不单独成词的字表”发现“民”字不能单独成词,于是重新划分,考虑把“人”和“民”划在一起,又发现“为”是可以单独成词的,于是得到正确划分“为/人民/服务”。

b72018cfc7d02f4f4c59d17228031ece.gif f18afff1c0943bb92937badfc1007037.png

随便配张图

b72018cfc7d02f4f4c59d17228031ece.gif

在上述的算法中,仍有可以继续思考的空间。“一般不单独成词的字表”这个名字里有个“一般”对吧,一般又怎么定义呢?“民”是不能单独成词的语素,“虎”一般也不单独成词(但是在诗歌和科技语体中除外),“为”就是可以单独成词的语素。于是我们发现,其实每个字成词是有一定概率的,每个词出现也是有各自概率的

于是我们就想到,可以根据每个词出现的概率来评价分词结果,于是我们就有了“最大概率法”。先统计大量真实语料,记录每个词出现的概率p。在各种分词结果出来后,计算每个分词结果中的每个词语出现概率的乘积3d024431c0f77197c6e22907e9ebff06.png,选出结果最大的分词方案。

利用最大概率法,我们已经极大地改进了我们的分词算法。但是由于它基于概率,自然出现了基于概率的问题。比如,在真实语料里,“的”字出现频率非常高,导致“的确”这个词几乎不可能被正确划分出来。

另外,虽然我们在积极地解决“交集型歧义”,但是考虑另一种情况:“把手”这个词既可以组合成词又可以分开。“这扇门的把手”和“把手举起来”,这两句话里的“把手”就要区别划分,这种需要结合上下文来决定是拆是分的问题,被称为“组合型歧义”。而上述的算法都不能有效解决“组合型歧义”,即无法做到具体情况具体分析。

为了解决“组合型歧义”,我们必须把汉语抽象成一个二元模型,对于任意词语w1和w2,在之前统计的真实语料中统计w1恰好紧跟在w2后面的概率P(w1,w2),这样便产生一个巨型的二维表。重新利用最大概率法评价分词结果“w1/w2/w3/…/wn”,但是评价的公式改为:

ac94e558edd18a09256d6cc28298fe60.png

其中765d41733bea3588b8ec1d7fb61d2b73.png表示w1是句子开头的概率,这样就利用词语之间的概率解决了组合型歧义。如此总算有了一个基本能用的中文分词的模型了,虽然她任然有很大的改进空间。

b72018cfc7d02f4f4c59d17228031ece.gif cb258c894e8f36088607b8fb38c3adad.png

再随便配张图

b72018cfc7d02f4f4c59d17228031ece.gif

亲爱的读者,如果你对上述的不感兴趣、直接拉到了最后,那么你可以了解一下jieba分词。“结巴”分词是一个Python 中文分词组件,参见https://github.com/fxsjy/jieba。它可以对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。有python环境的朋友可以直接pip install jieba试一试。哪有那么多弯弯绕,一句jieba.cut搞定了呀有木有(笑)。

—— E N D ——

图文:周栩韬

排版:KalInIhta

0668ce8996b880e09793c23efc79f67d.png c5303bbb3bfb8995b2b00ed62ec26edb.png  bec93116895f3d2374fd62d0c11a13b1.png b348c9fe9e96028b25cbaa84cc35c624.png 8d96c8a80046fa9d1f7dbedf3c02fe3e.png

七嘴八舌话脑壳

65bc24d4e7b7291ec27700b6b0a4208a.png eaf15d69095df989ca7b1109f5891863.png 859fc4740066b932b07a53c9ce63f4ef.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值