编译原理实验二:Python实现中文分词–正向最大匹配和逆向最大匹配
最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。
文档整理如下:
最大正向匹配代码如下:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 21 16:25:22 2020
@author: lenovo
"""
import numpy as np
#处理词典库获得列表
def get_dic():
f=open("F:/学习文件/编译原理/实验二/词典文档.txt",'r')
file_open=f.read().split()#按照空格处理文件
f.close()
chars=list(set(file_open))#去重之后获得列表
return chars
dic=get_dic()
def readfile():
max_length=0
for i in dic:
max_length=max(max_length,len(i))##获得最大长度
zz=max_length
f=open("F:/学习文件/编译原理/实验二/测试文档.txt",'r')
ff=open("F:/学习文件/编译原理/实验二/生成文档.txt",'w')
lines=f.readlines()
f.close()
for line in lines:#分别对每一行进行正向最大匹配处理
max_length=zz
my_list=[]
len_hang=len(line)
while len_hang>0:
tryW=line[0:max_length]##切割字符串
while tryW not in dic:
if len(tryW)==1:#长度为1的时候就直接退出
break;
tryW=tryW[0:len(tryW)-1]
my_list.append(tryW)
line=line[len(tryW):]
len_hang=len(line)
for i in my_list:
ff.write(i+" ")
ff.close()
readfile()
结果如下:
逆向最大匹配代码如下:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 21 19:04:54 2020
@author: lenovo
"""
import numpy as np
#处理词典库获得列表
def get_dic():
f=open("F:/学习文件/编译原理/实验二/词典文档.txt",'r')
file_open=f.read().split()
f.close()
chars=list(set(file_open))
return chars
dic=get_dic()
def readfile():
max_length=0
for i in dic:
max_length=max(max_length,len(i))##获得最大长度
zz=max_length
f=open("F:/学习文件/编译原理/实验二/测试文档.txt",'r')
ff=open("F:/学习文件/编译原理/实验二/生成文档逆向最大匹配.txt",'w')
lines=f.readlines()
f.close()
for line in lines:#分别对每一行进行逆向最大匹配处理
max_length=zz
my_list=[]
len_hang=len(line)
while len_hang>0:
tryW=line[max(0,len_hang-max_length):len_hang]#防止溢出
while tryW not in dic:
if len(tryW)==1:
break;
tryW=tryW[1:len(tryW)]#这里注意,一直是从1开始的
my_list.append(tryW)
line=line[0:len_hang-len(tryW)]
len_hang=len(line)
while len(my_list):
tt=my_list.pop()#这里类似栈的操作
ff.write(tt+" ")
ff.close()
readfile()##012345
结果如下:
逆向需要考虑一些下标的变化,防止溢出。
努力加油a啊,(o)/~