初始化(slot_dict.txt)

五条悟  Carton+++咒术回战
宝儿姐 Carton+++一人之下
冰火  Attraction+++冰火两仪眼
风车  vallege+++风车村
风车  Pirates+++娜美
斗罗大陆    Novel+++斗罗大陆
斗罗大陆    Carton+++斗罗大陆
天堂  Novel+++亲热天堂

用’\t’分隔,第一列是可匹配的词,第二列是对应词汇内部的信息,后续定义为"slot_info"这里定义是两列,用’+++‘分隔(linux环境一般用’\001’这种人为输入几乎不可能看见的词汇),第一列是词汇类型或者叫做槽位名,第二列该词语正式的名字,后续可以用来做精确查询。

# 使用最大逆向匹配进行提槽class DictSlot:def __init__(self, dict_path):#加载词典slot_dict = {}with open(dict_path, encoding="utf8") as f:for line in f:ll = line.strip().split("\t")if len(ll) != 2:continueslot_info = ll[1].split('+++')if len(slot_info) != 2:continueif ll[0] in slot_dict:slot_dict[ll[0]].append({"slot_name": slot_info[0], "slot_value": slot_info[1]})else:slot_dict[ll[0]] = [{"slot_name": slot_info[0], "slot_value": slot_info[1]}]self.slot_dict = slot_dictdef predict(self, query):query_len = len(query)idx = 0idy = query_lenslot_get = []tmp_slot_get_len = 0while idy > 0:while idx < idy:if query[idx:idy] in self.slot_dict:for item in self.slot_dict[query[idx:idy]]:slot_get.append({"slot_word": query[idx:idy],"slot_name": item["slot_name"],"slot_value":item["slot_value"],"slot_start":idx,"slot_end":idy})breakidx = idx + 1if len(slot_get) != tmp_slot_get_len:idy = idxidx = 0tmp_slot_get_len = len(slot_get)else:idx = 0idy = idy - 1return slot_get

最大逆向匹配,就是从后面开始,从最大开始逐步缩小范围,逐个匹配,查看每个局部是否在词典内存在,最大逆向匹配的一个假设是只取最长的实体。


from pprint import pprint
if __name__ == "__main__":dict_sloter = DictSlot("slot_dict.txt")pprint(dict_sloter.predict("宝儿姐想去风车村吃橘子"))

运行结果:

[{'slot_end': 7,'slot_name': 'vallege','slot_start': 5,'slot_value': '风车村','slot_word': '风车'},{'slot_end': 7,'slot_name': 'Pirates','slot_start': 5,'slot_value': '娜美','slot_word': '风车'},{'slot_end': 3,'slot_name': 'Carton','slot_start': 0,'slot_value': '一人之下','slot_word': '宝儿姐'}]
pprint(dict_sloter.predict("五条悟想去斗罗大陆借亲热天堂看"))

运行结果:

[{'slot_end': 14,'slot_name': 'Novel','slot_start': 12,'slot_value': '亲热天堂','slot_word': '天堂'},{'slot_end': 9,'slot_name': 'Novel','slot_start': 5,'slot_value': '斗罗大陆','slot_word': '斗罗大陆'},{'slot_end': 9,'slot_name': 'Carton','slot_start': 5,'slot_value': '斗罗大陆','slot_word': '斗罗大陆'},{'slot_end': 3,'slot_name': 'Carton','slot_start': 0,'slot_value': '咒术回战','slot_word': '五条悟'}]
pprint(dict_sloter.slot_dict)

运行结果:

{'五条悟': [{'slot_name': 'Carton', 'slot_value': '咒术回战'}],'冰火': [{'slot_name': 'Attraction', 'slot_value': '冰火两仪眼'}],'天堂': [{'slot_name': 'Novel', 'slot_value': '亲热天堂'}],'宝儿姐': [{'slot_name': 'Carton', 'slot_value': '一人之下'}],'斗罗大陆': [{'slot_name': 'Novel', 'slot_value': '斗罗大陆'},{'slot_name': 'Carton', 'slot_value': '斗罗大陆'}],'风车': [{'slot_name': 'vallege', 'slot_value': '风车村'},{'slot_name': 'Pirates', 'slot_value': '娜美'}]}

