使用jieba、前向最大匹配算法、后向最大匹配算法分词
今天我们开始分词,我整理了王家卫电影里的一些台词,总共有79条,分别出自比较有名的《东邪西毒》、《春光乍泄》、《重庆森林》,这个数据集是这样的。
前向最大匹配算法
这个算法的思想非常简单,就是从句子的最开始找词典中与它匹配的最长的词,然后不断向后推进,直到完成整个句子的单词配对。
- 建立词典
- 循环查找配对单词
首先先来建立词典,按理说应该是手动建立,不过这么多词,确实有点为难俺老丁了,就用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.