深入浅出不可思议的中文分词技术
亲爱的喵喵们,明天小夕就正式开学啦。开学后每周有几天的课比较多,小夕为了保证每篇文章的质量,可能做不到每天一更啦。但是小夕也会尽量挤出时间来写文章,尽量保证两三天更一篇。希望不要责怪小夕哦...
分词,也叫切词,即通过某种方式将句子中的每个词语识别并切分开来。分词技术不仅仅适用于中文哦,对于日文、韩文等语言也同样适用。在某些特殊场景如手写识别,自带分词属性的英语会因连字而变得分词界限模糊,此时也是需要靠分词技术解决的。
其实呢,分词技术,想一下的话会觉得很难,再想一下又会觉得简单,再思考细节又觉得很难。真正研究起来又会发现很简单QAQ。
难
一开始觉得难是因为没有想到“词典”这个好东西。没有词典的话,好像从那么多计算机看起来长得一样的文字中切成一个个的词是不可思议的(在计算机看来,每个字都是一串01)。
简单
然而想到了词典,就觉得容易啦。直接从一个句子的开头第一个开始,然后查词典不就好啦~比如“我是机智的小夕”,查词典时发现没有“我是”这个词,于是在“我”和“是”之间画一道线。
然后再查“是机”,发现也没有。于是在“是”和“机”之间也划一道。
再查“机智”,诶?有了!于是再查“机智的”,发现没有这个词。那就在“机智”和“的”之间划一道!
假如词典很智能,也能收录人名。于是“我|是|机智|的|小夕”就完成啦~
难
然而问题来了。如果采用查字典的办法,“发展中国家”会怎样分呢?显然从左到右查字典后会变成这样“发展|中国|家”。这显然是不对的呀。(敢说不知道“发展|中|国家”,小夕打你哦)
再仔细一想,好像这种情况非常多。
怎么解决呢?有人说那就从右往左,有人说那就从中间往两头,也有语言学家开始试图编写文法规则。
但是问题难度爆炸了,各种天马行空的改良效果都很一般。
简单
直到某个大师将统计语言模型用在了分词技术上!
那么什么是统计语言模型呢?
统计语言模型其实就是通过计算一个条件概率链来计算出一个句子出现的概率,并将概率的大小抽象为这个句子的得分。出现概率越大的句子,得分越高,句子越正常。反之得分低的句子越不正常,或者说人类一般不会表达这样的句子。
比如“的那问树你发可非受的”这个乱打的句子,利用统计语言模型,可以计算出这个句子的得分非常低,说明这是个不正常的句子。而“今天天气怎么样”这个句子的得分就会非常高。
高能部分
怎么做到计算句子得分/概率的呢?
假设一个句子有n个基元(基元即句子的组成单位,有时可以认为是字,有时认为是词,有时是短语等),该句子就可以表示为w1w2w3…wn ,则该句子的概率就等于
P=p(w1)p(w2|w1)p(w3|w1w2)…p(wn|w1w2…wn-1)
这个公式的意思就是:(第一个词w1出现的概率)*(当第一个词w1出现时,出现第二个词w2的概率)*(前两个出现的词分别是w1,w2时,出现w3的概率)*…
然而这个概率的计算代价实在太大了,计算最后一个词的出现概率时要考虑之前所有的词已经出现的历史。除了计算代价外,还会带来一些其他问题,因此我们可以限定参考的历史词的数量,来近似句子的概率。比如我们限定为1,此时句子的概率等于
P=p(w1)p(w2|w1)p(w3|w2)…p(wn|wn-1)
这条概率链就是随机过程中讲的一阶马尔可夫链。看,这样是不是计算量少多啦?此时的语言模型被称为2-gram模型。
同理,若将历史词的数量限定为2,则句子的概率就是二阶马尔可夫链,此时的语言模型被称为3-gram模型。
若完全不考虑历史词,则此时句子概率计算的考虑就成了基元相互独立的情况了,此时称为1-gram模型。此时的概率
P=p(w1)p(w2)p(w3)…p(wn)
经过小夕的精彩讲解依然没有理解统计语言模型的喵喵可以求助wiki或者查询“自然语言处理”或“信息检索”领域的相关书籍哦。
基于统计语言模型的分词方法有很多种,小夕在这里只讲一种最容易理解的思路。
首先,每个词(基元)出现的概率不是凭空就知道的,往往是通过大量样本从统计方法(别看成统计学习!这里跟机器学习没有半毛钱关系!)近似得到的。
比如,我们手头有人民日报的最近十年的报纸,然后我们把其中所有的句子存在电脑里作为我们的语料库。
然后我们通过某种比较low的不需要语言模型的方法,比如前面提到的查字典的方法,来对人民日报大语料库进行分词(一种效果比较好的方法是后向匹配,即从每个句子的末尾开始往前查字典。且更长的词能匹配到,就放弃已查到的短词)。
可想而知,很多句子都分词分得不对,但是这不影响我们统计每个词出现的概率。当语料库足够大时,那些被分错的词的影响就近乎忽略了。(不理解的喵喵请补概率论的大数定理)
于是我们从语料库中得到了每个词的出现次数,然后除以语料库中所有的词,即得到每个词的出现概率。因此很容易理解,对于“女生”这个词的出现概率会非常大,而对于“嘎玛”这个奇怪的词的出现概率会非常小。单独出现一个“猫”的概率非常大,而单独出现一个“生”的概率会非常小。
基于上面得到的每个词的出现概率,我们计算“北京大学生”的正确分词结果。
我们首先列举出其所有的分词可能性,比如
“北|京大|学|生”;
“北|京|大|学|生”;
“北京|大|学生”;
“北京|大学|生”;
“北京大学|生”等~
小夕不一一列举啦。
然后利用统计语言模型计算每个分词结果的得分。此时小夕为了讲解方便,设语言模型为前面高能部分中的1-gram模型,此时每个句子的得分即每个词出现的概率的乘积(无需考虑条件概率)。而刚才讲了,我们已经从语料库中得到了每个词出现的概率。
于是一经计算,妖怪就原形毕露啦~比如“北|京大|学|生”的概率会非常低,因为单独出现“北“,单独出现“京大”、“学”、“生”这些词的概率都非常小,所以乘起来的结果自然就很小啦~所以这个句子的得分很低。
同样的道理,对于“北京|大学生”这个句子,得分就会很高。因为“北京”的出现概率很大,“大学生”的概率也很大。而“北京大学|生”这种分法的话,虽然“北京大学”的概率比较大,但单独一个“生”的概率很小,乘起来之后会比“北京|大学生”的值小很多!所以“北京大学|生”被干掉咯。
所以,最终得分最高的句子,也就是出现概率最大的句子,自然是“北京|大学生”啦~
完!美!收!工!
最后感谢一位喵喵提醒小夕的转账二维码太小导致有的手机扫不出QAQ,小夕将二维码放大啦。你们的支持是小夕写出精彩文章的动力哦~
深入浅出不可思议的中文分词技术相关推荐
- 词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法
词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法 Type真是太帅了 于 2018-12-31 13:20:07 发布 1930 收藏 1 分类专栏: 编程 版权 编程 专栏收录该内容 15 ...
- NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...
- 中文分词技术比较:单字切分 vs 中文分词
全文信息检索系统中,创建倒排索引时应当使用什么分词方式一直是众说纷纭,毫无定论. 具我所知,已有某某 paper "研究指出"采用二元切分的方式构建索引是"最好的& ...
- 【原创】NLP中的中文分词技术
NLP中的中文分词技术 作者:mjs (360电商技术组) 随着需求的变化和技术的发展,互联网企业对数据的分析越来越深入,尤其是自然语言处理处理领域,近几年,在搜索引擎.数据挖掘.推荐系统等应用方 ...
- 基于垃圾短信与垃圾邮件的检测以及iphone中siri所使用的IKAnalyzer中文分词技术
刚开始接触安卓开发,导师就让做了一个基于安卓的垃圾短信检测软件,其中中文分词让我搞了一天,我所使用的是IKAnalyzer中文分词技术,这个包已经很是成熟.因为新手在使用中可能会出现导入的工程包错误而 ...
- PHP做中文分词技术
今天做了个中文分词技术,觉得好用,分享给大家试试好用吗,我用的是ThinkPHP3.2.3框架做的,不知道大家喜欢用这个框架不. 步骤如下: 1:下载scws官方提供的类,地址是讯搜官网的 2:下载X ...
- 中文分词技术之基于规则分词
中文分词技术之基于规则分词 基于规则分词的基本思想 正向最大匹配法 逆向最大匹配法 双向最大匹配法 总结 词是中文语言理解中最小的能独立运用的语言单位.中文的词与词之间没有明显分隔标志,因此在分词技术 ...
- NLP词法分析(一):中文分词技术
文分词介绍 中文分词相较于英文分词要难许多,因为英文本身就是由单词与空格组成的,而中文则是由独立的字组成的,但同时语义却是有词来表达的.因此对于中文的分析与研究,首先应寻找合适的方法进行分词.现有的中 ...
- NLP|中文分词技术及应用
摘要:中文分词是中文信息处理的重要基础,本文详细阐述了目前主要的几种中文分词算法的技术原理 .中文分词目前的瓶颈和评价准则,以及中文分词的具体应用. 中文分词指将一个汉字序列切分成一个个单独的词.现有 ...
最新文章
- clouderamanager-server启动,log日志中说需要mysql驱动的解决办法
- [攻防世界 pwn]——time_formatter(内涵peak小知识)
- c++ template(9)trait和Policy
- java 判断是否包含中文_Java 判断字符串是否包含中文正则表达式
- 在Visual Studio 2015中使用Grunt、Bowe
- python3字典详解_Python3实现的字典遍历操作详解
- shell while循环
- [LTE 资源分配方法]资源池 resource pools
- cpp调用c头文件引用方法
- CCKS-2017行业知识图谱构建与应用-上篇
- 【牛腩】-母版图片不显示问题
- 编程语言python这个词怎么翻译_五大理由从 Python 转到 Go 语言【已翻译100%】...
- blackbox_exporter端口及网络监控
- 51单片机(四).C51编程语言
- python怎么测试函数_快学Python:如何测试函数与类
- 【考研复试】计算机相关专业面试英语自我介绍范文(一)
- vb python excel_震惊!当Python遇到Excel后,将开启你的认知虫洞
- HDFS千万级别文件数/PB规模量级的数据迁移实战总结
- 一个屌丝程序猿的人生(一百)
- C语言从指针入门到指针进阶
热门文章
- 物联网是互联网发展的必然趋势吗?
- 面试常见的C语言字符串操作
- 危难时刻,每个人都应该站出来
- 检测ARM板的RTC
- TRACE (VC)
- 语音处理入门——语音的声学处理
- 全国计算机等级考试暨南大学,9月暨南大学计算机等级考试报名时间通知
- python cx_oracle配置_python连接oracle的模块cx_Oracle安装和配置
- Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL
- Web框架——Flask系列之综合案例——图书管理系统(十)