说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

【问底】严澜:数据挖掘入门——分词

HTML文档下载 WORD文档下载 PDF文档下载
随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,数据这座金山已浮出水面。这里,严澜将带我们逐渐开启这座金山——从“分词”开始挖掘数据。

谷歌4亿英镑收购人工智能公司DeepMind,百度目前正推进“百度大脑”项目,腾讯、阿里等各大巨头也在积极布局深度学习。随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,让冷冰冰的数据具有智慧逐渐成为新的热点。要从数据中发现有用的信息就要用到数据挖掘技术,不过买来的数据挖掘书籍一打开全是大量的数学公式,而课本知识早已还给老师了,着实难以下手、非常头大!

我们不妨先跳过数学公式,看看我们了解数据挖掘的目的——发现数据中价值。这个才是关键,如何发现数据中的价值。那什么是数据呢?比如大家要上网首先需要输入网址,打开网页后会自动判断哪些是图片、哪些是新闻、哪些是用户名称、游戏图标等。大脑可以存储大量的信息,包括文字、声音、视频、图片等,这些同样可以转换成数据存储在电脑。人的大脑可以根据输入自动进行判断,电脑可以通过输入判断吗?

答案是肯定的! 不过需要我们编写程序来判断每一种信息,就拿文字识别来说吧,怎么从一个人在社交网络的言论判断他今天的心情是高兴还是愤怒!比如:“你假如上午没给我吃冰淇淋,我绝对会不happy的。”  信息发布时间为下午2点。对于我们人类一看这个句子就知道他是吃过冰淇淋了,心情肯定不会是愤怒。那计算机怎么知道呢?       

这就是今天的主题,要让计算机理解句子的语义,必须要有个程序,上面的句子和发布时间是输入,输出就是 “高兴”。要得到“高兴”就要建立 “高兴”的规则,可以建一个感情色彩词库,比如高兴(识别词是高兴、happy),愤怒(识别词是愤怒、生气)。这里的识别词就是输入中出现的词语,比如上面的句子中的“happy”就识别出了“高兴”这个感情色彩词。但是光识别出“happy”肯定是不行的,前面的“假如……没……,我……不……”等关键词都需要识别出来,才能完整判断一个句子的意思。为了达到这个效果,就必须要用分词技术了。

分词

我们先人工对上面的句子来进行一下切词,使用斜线分割:“你/假如/上午/没/给/我/吃/冰淇淋/,/我/绝对/会/不/happy/的/。/”。但是程序如何做到自动切分?这个其实中国的前辈们已经做了很多中文分词的研究,常见的分词算法有:

1. 基于词典的分词,需要先预设一个分词词典,比如上面句子切分出来的“假如、上午”这些词先存放在词典,然后把句子切分成单字组合成词语去词典里查找,匹配上了就挑选出来一个词。没有匹配上的就切分成单字。

2. 基于统计的分词,需要先获取大量的文本语料库(比如新闻、微博等),然后统计文本里相邻的字同时出现的次数,次数越多就越可能构成一个词。当达到一定次数时就构成了一个词,即可形成语料概率库。再对上面句子进行单字切分,把字与字结合后在语料概率库里查找对应的概率,如果概率大于一定值就挑选出来形成一个词。这个是大概描述,实际生产环境中还需要对句子的上下文进行结合才能更准确的分词。

3. 基于语义的分词,简而言之就是模拟人类对句子的理解来进行分词。需要先整理出中文语句的句法、语义信息作为知识库,然后结合句子的上下文,对句子进行单字切分后组合成词逐个带入知识库进行识别,识别出来就挑选出一个词。目前还没有特别成熟的基于语义的分词系统。

基于词典的分词

为了让大家快速的了解分词技术,我们采用第一个方式来做测试:基于词典的分词,这种方式简单暴力可以解决百分之七八十的问题。基于词典的分词大概分为以下几种方式:

