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

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

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

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

实例:

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树版本的,控制最大词长度的等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea jar包导入_IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)

下面介绍一下IDEA的一个能显著提升写代码效率的非常好用的功能设置—— Auto ImportAuto Import的功能是可以帮助我们自动删除无用的包Import(未被引用)&#xff0c;以及自动Import填充尚未导入的包。完全智能化地帮助我们在开发程序时&#xff0c;省略了导包的操作&#xff0c…

scanner java重新输入_如何使用Scanner Java重复读取用户输入

我正在尝试为我的程序创建一个简单的菜单来读取用户输入.这是代码&#xff1a;public void menu() {String command;System.out.println("To operate with words write: a");System.out.println("To operate with products write: b");System.out.print(&q…

@value 数组_为什么不推荐用for...in遍历数组

&#xff08;一&#xff09;for...in引发的一个报错两年前写的一个文章目录生成插件vue-outline&#xff0c;一直用着没出啥问题&#xff08;本站的文章目录也是用该插件生成的&#xff09;。但是最近一个网友在使用的时候却出现了异常报错&#xff0c;异常代码使用了一个for..…

mysql 插入字符串_mysql插入数据字符错误

Incorrect string value: \xF0\x9F... for column XXX at row 1这个问题&#xff0c;原因是UTF-8编码有可能是两个、三个、四个字节。Emoji表情或者某些特殊字符是4个字节&#xff0c;而Mysql的utf8编码最多3个字节&#xff0c;所以数据插不进去。我的解决方案是这样的[mysqld]…

python启动方法_python进程开启的两种方式

一、进程 1.1、方式一 from multiprocessing import Process import time #方式一 def task(name): print(f"my name is {name},启动时间") time.sleep(2) print(f"my name is {name},停止时间") if __name__ __main__: # 1 创建一个对象 p Process(targ…

mysql存储函数 cursor_MySQL的存储过程写法和“Cursor”的使用

MySQL的存储过程写法和“Cursor”的使用2008-03-11eNet&Ciweek本文中介绍了一个MySQL的存储过程&#xff0c;其中涉及Cursor的使用&#xff0c;示例如下&#xff1a;CREATE PROCEDURE justifyGroupNum()NOT DETERMINISTICSQL SECURITY DEFINERCOMMENT BEGIN/*how to run:ca…

python网页开发好用吗_推荐用于Web开发的最好 Python 框架

Python 是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的&#xff0c;并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外&#xff0c;Python标准 库也是值得大家称赞的&#xff0c;Python甚至还自带服务器。其它方面&#xff0c;Python拥有足够…

mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离

摘要&#xff1a;这篇MySQL栏目下的“详解如何利用amoeba(变形虫)实现mysql数据库读写分离”&#xff0c;介绍的技术点是“MySQL数据库、数据库读写分离、amoeba、MySQL、读写分离、数据库”&#xff0c;希望对大家开发技术学习和问题解决有帮助。关于mysql的读写分离架构有很多…

python位运算符_NumPy按位运算符解析和实例详解

本文概述 Numpy提供以下按位运算符。 SN Operator Description 1 bitwise_and 它用于计算相应数组元素之间的按位运算。 2 bitwise_or 它用于计算相应数组元素之间的按位运算。 3 invert 它用于计算按位而不是数组元素的运算。 4 left_shift 它用于将元素的二进制表示形式的位向…

bind blz mysql_MySQ DBAL重点剖析课程 企业级MySQL系统安全与DBA运维日常事务管理 运维DBA必备宝典...

MySQ DBAL重点剖析课程 企业级MySQL系统安全与DBA运维日常事务管理 运维DBA必备宝典本资源由JAD资源网收集整理丨www.jiuandun.com资源简介MySQ DBAL重点剖析课程&#xff0c;课程的重点在于企业级MySQL系统安全实战&#xff0c;和MySQL DBA运维的日常事务管理&#xff0c;也就…

