当前位置:   article > 正文

NLP——分词之正向(逆向、双向)最大_nlp正向与逆向关键词分析

nlp正向与逆向关键词分析

引言

自然语言处理(Natural Language Processing,NLP)一直是个研究的热点,随着神经网络(Neural Network,NN)的再次兴起,以及深度学习(Deep Learning,DL)的迅速发展,NLP也开始起飞。由于计算机只认识数字符号,对于英文、汉字这类“高级语言”计算机还没考过1级证书。就像一个婴儿,你喂他吃饭,不能一开始就喂一些高难度的食物嘛,扔给他一只龙虾。“朋友,自己剥开吃 - -!”,你只好喂一些粥啊什么的,而且得小口小口的喂,不然容易噎着或者流到衣服上,结果还不是你洗。而对于一句话(sentence)组成的基本单位就是字和词。想要对一句话进行编码成计算机能认识的话,则第一步就需要讲一句话按照语义切分成字和词,然后单独处理这些字和词就方便得多了。这个便是分词。分词的方法也很多,学习或接触到,我便会更新之这个系列,且写到哪儿是哪儿吧!

正向最大分词

如果叫成最长正向分词要更形象一些,是一种分治+贪婪的思想,并不一时处理全部串,而是分别处理预先设立长度的每一段,在每一段中求取最长的并且出现在字典里面的词。例如:abcdef,预先设立的最大长度为3。所以,先从串的开始截取长度为三的子串,即abc,如果abc出现在字典中,那么abc将作为分词结果,接着以相同方式处理def;如果abc没出现在字典里面,则从右边减少一个字符,再次匹配字典,即ab匹配,减少的字符将加入之前未选择的字符集里面作下一次匹配,这里是cdef,如果一个串没匹配到长度大于1的字典词,则返回最左边的字符作为该串的分词结果,也就是ab如果没有匹配到,无论<script type="math/tex" id="MathJax-Element-1321">a</script>是否在字典中,都将作为分词结果。过程如图:

这里写图片描述

正向伪代码
result = []
right_seq = input_seq
while 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=="":
        break

def 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:]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

逆向最大分词

有了正向最大分词,逆向就很好理解了,正向是从前向后选取最大长度的串,然后从选取串的尾部向前匹配字典词,删除右边的字符。逆向最大便是从后向前选取最大长度的串,从选取串开始向后匹配字典词,而删减的也便是左边的字符。

逆向伪代码
result = []
right_seq = input_seq
while 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=="":
        break

def 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:]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

双向最大分词

双向就是结合正向最大和逆向最大的结果,对两个结果进行比较,从而决定正确的分词方式,当前向和逆向分词数量不相等的时候,选择数量较少的那个分词结果。如果分词数量相同,则依次比较分词结果,相应位置如果分词相同,则选取为最后的结果中,如果相应位置分词结果不一样则选取字符较少的那个最为分词结果。

总结

正向、逆向、双向最大分词是最基本的分词方法,但分词准确性并不很高,常常是作为分词的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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/804598
推荐阅读
相关标签
  

闽ICP备14008679号