1. 正向最大匹配,沿着我们看到的句子逐字拆分后组合成词语到词典里去匹配,直到匹配不到词语为止。举个实际的例子:“人民大会堂真雄伟”,我们先拆分为单字“人”去词典里去查找,发现有“人”这个词,继续组合句子里的单字组合“人民”去词典里查找,发现有“人民”这个词,以此类推发现到“人民大会堂”,然后会结合“人民大会堂真”去词典里查找没有找到这个词,第一个词“人民大会堂”查找结束。最终分词的结果为:“人民大会堂/真/雄伟”。如下图演示了用正向最大匹配算法识别人民大会堂的过程,“真”,“雄伟”的识别类似。

2. 逆向最大匹配,这个和上面相反,就是倒着推理。比如“沿海南方向”,我们按正向最大匹配来做就会切分成 “沿海/南方/向”,这样就明显不对。采用逆向最大匹配法则来解决这个问题,从句子的最后取得“方向”这两个字查找词典找到“方向”这个词。再加上“南方向”组成三字组合查找词典没有这个词,查找结束,找到“方向”这个词。以此类推,最终分出“沿/海南/方向”。

3. 双向最大匹配,顾名思义就是结合正向最大匹配和逆向最大匹配,最终取其中合理的结果。最早由哈工大王晓龙博士理论化的取最小切分词数,比如“我在中华人民共和国家的院子里看书”,正向最大匹配切分出来为“我/在/中华人民共和国/家/的/院子/里/看书”工8个词语,逆向最大匹配切分出来为“我/在/中华/人民/共/和/国家/的/院子/里/看书”共11个词语。取正向最大匹配切出来的结果就是正确的。但是如果把上面那个例子“沿海南方向”双向切分,都是3个词语,改如何选择?看第4个《最佳匹配法则》。

4. 最佳匹配法则,先准备一堆文本语料库、一个词库,统计词库里的每一个词在语料库里出现的次数记录下来。最后按照词频高的优先选出,比如“沿海南方向”,正向切分为:“沿海/南方/向”,逆向切分为:“沿/海南/方向”。其中“海南”的频度最高,优先取出来。剩下“沿”、“方向”也就正常切分了。是不是这就是基于词典分词的最佳方案?比如数学之美中提到的:“把手抬起来” 和 “这扇门的把手”,可以分为“把”、“手”、“把手”,不管怎么分总有一句话的意思不对。后续再介绍如何通过统计的分词处理这些问题。

说了这么多,我们来实战一下如何基于词典的分词:

