前向最大匹配(NLP分词操作)

前向最大匹配

备注:文章仅帮助自己学习使用哦,能帮助到有缘分的你更好哦!!!!!!!!!!!!!

算法介绍

例如一个简易词典为:{“我们”,“喜欢”,“我”, “你们”, “苹果”, “水果”, “很”, “果”}
那么当输入的句子为 我们很喜欢苹果,那么分词的结果为【我们/很/喜欢/苹果】
虽然词典中有等单词,但是不满足最大匹配的原则。
此外,还包括反向最大匹配,双向最大匹配,意思类似。

代码展示

1.文件准备/词库准备

train_text = r"XXXXXXXXXXX\train.txt" # 用于生成字典保存所有的单词
test_text = r"XXXXXXXXXXX\test.txt""" # 需要进行匹配的文档
after_fenci = r"XXXXXXXXXXX\result.txt""" # 分词之后的文档

def get_dict(test_file):  # 读取文本返回列表
    with open(test_file, 'r', encoding='utf-8') as f:
        try:
            file_content = f.read().split()
        finally:
            f.close()
    chars = list(set(file_content))
    return chars
dict = get_dict(train_text) # dict即为我们所得的词库

2.分词操作

def readfile(test_text):
   max_length = 5 # 设定最大的匹配长度,在这里,若5个字符没匹配上,就匹配4个字符,以此类推
   f = open(test_text, 'r', encoding='utf-8')
   h = open(after_fenci, 'w', encoding='utf-8')
   lines = f.readlines()

   for line in lines:
       my_list = []
       start_pos = 0
       while start_pos < len(line):
       #设定判断标志,如果有匹配上,则匹配位右移相应位置,若没有匹配上,则右移一位。
           is_match = False  
           for length in range(max_length, 0, -1):
               text = line[start_pos: start_pos + length]
               if text in dict:
                   my_list.append(text)
                   start_pos += length # 匹配上,则移动匹配的距离,之后直接跳出循环
                   is_match = True
                   break
           if is_match == False: # 没匹配上,则往右移动一位。
               start_pos += 1
       print(my_list)
       for word in my_list:
           if word == '\n':  # 这个地方,不知道为什么找不到分词之后的'\n',知道的大佬请留言告诉我
               h.write('\n')
           else:
               h.write(word+" ")
       h.close

readfile(test_text)

友情参考链接1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值