想知道自然语言处理分词时如何如何抉择正向最大匹配、逆向最大匹配和双向最大匹配

想知道自然语言处理分词时如何如何抉择正向最大匹配、逆向最大匹配和双向最大匹配,只能通过实验得到数据反推哪个更合适吗?有没有什么方式或者提前根据语料的性质来决定选择的方法?

首先我们要明白:正向最大匹配是采用从左到右的方式,从句子中抽取一个子串作为一块词;逆向最大匹配是采用从右到左的方式,从句子中抽取一个子串作为一块词;而双向最大匹配是采用正向最大匹配和逆向最大匹配的结合,从句子中抽取一个子串作为一块词。
那么自然语言处理分词时如何抉择呢?
对于自然语言处理分词,一般会根据语料的性质来决定使用哪种方法,例如,如果语料中有外来词,那么逆向最大匹配会是一个不错的选择;而如果语料中又很多词组,那么双向最大匹配可能会更加准确。也可以通过实验得到数据,来反推哪个更合适。
有没有什么方式或者提前根据语料的性质来决定选择的方法?
是的,我们可以根据语料的性质来决定使用哪种方法,例如,如果语料中包含大量外来词,那么逆向最大匹配会是一个不错的选择;另外,如果语料中包含很多词组,那么双向最大匹配可能会更加精准。

  • 这篇文章:正向最大匹配、逆向最大匹配与双向匹配算法实现 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: 【自然语言处理】分词工具与问答系统中的 正向最大匹配法思想: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 正如方法名称,正向表示对句子从左到右选择词典中最长的词条进行匹配,获得分词结果。

    • 1、统计分词词典,确定词典中最长词条的字符m;
    • 2、从左向右取待切分语句的m个字符作为匹配字段,查找词典,如果匹配成功,则作为一个切分后的词语,否则,去掉待匹配字符的最后一个继续查找词典,重复上述步骤直到切分出所有词语。
    dictA = ['南京','南京市', '南京市长', '市长' ,'长江大桥',  '大桥']
    
    maxDictA = max([len(word) for word in dictA])
    
    sentence = "南京市长江大桥"
    
    def cutA(sentence):
        result = []
        sentenceLen = len(sentence)
        n = 0
    
        while n < sentenceLen:
            matched = 0
            for i in range(maxDictA, 0, -1):
                piece = sentence[n:n+i]
                if piece in dictA:
                    result.append(piece)
                    matched = 1
                    n = n + i
                    break
            if not matched:
                result.append(sentence[n])
                n += 1
        return result