当前位置: 首页 > 后端技术 > Python

Python中文分词教程在详细讲解最大正匹配算法之前

时间:2023-03-26 15:29:10 Python

中文分词是中文文本处理中的一项基础任务。然而,长期以来,Python编程领域一直缺乏高精度、高效率的分词组件。下面这篇文章主要介绍python中文分词教程之前最大正向匹配算法的相关资料。需要的朋友可以参考一下。前言大家都知道,英文的分词是比较容易的,因为单词是用空格隔开的,但是中文就不一样了。中文中的一个句子是用词来分隔的,所谓正则的正向最大匹配和反向最大匹配是一种分词匹配的方法,这里用字典匹配来解释。最大匹配算法是自然语言处理中中文匹配算法中最基本的算法。分为正向和反向,原理相同。前向最大匹配算法,顾名思义,就是从左向右扫描,找到单词的最大匹配。首先,我们可以指定一个词的最大长度。每次扫描,我们都会找一个这个长度的词来匹配字典中的词。如果没有找到,外汇实时点差http://www.fx61.com/spreads。html,缩短长度,继续查找,直到找到或变成一个单词。下面话不多说,一起来看看详细的介绍吧。例:S1="ComputationalLinguisticscourseisthreeclasshours",设置最大词长MaxLen=5,S2=""字典中有三个词:[ComputationalLinguistics],[Course],[ClassHours](1)S2="";S1不为空,从S1左边取候选子串W="computationallinguistics";(2)查词汇表,词汇表中有“计算语言学”,在S2中加入W,S2="ComputationalLinguistics/",从S1中去掉W,此时S1="courseisthreeclasshours";(3)S1不为空,取候选子串W="courseisfromtheleftofS1Three";(4)查词表,W不在词表中,去掉W最右边的词,得到W="课程是三";(5)查词汇表,W不在词汇表中,把W最右边的词去掉,得到W="courseis";(6)查单词表,W不在单词表中,去掉W最右边的单词,得到W="course"(7)查单词表,W在单词表中,在S2中添加W,S2="ComputationalLinguistics/Course/",从S1中去掉W,此时S1="是三个课时";(8)S1不为空,所以从S1左边取出候选子串W="isthreeclasshours";(9)查词表,W不在词表中,去掉W最右边的词,得到W="bethreeclasses";(10)查Vocabulary,W不在词汇表中,去掉W最右边的单词,W="isthree";(11)查词表,W不在词表中,去掉W最右边的词,W=“是三”(12)查词表,W不在词表中,去掉词在W的最右边,得到W="yes",则W是一个单词,将W添加到S2,S2="computinglanguagestudy/course/is/",从S1中去掉W,此时S1="三个课时";(13)S1不为空,从S1左侧取出候选子串W="三个课时";(14)查词汇表,词汇表中没有W,去掉W最右边的单词,得到W="三课";(15)查单词表,如果W不在单词表中,则去掉W最右边的单词,得到W="three";(16)查词表,W不在词表中,去掉W最右边的词,得到W="三",此时W是单个词,在S2中加入W,S2="ComputationalLinguistics/Course/Yes/Three/”并从S1中去掉W,此时S1="classhours";(17)S1不为空,取候选子串W="从S1课时左边开始";(18)查词汇表,W不在词汇表中,去掉W最右边的单词,得到W="aclass";(19)查词汇表,W不在词汇表中,去掉W最右边的单词去掉得到W="unit",此时W是单个单词,加上W小号2、S2="ComputationalLinguistics/Course/Yes/Three/A/"将S1中的W去掉,此时S1="Classhours";(20)S1不为空,取S1左边的候选人StringW="classhours";(21)查词汇表,词汇表里有W,S2里加了W,S2="computationallinguistics/course/is/three/unit/classhours/",W从S1里去掉,此时timeS1=""(22)S1为空,输出S2作为分词结果,分词过程结束。至于为什么选择python语言?可能是因为身边的人用的少,所以想尝试突破,但我不否认我用的C/C++、java等很多高级语言都不多。虽然编程语言基本需要熟悉One,其他的都好学,但是我在python中尝到了甜头,所以就索性使用了这门语言。中文分词算法的Python实现:脚本接受两个参数,一个是输入文件的路径,一个是字典的路径。它是这样工作的:pythonmax-match.py??1!/usr/bin/envpythonimportcPickleaspickleimportsys#最大字长为5window_size=5defmax_match_segment(line,dic):#在这里写你的代码chars=line.decode("utf8")words=[]idx=0#判断索引是否超过chars的长度whileidx>sys.stderr,"failedtoopenfile"sys.exit(1)try:dic=pickle.load(open(sys.argv[2],"r"))except:print>>sys.stderr,“无法加载dict%s”%sys.argv[2]sys.exit(1)try:fpo=open("out.txt","w")except:print>>sys.stderr,"failedtoloadout.txt"sys.exit(1)forlineinfpi:fpo.write("\t".join(max_match_segment(line.strip(),dic)))当然,这只是最基本的是的,也可以有很多高级的优化,比如改成Trie树版本,控制最大字长等等。