最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的。

正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配。

首先我们可以规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到或者成为单字。

实例:

S1="计算语言学课程是三个课时" ,设定最大词长MaxLen = 5  ,S2= " "

字典中含有三个词:[计算语言学]、[课程]、[课时]

(1)S2="";S1不为空,从S1左边取出候选子串W="计算语言学";

(2)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/  ”,        并将W从S1中去掉,此时S1="课程是三个课时";

(3)S1不为空,于是从S1左边取出候选子串W="课程是三个";

(4)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程是三";

(5)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程是";

(6)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程"

(7)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/  课程/  ”,并        将W从S1中去掉,此时S1="是三个课时";

(8)S1不为空,于是从S1左边取出候选子串W="是三个课时";

(9)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三个课";

(10)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三个";

(11)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三"

(12)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是”,这时     W是单字,将W加入到S2中,S2=“计算语言学/  课程/  是/  ”,并将     W从S1中去掉,此时S1="三个课时";

(13)S1不为空,从S1左边取出候选子串W="三个课时";

(14)查词表,W不在词表中,将W最右边一个字去掉,得到W="三个课";

(15)查词表,W不在词表中,将W最右边一个字去掉,得到W="三个";

(16)查词表,W不在词表中,将W最右边一个字去掉,得到W=“三”,这时     W是单字,将W加入到S2中,S2=“计算语言学/  课程/  是/  三/  ”,并    将W从S1中去掉,此时S1="个课时";

(17)S1不为空,从S1左边取出候选子串W="个课时";

(18)查词表,W不在词表中,将W最右边一个字去掉,得到W="个课";

(19)查词表,W不在词表中,将W最右边一个字去掉,得到W=“个”,     这时W是单字,将W加入到S2中,S2=“计算语言学/  课程/  是/       三/  个/  ",并将W从S1中去掉,此时S1="课时";

(20)S1不为空,从S1左边取出候选子串W="课时";

(21)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/  课程/       是/  三/  个/  课时/  ",并将W从S1中去掉,此时S1=""。

(22)S1为空,输出S2作为分词结果,分词过程结束。

中文分词算法的Python实现:

脚本接受两个参数,一个是输入文件的路径,另一个是词典的路径。

它的运行方法如下:

python max-match.py

#!/usr/bin/env python

import cPickle as pickle

import sys

window_size=5

def max_match_segment(line, dic):

# write your code here

chars = line.decode("utf8")

words = []

idx = 0

while idx < len(chars):

matched = False

for i in xrange(window_size, 0, -1):

cand=chars[idx:idx+i].encode("utf8")

if cand in dic:

words.append(cand)

matched = True

break

if not matched:

i = 1

words.append(chars[idx].encode("utf8"))

idx += i

return words

if __name__=="__main__":

try:

fpi=open(sys.argv[1], "r")

except:

print >> sys.stderr, "failed to open file"

sys.exit(1)

try:

dic = pickle.load(open(sys.argv[2], "r"))

except:

print >> sys.stderr, "failed to load dict %s" % sys.argv[2]

sys.exit(1)

try:

fpo = open("out.txt","w")

except:

print >> sys.stderr, "failed to load out.txt"

sys.exit(1)

for line in fpi:

fpo.write("\t".join( max_match_segment(line.strip(), dic) ))

当然,这只是最基础的,还可以有很多高级的优化,比如说改成Trie树版本的,控制最大词长度的等等。

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...

Mmseg中文分词算法解析

Mmseg中文分词算法解析 @author linjiexing 开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project.使用场景涉及搜索 ...

分词 &vert; 双向匹配中文分词算法python实现

本次实验内容是基于词典的双向匹配算法的中文分词算法的实现.使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法. 算法描述正向最大匹配算法先设定扫描的窗口大小ma ...

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

分词算法设计中的几个基本原则: 1.颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”.“公安局 长” ...

MMSeg中文分词算法

Java中有一些开源的分词项目,比如:IK.Paoding.MMSEG4J等等.这里主要说的是MMSEG4J中使用的MMSeg算法.它的原文介绍在:http://technology.chtsai.o ...

中文分词算法工具hanlp源码解析

词图 词图指的是句子中所有词可能构成的图.如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B).一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图. 需要稀疏2维 ...

hanlp源码解析之中文分词算法详解

词图 词图指的是句子中所有词可能构成的图.如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B).一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图. 需要稀疏2维 ...

MMSEG 中文分词算法 翻译

算法原文位于:http://technology.chtsai.org/mmseg/ http://www.360doc.com/content/13/0217/15/11619026_2661428 ...

算法:二分查找(python版)

#!/usr/bin/env python #coding -*- utf:8 -*- #二分查找#时间复杂度O(logn)#一个时间常量O(1)将问题的规模缩小一半,则O(logn) import ...

随机推荐

Unity3D设计原则

原则1:单一职责 原则2:里氏替换原则(子类扩展但不改变父类功能) 原则3:依赖倒置原则 原则4:接口隔离原则 原则5:迪米特法则(最少知道原则) 原则6:开闭原则 原则1:单一职责原则 说到单一职责 ...

使用git将代码push到osc上

1.下载git客户端 2.在osc上创建项目 ①使用:git bash here ②在目录下执行:git init ③ssh-keygen -t rsa -C "xqs@gmail.com& ...