怎样解决外键约束_《设计心理学》|找寻“设计师”所遇的真正问题与解决之道...

《设计心理学1》作者[美] 唐纳德A诺曼 。此书始终强调以人为本的设计哲学&#xff0c;将认知心理学和行为学等多学科的方法导入到设计之中。不仅着重于反思设计过程中出现的问题给用户带来的困扰&#xff0c;更着重于解决问题&#xff0c;用这些基本原则帮助设计师找到真正的问…

java dumpheap_java程序性能分析之thread dump和heap dump

一.dump基本概念在故障定位(尤其是out of memory)和性能分析的时候&#xff0c;经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况&#xff0c;这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore&#xf…

python缩进格式错误的是_19个常见的python错误和异常

19个常见的python错误和异常 错误总是不可避免&#xff0c;尤其是在初学阶段&#xff0c;本文收集整理了1个常见的python错误 1. 忘记添加: 在if, elif, else, for, while, class&#xff0c;或者使用def定义函数的名称后面忘记添加:&#xff0c;就会引发 SyntaxError if 3 >…

json string 格式_GO小知识之如何做JSON美化

经常有些小知识想分享出来&#xff0c;但又构不成体系&#xff0c;一直觉得文章形式发出不太合适。准备以 "知乎想法" 分享出来&#xff0c;但发现代码展示不太友好。还是发文章吧&#xff0c;该类分享将以 "小知识" 为前缀。后端http接口测试常需要打印 J…

2019计算机二级java软件_2019年计算机二级Java考试冲刺题及答案(2)

1.下列数据结构中&#xff0c;属于非线性结构的是()。A.循环队列B.带链队列C.二叉树D.带链栈2.下列数据结构中&#xff0c;能够按照“先进后出”原则存取数据的是()。A.循环队列B.栈C.队列D.二叉树3.对于循环队列&#xff0c;下列叙述中正确的是()。A.队头指针是固定不变的B.队…

python导入模块有几种方式、各有什么特点_Python导入模块的几种姿势

作为一名新手Python程序员&#xff0c;你首先需要学习的内容之一就是如何导入模块或包。但是我注意到&#xff0c;那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活。在本文中&#xff0c;我们将探讨以下话题&#xff1a; 常规导入&#xff08;regular…

java 对象引用 弱引用吗_谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么...

整体结构java提供了4中引用类型&#xff0c;在垃圾回收的时候&#xff0c;都有自己的各自特点。为什么要区分这么多引用呢&#xff0c;其实这和Java的GC有密切关系。强引用(默认支持模式)把一个对象赋给一个引用变量&#xff0c;这个引用变量就是一个强引用。强引用是我们最常见…

python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换

前文传送门&#xff1a; 图像缩放 图像缩放只是调整图像的大小&#xff0c;为此&#xff0c; OpenCV 为我们提供了一个函数 cv.resize() &#xff0c;原函数如下&#xff1a; resize(src, dsize, dstNone, fxNone, fyNone, interpolationNone) src 表示的是输入图像&#xff0c…

java中main方法返回类型是6_[单选] Java application中的主类需包含main方法,main方法的返回类型是什么()。...

[单选] Java application中的主类需包含main方法,main方法的返回类型是什么()。 更多相关问题 关于超声在人体中传播的速度,叙述正确的有A、与人体组织的弹性有关B、与人体组织的密度有关C、与人 患者女,50岁,2年前超声发现甲状腺右叶单发实性结节, 0.7 cm0.5 cm。先后数家…

linux中python编辑器_Linux下9款最好的Markdown编辑器

首先&#xff0c; Markdown是使用Perl编写的&#xff0c;简单、轻量级的工具&#xff0c;允许用户编写纯文本格式和高效的html或者XHTML。它实际上是一个易于阅读&#xff0c;易于编写纯文本的语言和文本到HTML的转换的软件工具。 希望你有一点了解&#xff0c;Mrakdown是什么&…