public class TestPositiveMatch {    public static void main(String[] args) {   String str = "我爱这个中华人民共和国大家庭";   List<String> normalDict = new ArrayList<String>();   normalDict.add("");   normalDict.add("爱");  normalDict.add("中华");  //测试词库里有中华和中华人民共和国,按照最大匹配应该匹配出中华人民共和国   normalDict.add("中华人民共和国");  int strLen = str.length();  //传入字符串的长度   int j = 0;  String matchWord = ""; //根据词库里识别出来的词  int matchPos = 0; //根据词库里识别出来词后当前句子中的位置  while (j < strLen) {  //从0字符匹配到字符串结束  int matchPosTmp = 0;  //截取字符串的位置   int i = 1;  while (matchPosTmp < strLen) {  //从当前位置直到整句结束,匹配最大长度   matchPosTmp = i + j;  String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串  if (normalDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }   i++;   }   if (!matchWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchWord + " ");   } else {  //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分   System.out.print(str.substring(j, ++j) + " ");   }   matchWord = "";   }   } }

输出结果为:我爱这个中华人民共和国大家庭  

按照这样我们一个基本的分词程序开发完成。

对于文章一开始提到的问题还没解决,如何让程序识别文本中的感情色彩。现在我们先要构建一个感情色彩词库“高兴”,修饰词库“没”、"不”。再完善一下我们的程序:

public class TestSentimentPositiveMatch {   public static void main(String[] args) {   String str = "你假如上午没给我吃冰淇淋,我绝对会不happy的。";  //语义映射   Map<String, String> sentimentMap = new HashMap<String, String>();   sentimentMap.put("happy", "高兴");  //情感词库   List<String> sentimentDict = new ArrayList<String>();   sentimentDict.add("happy");  //修饰词   List<String> decorativeDict = new ArrayList<String>();   decorativeDict.add("不");   decorativeDict.add("没");  //修饰词衡量分数   Map<String, Double> decorativeScoreMap = new HashMap<String, Double>();   decorativeScoreMap.put("不", -0.5);   decorativeScoreMap.put("没", -0.5);  List<String> decorativeWordList = new ArrayList<String>();  //修饰词  String sentimentResult = ""; //情感结果  int strLen = str.length();  //传入字符串的长度   int j = 0;  String matchSentimentWord = ""; //根据词库里识别出来的情感词  String matchDecorativeWord = ""; //根据词库里识别出来的修饰词  int matchPos = 0; //根据词库里识别出来词后当前句子中的位置  while (j < strLen) {  //从0字符匹配到字符串结束  int matchPosTmp = 0;  //截取字符串的位置   int i = 1;  while (matchPosTmp < strLen) {  //从当前位置直到整句结束,匹配最大长度   matchPosTmp = i + j;  String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串  if (sentimentDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchSentimentWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }  if (decorativeDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchDecorativeWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }   i++;   }   if (!matchSentimentWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchSentimentWord + " ");   sentimentResult = sentimentMap.get(matchSentimentWord);   }   if (!matchDecorativeWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchDecorativeWord + " ");   decorativeWordList.add(matchDecorativeWord);   } else {  //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分   System.out.print(str.substring(j, ++j) + " ");   }   matchSentimentWord = "";   matchDecorativeWord = "";   }   double totalScore = 1;   for (String decorativeWord : decorativeWordList) {   Double scoreTmp = decorativeScoreMap.get(decorativeWord);   totalScore *= scoreTmp;   }   System.out.print("\r\n");   if (totalScore > 0) {   System.out.println("当前心情是:" + sentimentResult);   } else {   System.out.println("当前心情是:不" + sentimentResult);   }   } }

通过传入“你假如上午没给我吃冰淇淋,我绝对会不happy的。”,结果输出为:“当前心情是:高兴”。当然你也可以改变其中的修饰词,比如改为:“你假如上午没给我吃冰淇淋,我绝对会happy的。”,结果输出为:“当前心情是:不高兴”。

机器再也不是冷冰冰的,看起来他能读懂你的意思了。不过这只是一个开始,抛出几个问题:

  1. 如何让程序识别句子中的时间?比如“上午”、“下午2点”。
  2. 如何处理“把手抬起来” 和 “这扇门的把手”中的“把”与“手”的问题?
  3. 如何构建海量的知识库,让程序从“婴儿”变成“成年人”?
  4. 如何使用有限的存储空间存储海量的知识库?
  5. 如何提高程序在海量知识库中查找定位信息的效率?
  6. 如何识别新词、人名、新鲜事物等未知领域?

宇宙芸芸众生都是相通的,大脑也许就是一个小宇宙,在这个小宇宙又有很多星球、住着很多生物。而电脑也是宇宙中地球上的一个产物,只要存储计算速度发展到足够强大一定可以构建成一个强大的大脑。

你看这个单词 "testaword" 认识吗?可能不认识,因为我们五官先获取到的信息,然后根据大脑以往学习的经验做出判断。但是你看这个短语 " test a word" 认识吗?再看看开始那个单词“testaword”是不是就亲切多了?   

To Be Continued……

关于作者:严澜现成都创行负责人,历任上海创行科技技术总监。曾任中国平安平台开发工程师,腾讯拍拍网B2C架构工程师。Web3.0语义搜索引擎探索者,海量数据处理,互联网高性能低成本平台架构搭建实践者,构建让更多普通开发者快速掌握高性能技术的框架,自由机器人研发爱好者。

更多《问底》内容