HDU 4049 Tourism Planning(动态规划)

Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

JS代码的加载

HTML页面中JS的加载原理:在加载HTML页面的时候,当浏览器遇到内嵌的JS代码时会停止处理页面,先执行JS代码,然后再继续解析和渲染页面.同样的情况也发生在外链的JS文件中,浏览器必须先花时间下载 ...

mac&lpar;osx&rpar; apache无法启动 localhost无法访问服务器&lbrack;&rsqb;

问题描述:由于删除了/private/var/log下面的日志,导致重启电脑后apache无法正常工作. 删除log的初衷是:当系统用久了,日志文件占据了几十个G的硬盘容量. 造成的后果:重启电脑后a ...

mybatis缓存创建过程

带着 上篇 的问题,再来看看mybatis的创建过程 1.从SqlSessionFactoryBuilder解析mybatis-config.xml开始 对文件流解析 XMLConfigBuilder ...

jquery 中ajax的参数

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

mvc设计模式的优点

软件设计的理念是:高内聚,低耦合.采用三层: UI:(jsp,servlet), service:(具体的业务实现), dao:(对数据库的操作) 的设计模式来指导项目开发可以使得项目各层之间是一个粗 ...

Mac idea 执行testng用例,提示&percnt;MODULE&lowbar;WORKING&lowbar;DIR&percnt;目录不存在解决办法

idea 下载git代码 执行testng用例,报错: 下午4:47 Error running 'Test.apkStart': Cannot start process, the working ...

springBoot bean注入

1.@Component:把普通pojo实例化到spring容器中,相当于配置文件中的 2.@Autow ...

中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)相关推荐

  1. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  2. apriori算法python代码_通俗易懂Apriori算法及Python实现

    本篇分为三个部分: 一.算法背景 啤酒与尿布故事: 某超市为增加销售量,提取出了他们超市所有的销售记录进行分析.在对这些小票数据进行分析时,发现男性顾客在购买婴儿尿片时,通常会顺便搭配带打啤酒来犒劳自 ...

  3. knn的python代码_《机器学习实战》之一:knn(python代码)

    数据 标称型和数值型 算法 归一化处理:防止数值较大的特征对距离产生较大影响 计算欧式距离:测试样本与训练集 排序:选取前k个距离,统计频数(出现次数)最多的类别 def classify0(inX, ...

  4. 牛顿法python代码_一文看懂牛顿法(附Python实现)

    这是一个数据分析师的在线笔试编程题:不能使用数学库函数,求出一个数的算术平方根 是不是看的一脸懵逼? 这里就需要用到一个很常用的求解方法了 -- 牛顿迭代法,也被称作牛顿法 (Newton's Met ...

  5. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  6. 牛逼的python代码_牛逼啊!一个随时随地写Python代码的神器

    现在学Python的人越来越多,很多小伙伴都非常有激情,利用碎片时间随时随地学习Python, 大家知道Python是一门编程语言,但是学语言光看不练是没有用的.最好能编程并运行,有没有什么好的神器可 ...

  7. a*算法matlab代码_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  8. 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

  9. slope one 推荐算法python 代码_协同推荐算法实践之Slope One的介绍(转)

    Slope One 之一 : 简单高效的协同过滤算法(转)(

最新文章

  1. Git 修改用户名和邮箱
  2. 多线程threading
  3. python 零基础学习之路-01 计算机硬件
  4. what should you do at the new arrival of the place
  5. 操作系统原理:读写者经典同步问题
  6. Android 使用SeekBar调节系统音量
  7. 超硬核!躺进BAT以后我总结了出现最多的15道数组题
  8. java连接数据库(sqlserver和mysql)
  9. “狮”口逃生!长颈鹿勇斗狮群 4小时后脱身
  10. linux笔记本风扇调节,Linux下笔记本的风扇控制问题
  11. 服务器装系统鼠标键盘不能动,装系统鼠标键盘不能动
  12. vivo手机支持html,vivo5G手机如何设置5G?教你开启SA模式
  13. 我的团长我的团第二十七集
  14. 第6章第1节:基本设计理论:幻灯片设计过程中的七个常见技巧 [PowerPoint精美幻灯片实战教程]
  15. webpack安装使用教程
  16. US1MF-ASEMI贴片快恢复二极管US1MF
  17. DECIMAL Data Type Characteristics
  18. 二阶线性微分方程解的结构(齐次与非齐次)+ 常数变易法 | 高阶微分方程(二)
  19. (198)ISE14.7生成bit文件压缩方法
  20. Jackson之JSON序列化和多态反序列化

热门文章

  1. sqlserver c#:关于CommandType的取值
  2. MySQL使用SQL语句修改表名
  3. 通讯录管理系统(cpp)
  4. 云队友丨“悟空”倒下,知乎难安
  5. source insight 破解版
  6. .misc 可爱的故事
  7. Jetson TX1开发笔记(一):开机设置与刷机
  8. 白话设计模式-模板方法模式
  9. 用c语言程序画圣诞树,【图片】用C语言画一棵“圣诞树”(前方高能,学渣小心避让!)【广西科技大学吧】_百度贴吧...
  10. [转载] 七龙珠第一部——第096话 克林大作战