使用jieba、前向最大匹配算法、后向最大匹配算法分词

使用jieba、前向最大匹配算法、后向最大匹配算法分词

今天我们开始分词,我整理了王家卫电影里的一些台词,总共有79条,分别出自比较有名的《东邪西毒》、《春光乍泄》、《重庆森林》,这个数据集是这样的。
在这里插入图片描述

前向最大匹配算法

这个算法的思想非常简单,就是从句子的最开始找词典中与它匹配的最长的词,然后不断向后推进,直到完成整个句子的单词配对。

  1. 建立词典
  2. 循环查找配对单词

首先先来建立词典,按理说应该是手动建立,不过这么多词,确实有点为难俺老丁了,就用jieba分词结果来建立词典吧
代码如下:

import jieba
import re
import jieba.posseg as pseg

filepath1 = '王家卫电影台词.txt'
dict=[]
##创建字典
with open(filepath1, 'r', encoding = 'utf-8') as sourceFile:
    lines = sourceFile.readlines()
    for line in lines:
        line1 = line.replace(' ','')     # 去掉文本中的空格
        pattern = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")    #只保留中英文、数字,去掉符号
        line2= re.sub(pattern,'',line1)      #把文本中匹配到的字符替换成空字符
        seg = jieba.lcut(line2, cut_all = False)
        for i in range(len(seg)):
            if seg[i] not in dict:
                dict.append(seg[i])
    print(len(dict)) 
    print(dict)

来看一下这个建立好的词典:
一共是619个词
在这里插入图片描述接下来就可以进行分词啦,逐行读取来分一下:

##前向最大匹配算法
def forword_Match(text, Dict):
    word_list = []
    pi = 0    #初始位置
    #找出字典中的最长的词的长度
    m = max([len(word) for word in Dict])
    while pi != len(text):
        n = len(text[pi:])    #当前指针到字符串末尾的长度
        if n < m:
            m = n
        for index in range(m,0,-1):      #从当前 pi 起取 m 个汉字作为词 
            if text[pi:pi+index] in Dict:
                word_list.append(text[pi:pi+index])
                pi = pi + index         # 根据词的长度修改指针pi
                break
    print('/'.join(word_list),len(word_list))
##逐句输出分词结果和每句话分词个数
with open(filepath1, 'r', encoding = 'utf-8') as sourceFile:
    lines = sourceFile.readlines()
    for line in lines:
        line1 = line.replace(' ','')     # 去掉文本中的空格
        pattern = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")    #只保留中英文、数字,去掉符号
        line2= re.sub(pattern,'',line1)      #把文本中匹配到的字符替换成空字符
        forword_Match(line2, dict) 

来看一下分词结果吧
在这里插入图片描述

jieba算法

jieba分词就非常简单啦,直接分词就好啦。

##逐句输出分词结果和每句话分词个数
##逐句输出分词结果和每句话分词个数
with open(filepath1, 'r', encoding = 'utf-8') as sourceFile:
    lines = sourceFile.readlines()
    for line in lines:
        line1 = line.replace(' ','')     # 去掉文本中的空格
        pattern = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")    #只保留中英文、数字,去掉符号
        line2= re.sub(pattern,'',line1)      #把文本中匹配到的字符替换成空字符
        seg = jieba.lcut(line2, cut_all = False)
        print("/".join(seg),len(seg))

来看看结果吧
在这里插入图片描述

后向最大匹配算法

##逆向最大匹配
def back_Match(text, Dict):
    word_list = []
    pi = len(text) - 1
    m = max(len(word) for word in Dict)
    while pi >= 0:
        n = len(text[0:pi+1])
        if n < m:
            m = n
        for index in range(m-1,-1,-1):
            if text[pi-index:pi+1] in Dict:
                word_list.append(text[pi-index:pi+1])
                pi = pi - index -1
                break

    print('/'.join(word_list[::-1]))
with open(filepath1, 'r', encoding = 'utf-8') as sourceFile:
    lines = sourceFile.readlines()
    for line in lines:
        line1 = line.replace(' ','')     # 去掉文本中的空格
        pattern = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")    #只保留中英文、数字,去掉符号
        line2= re.sub(pattern,'',line1)      #把文本中匹配到的字符替换成空字符
        back_Match(line2, dict) 

完整的项目和数据集已经上传到资源啦,不过我发现一个问题,虽然我都设置成了0积分下载,但是CSDN不知道内部怎么操作的,全部变成了2积分下载,所以大家如果没有积分,可以私聊我哦,或者评论我。
这次的我就设置成1.9元下载了,因为不太明白那个积分怎么操作的,如果不着急下载,私聊或者评论我都可以哦,可以私发一下哦。
链接: https://download.csdn.net/download/weixin_46570668/16679077.

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫头丁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值