中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析

分词算法设计中的几个基本原则:

1、颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安局长”、“公安局长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好(当然前提是所使用的词典中有这个词)

2、切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者。

3、总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。

 

下面详细说说正向最大匹配法、逆向最大匹配法和双向最大匹配法具体是如何进行的:

先说说什么是最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。

下面以“我们在野生动物园玩”详细说明一下这几种匹配方法:

1、正向最大匹配法:

正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。

第1次:“我们在野生动物”,扫描7字词典,无

第2次:“我们在野生动”,扫描6字词典,无

。。。。

第6次:“我们”,扫描2字词典,有

扫描中止,输出第1个词为“我们”,去除第1个词后开始第2轮扫描,即:

第2轮扫描:

第1次:“在野生动物园玩”,扫描7字词典,无

第2次:“在野生动物园”,扫描6字词典,无

。。。。

第6次:“在野”,扫描2字词典,有

扫描中止,输出第2个词为“在野”,去除第2个词后开始第3轮扫描,即:

第3轮扫描:

第1次:“生动物园玩”,扫描5字词典,无

第2次:“生动物园”,扫描4字词典,无

第3次:“生动物”,扫描3字词典,无

第4次:“生动”,扫描2字词典,有

扫描中止,输出第3个词为“生动”,第4轮扫描,即:

第4轮扫描:

第1次:“物园玩”,扫描3字词典,无

第2次:“物园”,扫描2字词典,无

第3次:“物”,扫描1字词典,无

扫描中止,输出第4个词为“物”,非字典词数加1,开始第5轮扫描,即:

第5轮扫描:

第1次:“园玩”,扫描2字词典,无

第2次:“园”,扫描1字词典,有

扫描中止,输出第5个词为“园”,单字字典词数加1,开始第6轮扫描,即:

第6轮扫描:

第1次:“玩”,扫描1字字典词,有

扫描中止,输出第6个词为“玩”,单字字典词数加1,整体扫描结束。

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,单字字典词为2,非词典词为1。

2、逆向最大匹配法:

逆向即从后往前取词,其他逻辑和正向相同。即:

第1轮扫描:“在野生动物园玩”

第1次:“在野生动物园玩”,扫描7字词典,无

第2次:“野生动物园玩”,扫描6字词典,无

。。。。

第7次:“玩”,扫描1字词典,有

扫描中止,输出“玩”,单字字典词加1,开始第2轮扫描

第2轮扫描:“们在野生动物园”

第1次:“们在野生动物园”,扫描7字词典,无

第2次:“在野生动物园”,扫描6字词典,无

第3次:“野生动物园”,扫描5字词典,有

扫描中止,输出“野生动物园”,开始第3轮扫描

第3轮扫描:“我们在”

第1次:“我们在”,扫描3字词典,无

第2次:“们在”,扫描2字词典,无

第3次:“在”,扫描1字词典,有

扫描中止,输出“在”,单字字典词加1,开始第4轮扫描

第4轮扫描:“我们”

第1次:“我们”,扫描2字词典,有

扫描中止,输出“我们”,整体扫描结束。

逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,单字字典词为2,非词典词为0。

3、双向最大匹配法:

正向最大匹配法和逆向最大匹配法,都有其局限性,我举得例子是正向最大匹配法局限性的例子,逆向也同样存在(如:长春药店,逆向切分为“长/春药店”),因此有人又提出了双向最大匹配法,双向最大匹配法。即,两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

如:“我们在野生动物园玩”

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,两字词3个,单字字典词为2,非词典词为1。

逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,五字词1个,两字词1个,单字字典词为2,非词典词为0。

非字典词:正向(1)>逆向(0)(越少越好)

单字字典词:正向(2)=逆向(2)(越少越好)

总词数:正向(6)>逆向(4)(越少越好)

因此最终输出为逆向结果。

[原文:http://blog.sina.com.cn/s/blog_53daccf401011t74.html]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向匹配的Python实例: ```python def cut(sentence): # 正向最大匹配 def forward_max_match(sentence, dictionary): max_len = max(len(word) for word in dictionary) words = [] i = 0 while i < len(sentence): for j in range(max_len, 0, -1): if i + j <= len(sentence): word = sentence[i:i+j] if word in dictionary: words.append(word) i += j break else: j = 1 words.append(sentence[i]) i += j return words # 逆向最大匹配 def backward_max_match(sentence, dictionary): max_len = max(len(word) for word in dictionary) words = [] i = len(sentence) - 1 while i >= 0: for j in range(max_len, 0, -1): if i - j + 1 >= 0: word = sentence[i-j+1:i+1] if word in dictionary: words.insert(0, word) i -= j break else: j = 1 words.insert(0, sentence[i]) i -= j return words # 双向最大匹配 dictionary = set(['北京', '大学', '生命', '科学']) forward_words = forward_max_match(sentence, dictionary) backward_words = backward_max_match(sentence, dictionary) if len(forward_words) < len(backward_words): return forward_words elif len(forward_words) > len(backward_words): return backward_words else: forward_score = sum(len(word) for word in forward_words) backward_score = sum(len(word) for word in backward_words) if forward_score < backward_score: return forward_words else: return backward_words ``` 正向最大匹配正向最大匹配是从左到右扫描待分词文本,将其与词典中的最长词匹配,若匹配成功则将该词作为一个词输出,若匹配不成功则将文本中的一个字作为一个词输出,并从该字的下一个字开始继续匹配逆向最大匹配逆向最大匹配是从右到左扫描待分词文本,将其与词典中的最长词匹配,若匹配成功则将该词作为一个词输出,若匹配不成功则将文本中的一个字作为一个词输出,并从该字的前一个字开始继续匹配双向最大匹配双向最大匹配是将正向最大匹配逆向最大匹配结合起来,先进行正向最大匹配,再进行逆向最大匹配,最后根据匹配结果的长和得分来确定最终的切分结果。 分词的优劣: 正向最大匹配逆向最大匹配的优点是简单、高效,缺点是容易出现歧义,对于新词难以处理。 双向最大匹配的优点是可以减少歧义,对于新词也有一定的处理能力,缺点是需要进行两次匹配,效率较低。 在实际应用中,可以根据需要选择不同的分词,也可以使用多种算结合起来,以达到更好的分词效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值