  • 【问底】严澜:数据挖掘入门——分词

《问底》CSDN云计算频道新建栏目,以实践为本,分享新时代软件架构与研发。在含有“【问底】”字样标题的文章中,你可能会看到某个国外IT巨头的架构分享,也可能会看到国内资深工程师对某个技术的实践总结,更可能会看到一系列关于某个新技术的探索。但是在含有“【问底】”字样标题的文章中,你绝对不会看到对任何一个产品的宣传,以及一些带有目的性的趋势探讨。

同时,为了更好地进行技术与实践分享,《问底》邀请对技术具有独特/深刻见解的你一起打造一片只属于技术的天空,详情可邮件至zhonghao@csdn.net。


免费订阅“CSDN云计算(左)CSDN大数据(右)”微信公众号,实时掌握第一手云中消息,了解最新的大数据进展!

CSDN发布虚拟化、Docker、OpenStack、CloudStack、数据中心等相关云计算资讯,     分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、内存计算、流计算、机器学习和智能算法等相关大数据观点,提供云计算和大数据技术、平台、实践和产业信息等服务。                

如何将你的程序放在Windows启动中-Delphi资料 如何控制Ctrl+Alt+Del键-Delphi资料 如何控制壁纸-Delphi资料 如何控制关闭Windows-Delphi资料 如何屏蔽系统功能键-Delphi资料 如何取得Windows的临时文件目录?-Delphi资料 如何确保你的.exe文件仅运行一次!-Delphi资料 如何让 Windows 模拟按键-Delphi资料 如何让程式只执行一份?-Delphi资料 如何让程序只执行一次?-Delphi资料 如何删除一个控件的子控件-Delphi资料 如何识别显示器当前的分辨率-Delphi资料 如何为Delphi程序添加事件和事件处理器 如何写小执行程序-Delphi资料 如何隐藏桌面上的图标-Delphi资料 如何用API更改改计算机名字-Delphi资料 如何用Delphi映射网络驱动器? 如何在字符串截取中避免分割到半个汉字-Delphi资料 如何知道用户点击了窗口的最小化按钮?-Delphi资料 如何中断线程的执行-Delphi资料 如何终止一个线程-Delphi资料 如何转让控制权-Delphi资料 使用Delphi 4.0编写多线程 使用Delphi获取系列信息 使用DELPHI实现文本文件显示和声音同步播放 为系统菜单添加新菜单-Delphi资料 显示密码编辑框中的密码-Delphi资料 写小执行程序-Delphi资料 隐藏和显示Windows的任务条-Delphi资料 隐藏桌面上的图标-Delphi资料 用DELPHI编制Windows95下的钩子函数 关于《com本质论》和《com技术内幕》中的聚合问题? 雨下得好大!!!!! 如何打开一个Excel编后,马上执行一段初始化的代码? 请问有关于缓存的问题 请教高手,关于Actionscript问题 各位:在哪能下DVDdivx格式,当然要免费的,谢谢 Image报错,急切 老外常用到的一个词 : Project ,在中文里我们该如何理解这个词? ■■■■■■■■马甲的最后20分!■■■■■■■■ 非常急地问一下:installshield的问题!100分!不够加!!! 重庆考区,全国计算机3级什么时候可以拿证书呢???? 一个jsp页面里面是不是不能同时有两个scope分别为application和session的Bean??? 给个简单的例子好吗?treeView----------asp.net------VB 我的facade session bean中老是lookup 其他的EJBs 不成功? 这两句什么意思啊? 结识ASP高手,将来会有项目介绍!:) exchange server 2000 能装在xp上吗? 怎样使自己的程序被安装的时候安装上自己制作的字体?? 求助:帮小妹找份工作 有高手在吗?帮帮忙! 一个在ASP中很简单的问题 很想很想很想散分 预报天气如“叫床” 湖南性感女主持惹争议 Websnap中TEnduserSessionAdapter组件的TadapterField问题~~~~~~~~~~~~~~~~~~~~~~~~~~ 急!!帮我看段代码! 为何对话框程序加入RichEdit控件后不能运行? 想知道word.application的朋友请进: InstallShield Express Custom Editon for Delphi那里有下载? 请问vb.net和vc#能不能创建数组控件??? 请问vb.net和vc#能不能创建数组控件 请问一下,vc 写的 dll,使用postmessage给出一个消息到窗口,在 vb 中应该怎么样响应? 我想开发一个数据中间层但不知哪用.net ATL MFC 开发好,能给个建议吗? 寻求cs CD-key 文件名(很有些困惑!) 高手近来拿分,请教一个算法问题,共开三帖,每帖一百分。 在windows2000+delphi6+ado+access2000做的程序可以在windows98中用吗? 我想学门语言,现在哪种最有前途啊 一个免费的电影网站,不需要手机不需要花钱就能看电影 数据库存储一些记录后不能写入,数据库文件异样(BDE) 急问:这样的文件怎样导入数据库? 一个免费的电影网站,不需要手机不需要花钱就能看电影 IIS下配置php-4.3.2-Win总是不行??? 很多书上都有说jsp:useBean的scope属性的application,是指任何使用相同的application,这个相同是什么意思? 关于统计的问题 马甲识别诸法之我论(转贴) 弱弱地问一个问题。 如何用键盘弹钢琴? ASL是什么? how to 高考 装了win2003之后调试asp.net还要不要再装其它软件? 单姓与匈奴有关系没 磨练的近义词是什么 如何简单记的English我总是记不住 口碑好,天生聪慧,懂自我反省的动物 a为任意整数,证明:a(a+1)(2a+1)一定是6的倍数 五魔方这顶层棱只剩两个了,有没有直接复原这个的公式 口碑好,天生聪慧,懂自我反省!帮助猜一猜是什么动物 剑灵水月平原比武八卦牌怎么获得 一堂(这里填形容词,如:有趣、难忘······)的课,快,350到400字左右!快 口碑好,天生聪慧,懂自我反省!是什么生肖? 剑灵水月比武八卦怎么得 生活可以用什么课形容词 ≤口碑好,天生聪慧,懂自我反省!是指哪个生肖 剑灵力士水月平原比武八卦牌合什么属性好? 《闻王昌龄左迁龙标遥有此寄》中渲染凄凉气氛的诗句是? 蛤蟆表示数字是几 填动物叫声燕()雀()猴()羊()鸡()猪() 求数学集合的答案如题:集合A={x1,x2,x3,x4,x5},计算A中的二元子集两元素之和组成的集合B={3,4,5,6,7,8,9,10,11,13},求集合A. 巨型蝌蚪意味着什么?某山区溪流中,发现不变态的巨型蝌蚪,可推测,当地婴幼儿比其他地区患病机会增多的疾病是什么? 匈奴为什么在历史中消失了? 锻炼的近义词是什么 请问一般酒店,被子,床单脏了到哪里洗 剑灵最新的水月平原比武八卦牌用什么牌子用什么牌子能喂满暴击的最大值还有请问下对于灵剑来说升极限恶女有没有必要 我现在是极限万魂 填空题(按以下要求完成)log以2为底的0.7,log以3为底的10,log以0.2为底的1,log以0.4为底的0.4,用小于号连接 填空25增加它的15%是百分之几 100千克比125千克少百分之几 剑灵八卦坊合成水月平原名匠合成牌会赚钱吗?还有一个就是拍卖行里水月平原名匠合成牌同一张牌好像有五个.难道制作出来的每张八卦属性都不一样吗.最后一个问题,是水月平原工匠合成牌 认知英文怎么翻 口碑好,天生聪慧,懂自我犯省的动物,是什么动物 剑灵水月平原名匠八卦牌板如题,能开出8个牌子,但是无属性!,想知道,是不是用 合成牌8号,向上面打属性,比如用8个8号的暴击,打到1~8没属性的牌板上!是100%属性继承吗?还是那8个牌板有自己的 《钱塘江春行》中的名句能不能确定,一定,肯定,以及坚定的告诉我是那一句 百分比知识 一种奶糖,现价比原价降低了百分之十五( 15%) 表示原价的100分之15 你怎么看待匈奴对中原的威胁与它后来的消失? 家里长蘑菇代表什么 《说岳全传》读后感字越多越好,有能力的最好1000字,最少500,越多悬赏越高 匈奴在短暂的东方生活中,对中原汉王朝构成了怎样的强大的威胁快. 四、完成下面的填空题 看到这个说说感想. 伊娃?什么意思啊? 家里长蘑菇什么寓意 令蟾什么意思 两道应用题,商店有一种衣服,售价96元,比原来定价格便宜25%.现在的售价比原来定价格便宜多少元?一个弟形的面积是12平方CM,它的上低是3CM,下低是5CM,高是多少CM?《列方程解答》 家里木桩上长了好多这种蘑菇 这是什么蘑菇 叫什么? 100千克比50千克多1/2.叛断题.请说明一下原因. 我要读后感给我一篇读后感《童年的价值》200字 “思路”这个词的英文如题 敌敌畏的LD50是多少毫克每千克?(30.00分) A.30 B.40 C.50 D.100 磨砺的近义词是什么? 请完成下列填空题,一定要保证正确:一排电线杆,原来每2根之间的距离是30米,现在要改为45米,如果第1根不动,至少再隔( )米又有1根电线杆不用移动. 已知AB平行CD,写出角B于角D,角C的数量关系,并说明理由 求三阶移棱六色魔方最后一步公式白色底层跟黄色顶层拼好了 555 EAST怎么样 庆元旦的优美句子 我要几篇读后感伊索寓言的 安徒生童话全集的 西游记的 还有高尔基的童年的 EAST是什么产品 匈奴怎么消失的 我要读后感 急狼牙山五壮士 读后感要真情实感 EAST MANOR怎么样 若a为整数,试说明整式a(2a+1)-2a(a-1)的值一定是三的倍数若a为整数,试说明整式a(2a+1)-2a(a-1)的值一定是3的倍数 五魔方的还原公式最好有图和文字说明的... 怎么记英语比较简单我英语老是记不住,怎么办 卡梅伦为美监听辩护摩根大通花大钱了官司港澳记者将走访浙江产业集聚区聚焦去美国化:是否为世界多极化发展的大陆赠台大熊猫宝宝命名“圆仔” 成台葡萄牙数千民众游行抗议2014年预算李肇星谈钓鱼岛:中国没有一寸领土是多聂荣臻徐向前等人后代参观黄埔军校武汉聚焦去美国化:是否为世界多极化发展的2名百岁抗战老兵60年后再相逢 多方北京数万重卡深夜进城 排污量相当于百万达称楼市调控方向偏差 应保证居者有尿毒症少年进京求医续:母亲将提交捐肾华盛顿举行抗议活动要求停止“棱镜式”学者质疑机关事业单位建职业年金 或制老伯拍摄监督公车8年频遭恐吓 出现反北京药店卖奶粉首日调查:价格未见便宜长沙天心区将女教师调到拆迁指挥部 劝德国巴西牵头起草联大决议 呼吁保障网英媒体披露英国监听规模远超外界想象新疆人大党组开民主生活会 称落实决策巴西世界杯上的“100俱乐部”RQFII扩容提速 中长期利好A股法院院长 卧轨身亡申请签证小心弄巧成拙4年前买的别墅漏水按原价退?网友要少爷和张杰竞争“闰土”之称张翰年报亮相 *ST国恒或被暂停上市无证酒后驾车撞飞两桌客楼道堆满垃圾 何时有人清理?“甩脂”?当心反招振动病《本无》再登广现剧场好心人1.8万元捐赠款难顶每日近万元今起三伏天灸 省中医可贴药金价回调将成主流美股走强打压国际金价回落大S爱女眯眼大笑好萌有些女人不必多说苏联“末代”外长病逝精神污水阿里巴巴打假存地域歧视?神秘“白帽黑客”现身支付宝
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