基于统计的中文词语提取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于统计的中文词语提取相关的知识,希望对你有一定的参考价值。
参考技术A因为公司使用基于词典的机械中文分词方法,需要一个完备的词典才能有好的效果。而关键词提取的效果又依赖于中文分词效果的好坏。所以开始的初衷是找出一些原始词典里没有的词,来改善中文分词的效果。后面做着做着,似乎词语提取的办法也可以用来做中文分词,只不过评价指标上当然要差很多。
这种方法采用n-gram 滑动取词并且统计频率,然后通过置信度等手段进行过滤筛选,从而得到我们需要的词。但是有的高频词片并非是一个词,如 “这一”、“然不”等。通过去除停用词再滑动统计的规则手段虽然得出的词这些明显看上去不是词的没怎么出现了,但是也会导致一些原来是词的被忽略,如 停用词 “的”可能存在 “的士”这样的词。而且这种改进规则的分词做法带来的准确率提升不明显,这种做法收益达不到预期。
这种做法根据上面的博客介绍似乎是比较可行的办法,而且也不用做停用词处理。有不少论文和博客都指向这种做法,特别是比较有影响力的开源项目 HanLP也用这种方法来做词语提取并且开源,可见这种做法有较好的效果,通过人民日报的标准分词数据评测得出达到80% 的准确率,实际使用的时候再通过一些优化可以达到更好的实用化效果。
基于左右邻字信息熵和互信息的抽词方法主要基于的一些技术点和算法有:
本次抽词从单词内部凝聚度和外部自由度角度进行候选字串的筛选,计算候选词串的互信息(指示了候选字串的内部凝聚度),计算候选字串的左右邻信息熵(指示了候选字串的外部自由度),通过互信息及 信息熵阈值过滤掉明显不符合要求的候选词串。在剩下的候选词串中通过归一化的手段得到他们的分数,最后通过分数从大到小排序,得出最终的抽词结果。
具体的抽词步骤:
比如原句子:“大众汽车CEO文德森12日宣布,未来五年大众汽车将向北美市场投资70亿美元
,力争使包括奥迪在内的品牌到2018年实现年产量100万辆的目标。”,处理完后
得到如上所示的八个候选短句。
如候选短句: 未来五年大众汽车将向北美市场投资
通过FMM 算法取词。设最大取词长度为5,得到以下54个候选词
计算信息熵主要用到的数据结构就是双数组字典树,通过字典树取到以当前字为前缀的一批词。为使得信息熵具有可对比性,当前候选词扩展一个字的算信息熵累计和,超过一个字的不算。算左邻字信息熵时,将候选字符串逆置是一个小小技巧。
信息熵计算:
如候选短句: 未来五年大众汽车将向北美市场投资
分为如下若干组:
大数据量的存储和计算问题,目前已经有成熟的大数据存储与计算开源方案来解决这类问题。但是有的实际情况下没有条件整那么多分布式集群机器,那可不可以在单机的情况下也解决一部分这样的问题,或者是缓解一些存储和计算的压力呢?答案是肯定的,一般单机的计算,在数据量和计算能力过剩的情况下,一般数据直接存内存,计算上也不要过多考虑。但是当内存空间存在瓶颈,这个时候就考虑采用外部存储的方式,但是又可以权衡io的时间消耗问题。为解决这部分问题,我采用了redis作为这样的外部存储系统,将计算的中间结果存在了redis中,利用了redis取数据常数时间复杂度的特性。存储的问题解决了,计算的问题一般是通过分治法的思想去做,一般我能够想到也可以有两种,一种是多进程,通过多个进程去分发任务,最后汇总计算结果。另一种是在一个进程里通过多线程的方式去加速计算,多线程的情况下并非越多线程越好,线程之间的切换带来了cpu的开销,但是在线程数量合理的情况下也是有一定的效果的。
Java语言多线程并发计算可以采用 线程池ThreadPoolExecutor+阻塞队列+栅栏CountDownLatch+原子类AtomicInteger这样的方案来做。基本的思路是把阻塞队列当成消息队列来用,把全量的数据生产进阻塞队列,通过多线程去队列里消费领取自己的计算任务,通过栅栏进行线程之间的协调和通信,等到所有线程执行完毕,然后汇总计算结果。
词汇与分词技术
中文分词主要分为三个流派:
机械式分词法(基于词典):
简单来说就是建立一个巨大的词典,然后将词典中的词语和文章中的词语相匹配,找到这个词语就算匹配成功,但是词典的完备性得不到保证。也就是文章中的有的词语在词典中找不到。
基于语法和规则的分词法:
分词的同时在句法语义方面进行分析,利用句法信息和语义信息进行词性标注,解决分词的歧义。
因为现在的语法句法还十分复杂,所以精度还不高。
基于统计的分词法
根据字符串在语料库中出现的统计频率来决定这是否是一个词语。
本文主要介绍ICTCLAS中文分词的来源与现状。
什么是词语和分词规范
有人做过一个测试,被测试的有三个人来自内地 三个人来自台湾,分词结果差异最大0.69最小0.89平均认同率0.76说明同是汉语使用者的分词标准有分歧
本书涉及的分词规范有两类:
第一类包括《北大(中科院)词性标注》、《现代汉语语料库加工规范---词语切分与词性标注》、《北京大学现代汉语语料库基本加工规范》三篇文章。
第二类为《宾州树库中文分词规范》,http://www.threedweb.cn/thread-1478-1-1.html下载
将汉语的词类主要分为13种:名词、动词、代词、形容词、数词、量词、副词、介词、连词、助词、语气词、叹词和象声词。
两种分词标准:
例如:浙江大学坐落在西湖旁边
粗粒度:浙江大学、坐落、在、西湖、旁边
细粒度:浙江、大学、坐落、在、西湖、旁边
粗粒度主要应用在自然语言处理的应用
细粒度主要应用在搜索引擎
机械分词方法采用自动分词词典中的词语从前往后匹配和从后往前匹配,这个方法没有考虑词汇上下文的相关性,准确度不高,不能满足高精度文本处理的需求。
这个机械分词的缺陷揭示一个重要规律:
也就是每个词语的出现是和前后上下文有关系的,但是上下文依赖关系不能考虑太远的词语,如果假设每个词语只和相邻的一个词语有关系,就提出了二元模型,一阶Markov链:
感觉51CTO要提供一个公式编辑器,不然这个还能不能好好写下去:
下面有个python实现二元模型的代码,代码我就不抄了,简单来说,几元模型就是和相邻的几个词语有关系。
https://www.2cto.com/net/201701/588278.html
分词中还要解决一个问题就是词语是不断更新的,词库里面是没有的,这个问题叫做未登录词识别:
基于半监督的条件随机场(semi-CRF)算法 对于处理不同领域的专名识别具有较低的成本和较好的效果。
https://www.zhihu.com/question/35866596
ICRCLAS汉语分词系统是由张华平博士于2002年设计开发的。。。。。历史我就不说了还是感谢作者张华平博士提供了这么好的系统,现在很多知名互联网公司都以这个算法为分词系统的核心算法。
hanLP分词模块的流程:
http://www.hankcs.com/nlp/python-calls-hanlp.html
Nshort算法原理
1、从此图中构建处节点和权重排序数组
2、从此图中过滤掉排序数组中权重较高的路径
http://www.xuebuyuan.com/743558.html
以上是关于基于统计的中文词语提取的主要内容,如果未能解决你的问题,请参考以下文章