Python实现中文分词--正向最大匹配和逆向最大匹配

编译原理实验二: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)/~

  • 13
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值