逆向最大匹配分词算法

By Jorbe 2014/03/13 计算机科学 No Comments

中文分词是所有中文信息处理的基础。在数据挖掘、搜索引擎、自然语言处理等领域都起着至关重要的作用。中文分词算法大概可以分为三类:正向最大匹配、逆向最大匹配以及基于统计概率模型的算法。这篇博文讲的就是逆向最大匹配分词算法。其实正向最大匹配和逆向最大匹配算法类似。逆向最大匹配算法虽然简单,但在处理一些语句上面还是不能准确地分词,后面会具体讲到。

逆向最大匹配分词算法:
事先设置一个k值,下面的程序k值设为5,然后从最后一个字开始向前截取k个字,先把这k个字和字典匹配,看能否找到匹配的词语,若不能,则剔除这k个字最左边的字,然后再把这k-1个字与字典匹配...一直到匹配成功,或者前k-1个字都没匹配成功,那就把第k个字当成一个独立的词,然后再向前移动分出来的词的长度,再截取k个字......一直到全部分好词为止。

Codes:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#!/usr/bin/env python

# -*- coding: utf-8 -*-

def get_k_words(text,i,k):

 if i+1<k:

     return text[0:i+1],i+1

 else:

     return text[i-(k-1):i+1],k

def segment_words(text,dict_words,k=5):

 seg_words=""

 i=len(text)-1

 while i>=0:

     tmp_words,length=get_k_words(text,i,k)

     tmp_len=0

     for j in range(length):

         if dict_words.has_key(tmp_words[j:length]):

             seg_words+=(tmp_words[j:length]+" ")

             tmp_len=length-j

             break

         if j==length-1 and not dict_words.has_key(tmp_words[j:length]):

             seg_words+=(tmp_words[j:length]+" ")

             tmp_len=length-j

     i=i-tmp_len

 return seg_words

################################################

if __name__=="__main__":

 text=u"我爱北京天安门"

 seg_words=""

 dict_words={u"爱":1,u"北京":1,u"天安门":1,u"研究":1,u"研究生":1,u"中国":1,u"国人":1,u"一件":1,u"面子":1,u"一个":1}

 seg_words=segment_words(text,dict_words)

 words_list=seg_words.strip().split()

 words_list.reverse()

 seg_words=" ".join(words_list)

 print seg_words.encode('utf-8')

输出:

下面就拿上面的例子一步一步来分析逆向最大匹配法是怎么来进行分词的。首先从后面开始截取k(这里是5)个字,如图

,然后把"北京天安门"五个字与字典匹配,字典中没有这个词,然后就去掉"北"字,把剩下的"京天安门"与字典匹配,字典中还是没有这个词,再去掉"京",然后再把"天安门"与字典匹配,发现匹配到了这个词,于是就把"天安门"划为一个词语,然后指针向前移动三个字,如图再截取k个字,这里因为就剩下4个字了,所以就截取4个字,把"我爱北京"与字典匹配,没成功,去掉"我",再把"爱北京"与字典匹配,还是没成功,再去掉"爱",然后发现"北京"匹配成功,把"北京"划为一个词语,再把指针向前移动两个字,......下面的我就不复述了,最后就剩下,所以再把"我"划为一个词。综上,最后的分词结果为:"我 爱  北京  天安门"。

前面讲到,逆向最大匹配算法虽然简单,但分词效果不是非常好。来看下面一个例子。假如要对"中国人真爱面子"这条语句进行分词。用上面的程序分好词的结果是:

。可以看到,它把"中国人"这个词分成了"中"和"国人"两个词。这样,这条语句读起来就不顺了。所以,现在的分词算法都不用逆向最大匹配或正向最大匹配,而是采用基于统计概率模型的分词算法。比如 maxent  或  CRF++ 等,这些算法通常都比较复杂,但是在分词效果上比逆向最大匹配和正向最大匹配好。

关于上面用到的例子,先说明一下,其实这个例子并不能解释逆向最大匹配分词算法的不准确性,因为,如果观察上面的代码里的字典就能发现,里面没有"中国人"这个词,要是有这个词的话,分词结果还是正确的。我这里举这个例子只是起一个抛砖引玉的效果。前面的代码也只是一个雏形,还存在着很多问题,比如,它不能实现对中英文语句进行分词,而且也没有词干提取方法。

