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

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

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 9系统截图大量曝光,一起来看看它长什么样! 腾讯李朝晖:不移动非互联,投资关注四大领域 【问底】Yao Yu:谈Twitter的百TB级Redis缓存实践 “OKCoin与你&#183;北京一夜”:共商比特币可持续繁荣之道 苹果再发力:推Apple Pay,或将引发新一轮支付变革 CausalImpact,谷歌开源的R时域因果关系分析工具 腾讯云总裁陈磊:互联网和传统企业互联网化是主线 不得不看,苹果Pay技术大起底! 详解Apple Pay:一大波iOS原生应用正在逼近! 高性能微信公众平台开发 【先锋】事务、高性能,王涛谈打造超越MongoDB的NoSQL 浅谈互联网数据中心海量运营之道 一篇文章读懂开源web引擎Crosswalk Facebook创建新开源组织TODO,Google、Twitter等继续捧场 微软明日将启动第二轮裁员 涉及所有的事业部 IBM推出Watson Analytics 将人机对话带进企业决策 参与2014中国移动开发者大调查 MDCC门票等你拿 手游开发经验谈:付费体系决定游戏收成好与坏? 惠普推出全新ProLiant Gen9服务器 腾讯安全出杀手锏 搭建全国最大Wi-Fi开放平台帮助网友免费蹭网 云与数据安全实践尽在ISC 2014(免费门票) 开源的对决,MapR将Apache Drill引入企业应用 令程序员费解的10个语言特性 走进雅虎北京全球研发中心:五年光阴缔造雅虎全球创新引擎 超强集成游戏编辑器!开源跨平台引擎Wave 求别再侵犯儿童隐私!FTC狠罚Yelp和TinyCo 华为应用市场助力开发者 软硬结合造就强大生态系统 【CTO俱乐部看板研修班北京站现场速递】看板方法:渐进变革的过程 《近匠》不背单词,用“沉浸”征服英语学习 ETpl——强复用、灵活、高性能的JavaScript模板引擎 MDCC 2014大会日程概览发布 最新嘉宾议题揭秘 经常在运行屏幕保护时VC6.0 就出现了运行错误 嘻嘻~`问同学借了一台数码相机回家,自已拍了几张房间里的照片.大家有兴趣的就去吧!小A房间大暴光 请众位大侠,能不能强烈的推荐一本关于Delphi入门级的经典著作!谢谢了!推荐者必有分 请教! 关于Win32下的字符串操作 菜鸟提问,估计大家都会,指点一下 为什么我用ie的时候,新打开一个页面,他的还原形式的大小总是最小化的? var oXL = new ActiveXObject("Excel.Application")这句话有什么问题? 高分求算法 如何根据IP来得的到对方的操作系统类型 怎么这么老套,大家想想办法啊! 我要学DirectX了,请大家帮忙找一些这方面的资料。 关于出错信息的问题,多谢指教! Csdn,为什么你现在不忙了! asp.net的优点到底在哪里 大家能否推荐几本无线应用方面的书(如:短信编程、WAP编程), 谢了! 最基本问题 哪位写过控制摄像头的例子, 如何使用XP的远程桌面管理?远程控制. float 5.29 显示出来会是什么? 要不要学c++ 不能保存文件了,怎么回事? CString的一个问 在vs,net中创建用户控件和组件有什么区别? Lotus Notes and Domino与LOTUS 1-2-3有什么差别? 问路 JBuilder中类找不到 Montaque,看到后请进,问题有点菜,但希望你尽快回答! 大家帮帮我啊谢谢 private的意义是什么呢? 这是怎么回事啊,经常遇到的问题 请问windows编程和windows网络编程哪种编译器最好 新手提问--初装redhat7.2问题多多 请问如何在iis中提供证书认证?急! ASP.NET能不能用记事本写?! ??如何获得在DataGrid控件中选中一条纪录的消息?? 在win2000上调试好的程序,为什么到了xp的iis下面关于access数据库写入的页就打不开了? 不通过键盘,不通过初始化,不用SetWindowText(),如何向一个编辑控制加字符串 maya里的动画如何渲染? 数据库中的超键是什么意思? 组件如何发布? 一个小问题(请斑竹不要删) 菜鸟提问:怎样才能在编程中把一个数据库生成一个HTML文件! long型能转换为int型么? datagrid中RadioButtonList被自动选择问题? c#中如何比较两个string的大小,如"AB">"AA" return * this 问题 急!!,我VC的一个库文件坏了! 现在真是失恋的季节,各位帮帮我,我是否该该怎么办? 在线等待WIN98操作系统下载的网址 关于模板特殊化的一些问题 蛇的牙齿有毒吗?蛇的牙齿有没毒!他的毒液是从牙齿里输出吗? 如果……如果……如果……造句,初中水平的 也字几笔画 想找一些英语的动画片,最好有剧本 初中水平的造句英语帮用英语各造3个句子too much too much much too 拥抱为题目的600字作文 有人知道美国动画片《新三只小猪》的英文剧本? 初中水平的英语造句!翻译下列词并造句1 ...the same as ...2 ...make ...do ...3 ...to take ...(period of time)4 ...to help do ...5 ...to help with ... 张老师把20000元钱存入银行,存期3年,年利率是5.00%.到期时有多少利息? 造句,有水平点幸福是贫穷中相濡以沫的一块糕饼,患难中心心相印的一个眼神.仿写这个句子 (假如)是月明风清的夜晚,人们的眼再尖利些,(就)可以看见有一只小船从苇塘里撑出来,在淀里,【像一片苇叶】,奔着东南去了.用假如.就.,还要比喻. 都字有几笔画 背面滑滑黑色,腹部黄色的小蛇是什么蛇,有毒么? 这个汉字对应的英文很少见,这句话英语怎么说? 口,字共有几笔画? 弟子规,圣人训 神学(包括上帝,佛,道)除了心理上(可以归类为心理学哲学)到底能不能给个人以实际的帮助 生物里“对照实验” 用英语怎么说如题.(我只要名词词组即可) 东阿拉伯语的朋友帮我看看这是什么意思 是否可以推荐一些神学、哲学、心理学的书籍?(与EVA挂钩的) 一篇英语作文(6句话就ok!是要有具体路线的!比如说什麽go along 之类的东西!从 学 校 回 家 的 路 线 哪位朋友帮我看看这两句阿拉伯语什么意思? 心理学和哲学,在学术上结合得紧密么?它们是怎么结合的? 小作文一篇,5,6句话,翻译成英文,My hobby 整样捉有毒的蛇要安全!能否再详细一点 英语翻译我有格朋友在国外,英语不好,请问有能直接翻译整句汉语的发音词典啊? 你有多少个球用英语怎么说 刚才抓了一条蛇,不知道是否有毒,请问是什么蛇? 为什么会要求具备这三种学问:哲学、心理学、金融学.而且重要性是这样依次排列的. I didn't see you last night.-- Oh.We ___ my uncle's home after supperA dropped by B showed up C hung out D gave in 请问一下这是什么蛇,在家里抓到的,有毒没毒? 1英汉双解高级词典是不是分别用英语和汉语解释一个英语单词2《中学英语语法》在市里的新华书店能买到吗 用境界造句请用这个词造句,要20个字以上,优美一点, 抓到条蛇, 中西方文化的矛盾以前喜欢中国古典文化,现再则更倾向於西方文化,注意:是倾向一些,更注重的还是中国文化,比如说:以前喜欢故宫类型的建筑,现再比较喜欢欧州建筑风格等等等等……… 问个很哲学的辩论题为什么有人劝导年轻人要有志向有理想而有些人又有劝导人要淡薄明志,莫为浮云遮望眼? 哪里有弟子规全文 "随便"的英语怎么说 有的像有的像有的像造句 高水平 弟子规 全文全文,尽量有翻译(谢谢) "我们离得好远"用英语怎么说 生活中有必要哲学辩论 ?两个都是哲学家,他们辩论,很正常.但是一个学哲学的,对他的孩子辩论老半天,对他妈,对朋友,有必要吗?毕竟别人不懂,也觉得没必要,我朋友他总是一个劲地说老半天的, 要弟子规的全文,坚决不要它的意思.有意思的不给分.好的多给. ,"一一对应"英语怎么说? 请推荐一本哲学方面的书····辩论的 《苏菲的世界》 中按顺序分别提到哪几个哲学家、谢谢哈~~ 最近家里老是爬蛇啊.而且都是小蛇 爬了大概有4 5 条小蛇了 到底是怎么回事啊 那些蛇能不能打啊真的很吓人啊 辩论赛哲学无大用应该怎么讲 苏菲的世界中苏菲和席德到底是怎么个关系啊?苏菲就只是席德的爸爸写的小说中的人物?席德的爸爸为什么那么神奇? 哪位知道蛇吃什么东西?家里喂养的小蛇.老鼠、麻雀、青蛙、昆虫我都没地方给它找去啊,我是说在家里有什么是它可以吃的? 哲学吧辩论大赛谁报名? 在《苏菲的世界》一书的最后,那本书已经结束了,为何还有关于苏菲与艾伯特的故事继续呢,请教作者是何用有没有比较权威的答案? 有哪些球?要写英文哦 张老师有10000元存银行2年,有2种方法:一存2年,年利率2.97%;一种是先存一年,年利率2.25%,到期再把本金税后利息合在一起再存一年.哪种方法利息多?税后利息合在一起再存一年.哪种方法利息多? 为什么蛇的牙齿会有毒?还是最毒的,而人为什么没有 现实生活与梦想中的生活有什么区别? 张老师把1万元存入银行,存期三年,年利率3.24 %.到期时,张老师共取回本金和锐后利息多少元? 请问这是什么蛇,有毒么,现在还是幼蛇,还没长牙,应该怎么饲养,喂些什么,现在小蛇不张嘴吃东西,应该怎么灌喂 认知和认识有什么区别? 以(让路)为题目的作文600字.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