转载

BABY夜谈大数据 : 中英文分词

前言

《BABY大数据》已经和豆瓣签约并会在豆瓣上连载哦,欢迎大家都豆瓣上订阅。本章之后将会在豆瓣上收费,博客上仍然提供免费阅读,我自己也是在开源社区下成长起来的就当做回馈开源社区吧!如果你喜欢本书或者想要支持我,可以直接在豆瓣购买哦!https://read.douban.com/column/3346397/

因为有朋友反馈说看懂了算法但不知道怎么用,所以简单地说下自己的写作计划吧,《BABY夜读大数据》会从基础的一些概念讲解然后逐渐到应用、实际案例。预计30章左右,每一到两周更新一篇。

前面两章都反复提到了分词,甚至相关算法都很依赖分词,那么分词是什么呢?这里的分词可不是英语中那个“具有动词及形容词二者特征的词”哦,而且是切切实实的将一个句子拆分成词。

我们在收集数据的时候常常会碰到一个问题,那就是如何处理人话(自然语言),人说的是人话,自然在网上也是使用人话交流,你总不可能让用户写着代码交流吧?发一句“你好,今天天气不错”要写成“{"你好",",","今天","天气","不错"}”,我想这回是个噩梦吧。

我们经常在大数据中讲数据挖掘,挖掘出数据中的潜在价值,然而数据挖掘最重要的就是要先让计算机理解人话,就跟我们小时候学说话写字一样,先从词学起然后将词根据固定的语法组装成句子。所谓分词其实就是反其道而行,将组装好的一句话拆成不同的词再进行分词什么是主语、宾语、哪些是名词、哪些又是形容词。

比如我们看到“小明讨厌黑色的杯子”,正常人看到后都能很快知道小明讨厌黑色的杯子。对于计算机来说就必须先将这个句子拆开来:

小明/讨厌/黑色/的/杯子

比如说百度贴吧在输入跟广告有关的词语时就会在这个帖子回复的下一层显示出相关的广告,也被一众贴吧网友称为“大召唤术”。

BABY夜谈大数据 : 中英文分词

BABY夜谈大数据 : 中英文分词

这就是一个典型的利用分词达到的功能,通过将用户的帖子标题和内容进行分词,然后根据分词结果看看有没有词是属于广告列表然后进行推荐。

每一种语言基本都有自己的分词方式,这里就只讲解中文和英文。中文和英文一定要分开来讲解,甚至可以说中文是最难分词的语言之一。

英文分词

由于英语的基本组成单位就是词,所以相对来说简单很多。

大致分为三步:

根据空格拆分单词 排除停止词(Stop Word) 提取词干(Stemming) 

1、根据空格拆分单词

这一步是是最简单的一步,英语的句子基本上就是由标点符号、空格和词构成,那么只要根据空格和标点符号将词语分割成数组即可。

如“Nobody knows how ancient people started using fire”分割成{"Nobody","knows","how","ancient","people","started","using","fire"}。

2、排除停止词

停止词,是由英文单词:stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词、介词、副词或连词等。如果搜索引擎要将这些词都索引的话,那么几乎每个网站都会被索引,也就是说工作量巨大。可以毫不夸张的说句,只要是个英文网站都会用到a或者是the。那么这些英文的词跟我们中文有什么关系呢? 在中文网站里面其实也存在大量的stopword,我们称它为停止词。比如,我们前面这句话,“在”、“里面”、“也”、“的”、“它”、“为”这些词都是停止词。这些词因为使用频率过高,几乎每个网页上都存在,所以搜索引擎开发人员都将这一类词语全部忽略掉。如果我们的网站上存在大量这样的词语,那么相当于浪费了很多资源。

常见停止词请看附录:http://www.cybermkd.com/stop-word-list/

如{"Nobody","knows","how","ancient","people","started","using","fire"}去掉停止词后得到 {"Nobody","ancient","people","started","fire"}

3、提取词干

提取词干是西方语言特有的处理,比如说英文单词有 单数复数的变形,-ing和-ed的变形,但是在计算相关性的时候,应该当做同一个单词。比如 apple和apples,doing和done是同一个词,提取词干的目的就是还原成最基本的词。

同时我们可以将所有的大小写统一。

{"Nobody","ancient","people","started","fire"}处理成{"nobody","ancient","people","start","fire"}

经过上面三个步骤基本上一个英文句子就处理完了。

中文分词

对于中文而言,词是承载语义的最小单元,由词构成语句,又由语句构成篇章。但是,中文文本是由连续的字序列构成,词与词之间是没有天然的分隔符 ,所以中文分词相对来说困难很多。中文分词目前来说基本上都还是基于分词用的词典来进行分词的,将字和字组成不同的词然后放入词典中查找。

中文分词面临着相当多的挑战,首当其冲的就是歧义问题,不同的分割方式会导致不同的意思。

如:结婚/的/和尚/未/结婚/的 和 结婚/的/和/尚未/结婚/的

还有个重要的挑战就是未登录词,用人话就是没有收录进词典的词,人名就是最简单的例子,还有就是网友发明的词,诸如:“草泥马”、“不明觉厉”之类云云。

所以一个好的分词词典是决定中文分词质量的关键,还有就是做中文分词的话必须经常更新、与时俱进。

大致可以将中文分词算法分为两种:

1、词典分词

词典分词简单来说就是直接将句子拆成字,然后字和字组合进入词典中匹配,这种方式虽然简单直接但是容易引起歧义问题。

2、基于统计的分词

通过人工标注,对中文建模然后将准备好的语料进行训练,通过计算不同阶段下出现的概率并选出概率最大的情况作为结果来进行分词。

这种分词方法虽然能尽量避免分词导致的歧义,但却需要耗费相当大的性能。

还有一种是基于语义,但是目前还没有很好的方案所以姑且不议。

在常见的分词中建议是使用第一种,并且将常见的、唯一的词如地名、人名等等先单独建个词库,分词前先将这些词提取出来然后再进行分词。然后可以针对自身的情况的建一个歧义纠正词库,将一些分词结果进行纠正。

如分词结果为“王/小明”(这个名字在未登录的情况下),但是在纠正词库中已经记录了“王小明”,所以最终结果为“王小明”。

原文  http://www.ituring.com.cn/article/211476
正文到此结束
Loading...