NLP——分词之正向(逆向、双向)最大
来源:互联网 发布:网络单机一键端论坛 编辑:程序博客网 时间:2024/06/01 10:02
引言
自然语言处理(Natural Language Processing,NLP)一直是个研究的热点,随着神经网络(Neural Network,NN)的再次兴起,以及深度学习(Deep Learning,DL)的迅速发展,NLP也开始起飞。由于计算机只认识数字符号,对于英文、汉字这类“高级语言”计算机还没考过1级证书。就像一个婴儿,你喂他吃饭,不能一开始就喂一些高难度的食物嘛,扔给他一只龙虾。“朋友,自己剥开吃 - -!”,你只好喂一些粥啊什么的,而且得小口小口的喂,不然容易噎着或者流到衣服上,结果还不是你洗。而对于一句话(sentence)组成的基本单位就是字和词。想要对一句话进行编码成计算机能认识的话,则第一步就需要讲一句话按照语义切分成字和词,然后单独处理这些字和词就方便得多了。这个便是分词。分词的方法也很多,学习或接触到,我便会更新之这个系列,且写到哪儿是哪儿吧!
正向最大分词
如果叫成最长正向分词要更形象一些,是一种分治+贪婪的思想,并不一时处理全部串,而是分别处理预先设立长度的每一段,在每一段中求取最长的并且出现在字典里面的词。例如:
正向伪代码result = []right_seq = input_seqwhile True: select_seq,left_seq = get_select_seq(right_seq) seg_word,seg_word_right = selectMaxLenInDict(select_seq) result.append(seg_seq) right_seq = seg_word_right+left_seq if right_seq=="": breakdef selectMaxLenInDict(_seq): for idx in range(len(select_seq),1,-1): word = select_seq[0:idx] if word in dict: return word,select_seq[idx:] return select_seq[0:1],select_seq[1:]def get_seg_seq(_seq): if maxlen > len(_seq): return _seq,"" return _seq[0:maxlen],_seq[maxlen:]
逆向最大分词
有了正向最大分词,逆向就很好理解了,正向是从前向后选取最大长度的串,然后从选取串的尾部向前匹配字典词,删除右边的字符。逆向最大便是从后向前选取最大长度的串,从选取串开始向后匹配字典词,而删减的也便是左边的字符。
逆向伪代码result = []right_seq = input_seqwhile True: left_seq,select_seq = get_select_seq(right_seq) seg_word,seg_word_right = selectMaxLenInDict(select_seq) result.append(seg_seq) right_seq =left_seq+ seg_word_right if right_seq=="": breakdef selectMaxLenInDict(_seq): for idx in range(0,len(select_seq)): word = select_seq[idx:] if word in dict: return select_seq[0:idx],word return select_seq[0:-1],select_seq[-1]def get_seg_seq(_seq): if maxlen > len(_seq): return _seq,"" return _seq[0:maxlen],_seq[maxlen:]
双向最大分词
双向就是结合正向最大和逆向最大的结果,对两个结果进行比较,从而决定正确的分词方式,当前向和逆向分词数量不相等的时候,选择数量较少的那个分词结果。如果分词数量相同,则依次比较分词结果,相应位置如果分词相同,则选取为最后的结果中,如果相应位置分词结果不一样则选取字符较少的那个最为分词结果。
总结
正向、逆向、双向最大分词是最基本的分词方法,但分词准确性并不很高,常常是作为分词的Baseline使用。这类方法的实现比较简单,其中,可以利用字典树(Tire Tree)来实现,可参见:http://blog.csdn.net/yangyan19870319/article/details/6399871的实现方法。
参考文献
[1] http://blog.csdn.net/chenlei0630/article/details/40710325
[2] http://blog.csdn.net/wangliang_f/article/details/17527915
[3] http://hxraid.iteye.com/blog/618962
- NLP——分词之正向(逆向、双向)最大
- 自己动手写分词引擎——逆向最大、正向最大、双向最大分词算法的实现
- 中文分词 正向最大匹配法 逆向最大匹配法 双向最大匹配法
- NLP中文信息处理---正向最大匹配法分词
- python正向最大匹配分词和逆向最大匹配分词
- 中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析
- 中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析
- NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching
- 正向(逆向)最大匹配和最大概率法分词的错误分析
- 中文分词中的正向最大匹配与逆向最大匹配
- 用正向和逆向最大匹配算法进行中文分词(续)
- 深度解析中文分词器算法(最大正向/逆向匹配)
- 用正向和逆向最大匹配算法进行中文分词
- NLP之逆向最大匹配算法(BMM)
- 中文分词——正向最大匹配法
- 中文分词——正向最大匹配法
- NLP: 中文分词---正向匹配 (Forward Matching)
- 中文分词算法之最大正向匹配算法(Python版)
- ACM 1007. 二哥领工资(超大数加法) 本人拙见
- ACM 1021. 从前有座山(用机器判断,代替公式计算)
- NDK/JNI异常处理
- 2.1线性表类型的定义
- 神经网络学习博客
- NLP——分词之正向(逆向、双向)最大
- shell编程写计算器加减乘除(暨慕课Tony老师作业)
- 笨方法学Python 习题 29: 如果(if)
- Web报表系统葡萄城报表:交叉报表
- Post方式请求网络数据
- EventBus 事件总线之我的理解
- ArrayList源码解析(三)
- springboot学习笔记
- 如果你会oracle+mysql+java+hadoop