逆向最大匹配分词算法相关推荐

  1. 逆向最大匹配分词算法C#

    逆向顺序 句子:大家好我叫XX我是一名程序员 程序员 -> 序员 -> 员 名程序 -> 程序 -> 序 一名程 -> 名程 -> 程 是一名 -> 一名 - ...

  2. java 最大分词算法_Java实现的最大匹配分词算法详解

    本文实例讲述了Java实现的最大匹配分词算法.分享给大家供大家参考,具体如下: 全文检索有两个重要的过程: 1分词 2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文 ...

  3. python最大分词_python正向最大匹配分词和逆向最大匹配分词的实例

    正向最大匹配 # -*- coding:utf-8 -*- CODEC='utf-8' def u(s, encoding): 'converted other encoding to unicode ...

  4. 逆向最大匹配分词RMM

    def getRSeg(text,lib_trie):if not text:return ''if len(text) == 1:return textif lib_trie.find(text): ...

  5. java中文分词算法

    package com.huawei.cloud.phone.platform.app.api.web.controller; import java.util.Arrays; import java ...

  6. 正向最大匹配中文分词算法

    中文分词一直都是中文自然语言处理领域的基础研究.目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率.而且不少中文分词软件支持Lucene扩展.但不管实现如何,目前而言的分 ...

  7. java 正向分词算法_正向最大匹配中文分词算法

    中文分词一直都是中文自然语言处理领域的基础研究.目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率.而且不少中文分词软件支持Lucene扩展.但不管实现如何,目前而言的分 ...

  8. java 字符串分词_Java实现的双向匹配分词算法示例

    本文实例讲述了Java实现的双向匹配分词算法.分享给大家供大家参考,具体如下: 目前比较流行的几大分词算法有:基于字符串匹配的分词方法.基于理解的分词方法和基于统计的分词方法.本文采用的是基于字符串匹 ...

  9. 搜索引擎设计实用教程(3)-以百度为例 之三:对百度分词算法的进一步分析

    中科院软件所 2005年11月 上面说过,经过分析得出百度的分词系统采用双向最大匹配分词,但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐,所以进一步进行分析,看看是否前 ...

最新文章

  1. 今天mtk笔试,没信心了
  2. 富士通台式电脑_英特尔X86架构霸权终将崩塌,ARM架构才是未来PC电脑市场的王者?...
  3. Apple 的CEO 吹响了战斗的号角啦!
  4. RPC 和 RESTful
  5. WinRAR 命令行简体中文说明
  6. Git的smart Checkout\force checkout\Don‘t Checkout的区别
  7. bloomberg用法 固定收益_干货 | 日语高考高频考点:助词を的用法
  8. springboot项目执行controller方法时进入慢的问题
  9. [leetcode-117]填充每个节点的下一个右侧节点指针 II
  10. SpringMVC之二:配置 Spring MVC
  11. 金山词霸2005开启后导致桌面刷新的问题
  12. 软考中级系统集成项目管理工程师视频教程
  13. mock server java_1分钟搭建极简mock server
  14. 【GlobalMapper精品教程】001:GlobalMapper23 Pro-x64中文安装教程(附软件包下载)
  15. 学校oj显示在线用户数超过了序列号允许。您需要购买或升级您的序列号
  16. 程序员的十一个层次,你感觉自己属于那一层?
  17. [组原]初识-地址总线,地址寄存器,存储单元,存储字长
  18. APP被应用商店下架了怎么办?
  19. 如何在面试中回答「你最大的缺点是什么」?
  20. 日语自我介绍 自己紹介・自己PR

热门文章

  1. 底部固定菜单_【悬浮菜单】安卓悬浮amp;手势助手
  2. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...
  3. Redis集群架构搭建详解
  4. linux平台的office文档转pdf的实例(程序员的菜)
  5. Visual Studio无法调试
  6. apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
  7. 【bzoj1034】[ZJOI2008]泡泡堂BNB 贪心
  8. push的时候 出现卡顿现象
  9. 在64位Windows7上安装64位Oracle11g
  10. sql datetime字段 取年月日_如何去写一手好的SQL ?