发布网友 发布时间:2022-10-06 03:29
共1个回答
热心网友 时间:2023-10-21 19:36
因为公司使用基于词典的机械中文分词方法,需要一个完备的词典才能有好的效果。而关键词提取的效果又依赖于中文分词效果的好坏。所以开始的初衷是找出一些原始词典里没有的词,来改善中文分词的效果。后面做着做着,似乎词语提取的办法也可以用来做中文分词,只不过评价指标上当然要差很多。
这种方法采用n-gram 滑动取词并且统计频率,然后通过置信度等手段进行过滤筛选,从而得到我们需要的词。但是有的高频词片并非是一个词,如 “这一”、“然不”等。通过去除停用词再滑动统计的规则手段虽然得出的词这些明显看上去不是词的没怎么出现了,但是也会导致一些原来是词的被忽略,如 停用词 “的”可能存在 “的士”这样的词。而且这种改进规则的分词做法带来的准确率提升不明显,这种做法收益达不到预期。
这种做法根据上面的博客介绍似乎是比较可行的办法,而且也不用做停用词处理。有不少论文和博客都指向这种做法,特别是比较有影响力的开源项目 HanLP也用这种方法来做词语提取并且开源,可见这种做法有较好的效果,通过人民日报的标准分词数据评测得出达到80% 的准确率,实际使用的时候再通过一些优化可以达到更好的实用化效果。
基于左右邻字信息熵和互信息的抽词方法主要基于的一些技术点和算法有:
本次抽词从单词内部凝聚度和外部自由度角度进行候选字串的筛选,计算候选词串的互信息(指示了候选字串的内部凝聚度),计算候选字串的左右邻信息熵(指示了候选字串的外部自由度),通过互信息及 信息熵阈值过滤掉明显不符合要求的候选词串。在剩下的候选词串中通过归一化的手段得到他们的分数,最后通过分数从大到小排序,得出最终的抽词结果。
具体的抽词步骤:
比如原句子:“大众汽车CEO文德森12日宣布,未来五年大众汽车将向北美市场投资70亿美元
,力争使包括奥迪在内的品牌到2018年实现年产量100万辆的目标。”,处理完后
得到如上所示的八个候选短句。
如候选短句:未来五年大众汽车将向北美市场投资
通过FMM 算法取词。设最大取词长度为5,得到以下54个候选词
计算信息熵主要用到的数据结构就是双数组字典树,通过字典树取到以当前字为前缀的一批词。为使得信息熵具有可对比性,当前候选词扩展一个字的算信息熵累计和,超过一个字的不算。算左邻字信息熵时,将候选字符串逆置是一个小小技巧。
信息熵计算:
如候选短句:未来五年大众汽车将向北美市场投资
分为如下若干组:
大数据量的存储和计算问题,目前已经有成熟的大数据存储与计算开源方案来解决这类问题。但是有的实际情况下没有条件整那么多分布式集群机器,那可不可以在单机的情况下也解决一部分这样的问题,或者是缓解一些存储和计算的压力呢?答案是肯定的,一般单机的计算,在数据量和计算能力过剩的情况下,一般数据直接存内存,计算上也不要过多考虑。但是当内存空间存在瓶颈,这个时候就考虑采用外部存储的方式,但是又可以权衡io的时间消耗问题。为解决这部分问题,我采用了redis作为这样的外部存储系统,将计算的中间结果存在了redis中,利用了redis取数据常数时间复杂度的特性。存储的问题解决了,计算的问题一般是通过分治法的思想去做,一般我能够想到也可以有两种,一种是多进程,通过多个进程去分发任务,最后汇总计算结果。另一种是在一个进程里通过多线程的方式去加速计算,多线程的情况下并非越多线程越好,线程之间的切换带来了cpu的开销,但是在线程数量合理的情况下也是有一定的效果的。
Java语言多线程并发计算可以采用 线程池ThreadPoolExecutor+阻塞队列+栅栏CountDownLatch+原子类AtomicInteger这样的方案来做。基本的思路是把阻塞队列当成消息队列来用,把全量的数据生产进阻塞队列,通过多线程去队列里消费领取自己的计算任务,通过栅栏进行线程之间的协调和通信,等到所有线程执行完毕,然后汇总计算结果。