使用最大逆向匹配进行提槽相关推荐

  1. Java---中文词匹配 正向、逆向和双向最大匹配算法

    完成正向.逆向和双向最大匹配算法 import java.io.*; import java.util.*;/*** 正向最大匹配* 逆向最大匹配* 双向最大匹配*/ public class Two ...

  2. 正向(逆向)最大匹配和最大概率法分词的错误分析

    正向最大匹配.逆向最大匹配.最大概率法是最简单的三种分词方式.本文从这三种分词方法产生的错误入手,观察他们分词的优缺点. 1.基本情况 从语料中选取了200个句子作为样本,分别用三种不同的分词方式进行 ...

  3. 正向最大匹配 和逆向最大匹配对比比较

    正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...

  4. 【自然语言处理】正向、逆向、双向最长匹配算法的 切分效果与速度测评

    本文摘要 · 理论来源:[统计自然语言处理]第七章 自动分词:[自然语言处理入门]第二章 词典分词: · 代码目的:手写三种算法:正向最长匹配.逆向最长匹配.双向最长匹配,比较它们的单词切分效果与速度 ...

  5. 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法

    双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...

  6. php关键词分词搜索 最多匹配的排在最前面_百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客...

    原出处:蜘蛛池博客 原文链接:百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客 从事SEO(搜索引擎优化)工作的人可以比喻成搜索引擎的贴身管家,作为一名合格称职的管家必须要了解所服务对象的习 ...

  7. 中文分词--词典分词--最长匹配

    (个人学习笔记,慎重参考) 1 基本概念 中文分词 指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本. 作为中文信息处理的第一站,是后续nlp任务的基础,中文分词算法大致可分为词典 ...

  8. 正则表达式匹配非某字符串的情况

    http://t.zoukankan.com/zongfa-p-14818734.html 正则表达式中,如果想要不匹配某个字符可以使用如下 [^a]* 表示匹配除了a以外的所有字符 [^abc]*  ...

  9. 如何使用vlookup+excel数组公式 完成逆向查找?

    本文是黄同学的录屏首秀, 也就是你们所说的第一次,我把第一次都献给你们了.初次录制,会有那么多的不习惯,和结巴,心里想说的话并不能正常用嘴巴表达出来,希望大家谅解.文章末尾有本文的讲解视频,大家一定要 ...

最新文章

  1. Elasticsearch 在互联网公司大量真实的应用案例
  2. Python高级网络编程系列之第二篇
  3. Crawler:基于requests库+json库+40行代码实现爬取猫眼榜单TOP100榜电影名称主要信息
  4. Serverless 解惑——函数计算如何访问 SQL Server 数据库
  5. Monkey测试简介
  6. 2.Hadoop的学习(Ubuntu的目录及权限)
  7. spring boot项目开发中遇到问题,持续更新
  8. git 命令详解_再次学习Git版本控制工具
  9. Thinking in java之前
  10. 从714里连续减去6减几次得0_数学干货 | 小学数学1—6年级基础知识整理 ,预习复习都能用...
  11. 虚拟机无法联网解决方法
  12. html5 刷子,简单聊聊眼部刷子吧(打底刷、上色刷、晕染刷)
  13. layerdate一款很好用日期插件
  14. 【计算机网络】PDU地址
  15. 介绍几种 Windows10 自带的截图方式
  16. 优购小程序项目效果预览
  17. c语言printf显示变量,零基础学C语言 笔记一 变量 printf
  18. 【贪心】加工生产调度【经典】
  19. 微机原理与接口技术总结
  20. 并查集(详细解释+完整C语言代码)

热门文章

  1. 数据分析之市场购物篮分析流程
  2. 通过SketchRNN、PCA和t-SNE从Google QuickDraw数据集中显示矢量图的潜在空间|附源码
  3. python基础学习数列排序(给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200)
  4. 黑盒测试c语言用例,黑盒测试用例设计技术包括_测试用例包括什么_常用黑盒测试用例设计(4)...
  5. JS基础知识(三十):JS单线程
  6. 怎样使用更新域计算机,Windows Server 2019 组策略调整域计算机组策略刷新间隔时间...
  7. 利用SolidWorks进行三维建模的应用技巧
  8. 运维面试必问的web高频面试题(2021年最新版)
  9. Android加载网络图片资源
  10. scrapy爬取京东商品评论并保存至Mysql数据库中