当前位置: 首页 > news >正文

自然语言处理学习笔记(五)————切分算法

目录

1.切分算法

2.完全切分

3.正向最长匹配

4.逆向最长匹配

5.双向最长匹配

6.速度评测


1.切分算法

        词典确定后,句子可能含有很多词典中的词语,他们有可能互相重叠,如何切分需要一些规则。常用规则为:正向匹配算法、逆向匹配算法以及双向匹配算法。但他们都是基于完全切分过程。

2.完全切分

        完全切分指的是,找出一段文本中的所有单词。朴素的完全切分算法其实非常简单,只要遍历文本中的连续序列,查询该序列是否在词典中即可。定义词典为dic,文本为text,当前的处理位置为i,完全切分的python算法如下:

def fully_segment(text, dic):word_list = []for i in range(len(text)):                  # i 从 0 到text的最后一个字的下标遍历for j in range(i + 1, len(text) + 1):   # j 遍历[i + 1, len(text)]区间word = text[i:j]                    # 取出连续区间[i, j]对应的字符串if word in dic:                     # 如果在词典中,则认为是一个词word_list.append(word)return word_listif __name__ == '__main__':dic = load_dictionary()print(fully_segment('商品和服务', dic))

        运行结果: 

        输出了所有可能的单词。由于词库中含有单字,所以结果中也出现了一些单字。 

3.正向最长匹配

        完全切分的结果比较没有意义,我们更需要那种有意义的词语序列,而不是所有出现在词典中的单词所构成的链表。 所以需要完善一下处理规则,考虑到越长的单词表达的意义越丰富,于是我们定义单词越长优先级越高。具体说来,就是在以某个下标为起点递增查词的过程中,优先输出更长的单词,这种规则被称为最长匹配算法。扫描顺序从前往后,则称为正向最长匹配,反之则为逆向最长匹配。

def forward_segment(text, dic):word_list = []i = 0while i < len(text):longest_word = text[i]                      # 当前扫描位置的单字for j in range(i + 1, len(text) + 1):       # 所有可能的结尾word = text[i:j]                        # 从当前位置到结尾的连续字符串if word in dic:                         # 在词典中if len(word) > len(longest_word):   # 并且更长longest_word = word             # 则更优先输出word_list.append(longest_word)              # 输出最长词i += len(longest_word)                      # 正向扫描return word_listif __name__ == '__main__':dic = load_dictionary()print(forward_segment('就读北京大学', dic))print(forward_segment('研究生命起源', dic))

结果:

['就读', '北京大学']
['研究生', '命', '起源'] 

第二句话就会产生误差了,我们是需要把“研究”提取出来,结果按照正向最长匹配算法就提取出了“研究生”,所以人们就想出了逆向最长匹配。 


4.逆向最长匹配

def backward_segment(text, dic):word_list = []i = len(text) - 1while i >= 0:                                   # 扫描位置作为终点longest_word = text[i]                      # 扫描位置的单字for j in range(0, i):                       # 遍历[0, i]区间作为待查询词语的起点word = text[j: i + 1]                   # 取出[j, i]区间作为待查询单词if word in dic:if len(word) > len(longest_word):   # 越长优先级越高longest_word = wordbreakword_list.insert(0, longest_word)           # 逆向扫描,所以越先查出的单词在位置上越靠后i -= len(longest_word)return word_listdic = load_dictionary()
print(backward_segment('研究生命起源', dic))
print(backward_segment('项目的研究', dic))

        输出:

['研究', '生命', '起源']

['项', '目的', '研究']

        第一句正确了,但下一句又出错了,可谓拆东墙补西墙。另一些人提出综合两种规则,期待它们取长补短,称为双向最长匹配。

5.双向最长匹配

        统计显示,正向匹配错误而逆向匹配正确的句子占9.24%。双向最长匹配规则集,流程如下:

(1)同时执行正向和逆向最长匹配,若两者的词数不同,则返回词数更少的那一个。

(2)否则,返回两者中单字更少的那一个。当单字数也相同时,优先返回逆向最长匹配的结果。

def count_single_char(word_list: list):  # 统计单字成词的个数return sum(1 for word in word_list if len(word) == 1)def bidirectional_segment(text, dic):f = forward_segment(text, dic)b = backward_segment(text, dic)if len(f) < len(b):                                  # 词数更少优先级更高return felif len(f) > len(b):return belse:if count_single_char(f) < count_single_char(b):  # 单字更少优先级更高return felse:return b                                     # 都相等时逆向匹配优先级更高print(bidirectional_segment('研究生命起源', dic))
print(bidirectional_segment('项目的研究', dic))

结果:

['研究', '生命', '起源']
['项', '目的', '研究']

        比较之后发现,双向最长匹配在2、3、5这3种情况下选择出了最好的结果,但在4号句子上选择了错误的结果,使得最终正确率3/6反而小于逆向最长匹配的4/6。由此,规则系统的脆弱可见一斑。规则集的维护有时是拆东墙补西墙,有时是帮倒忙。

6.速度评测

词典分词的规则没有技术含量,消除歧义的效果不好。词典分词的核心价值不在于精度,而在于速度。

 总结:

  • Python的运行速度比Java慢,效率只有Java的一半不到
  • 正向匹配与逆向匹配的速度差不多,是双向的两倍。因为双向做了两倍的工作
  • Java实现的正向匹配比逆向匹配快

相关文章:

自然语言处理学习笔记(五)————切分算法

目录 1.切分算法 2.完全切分 3.正向最长匹配 4.逆向最长匹配 5.双向最长匹配 6.速度评测 1.切分算法 词典确定后&#xff0c;句子可能含有很多词典中的词语&#xff0c;他们有可能互相重叠&#xff0c;如何切分需要一些规则。常用规则为&#xff1a;正向匹配算法、逆向匹…...

SQL-方法论

写SQL时可以考虑的手段&#xff1a; 行转列 先分为多个临时表&#xff0c;然后JOIN到一起 select uid,t1.name YuWen,t2.name ShuXue from (select uid,namefrom tableAwhere naem 语文) t1join (select uid,namefrom tableAwhere naem 数学) t2on t1.uid t2.uid; 用sum(if…...

[Python从零到壹] 六十八.图像识别及经典案例篇之图像特效(毛玻璃、浮雕、油漆和模糊特效变换)

八月太忙,还是写一篇吧! 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足…...

undefined与null的区别

null 表示一个对象被定义了&#xff0c;值为“空值” undefined 表示不存在这个值 1.undefined typeof undefined //"undefined" undefined 是一个表示"无"的原始值或者说表示"缺少值"&#xff0c;就是此处应该有一个值&#xff0c;但还没有…...

Unity之获取用户地理位置

1.直接利用三方API获取: 1.1 利用bilibili的api 【未知稳定性】 public void Awake() {StartCoroutine(GetLocationInfoNew());}/// <summary>/// 利用bilibili的接口通过ip直接获取城市信息/// </summary>IEnumerator GetLocationInfoNew() {//UnityWebRequest …...

TC3XX - MCAL知识点(二十):CAN MCAL配置及代码实战(CAN/CANFD/extenen CAN)

目录 1、概述 2、MCAL配置 2.1、实验目标 2.2、CAN配置(包含CAN与CANFD) 2.2.1、CanGeneral...

QT生成Debug和Release发布版后,运行exe缺少dll问题

在QT Creator生成debug和release的exe执行文件后&#xff0c;运行时&#xff0c;报错缺少*.dll.解决办法1&#xff1a; 在系统环境变量中添加D:\Qt\Qt5.13.2\Tools\mingw730_64\bin后&#xff0c;即可运行。 当使用此方法时&#xff0c;将exe拷贝到其他电脑中运行时&#xff0c…...

企业进销存管理流程有哪些? 附进销存管理系统

阅读本文&#xff0c;您可以了解&#xff1a;1、进销存的定义&#xff1b;2、进销存的流程 首先&#xff0c;在了解进销存流程之前&#xff0c;我们必须厘清一个问题&#xff1f; 什么是进销存&#xff1f; 进销存是一个企业管理中常用的术语&#xff0c;是指企业在经营过程中…...

RPC原理与Go RPC详解

文章目录 RPC原理与Go RPC什么是RPC本地调用RPC调用HTTP调用RESTful API net/rpc基础RPC示例基于TCP协议的RPC使用JSON协议的RPCPython调用RPC RPC原理 RPC原理与Go RPC 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用。它允许像调用…...

JavaScript:异步编程的发展

在JavaScript编程中&#xff0c;异步编程是处理耗时操作的关键技术&#xff0c;它允许程序在等待某些操作完成时继续执行其他任务&#xff0c;提高了程序的性能和响应性。随着技术的发展&#xff0c;JavaScript的异步编程模型也在不断演进&#xff0c;从最初的回调函数到现在的…...

排序第二课【选择排序】直接选择排序 与 堆排序

目录 1. 排序的概念&#xff1a; 2.选择排序的基本思想 3.直接选择排序 4.堆排序 1. 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xf…...

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…...

【Vue3】localStorage读取数组并赋值的问题

问题描述 今天在写项目用到localStorage进行存储并读取数据&#xff0c;并将读取到的数据存放到列表的时候&#xff0c;发现vue3不能直接对数组进行赋值。因为Vue3的响应式是proxy&#xff0c;对所有的数据进行了拦截。 onBeforeMount(() > {console.log(JSON.parse(local…...

华为harmonyos4.0鸿蒙4.0安装谷歌服务框架Play商店,解决从服务器检索信息时出错

8月4号华为手机发布了全新的harmonyos4.0鸿蒙4.0系统&#xff0c;很多人需要问还是不是支持谷歌服务框架&#xff1f;那么答案是肯定的&#xff0c;它和鸿蒙3是一样的&#xff0c;一样的操作&#xff0c;一样的支持安装谷歌服务框架&#xff0c;安装Google play商店。测试机型&…...

pcl 滤波

pcl::ShadowPoints 去除边缘不连续点云 #include <pcl/filters/shadowpoints.h> #include <pcl/features/normal_3d.h>pcl::PointCloud<pcl::PointXYZI>::Ptr ShadowsCloudFilter(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud) {pcl::ShadowPoints&l…...

前端js--旋转幻灯片

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet" href"…...

解决mvn clean install遇到testng单元测试失败时打包也失败的问题

解决mvn clean install遇到testng单元测试失败时打包也失败的问题 看这个之前请先看这个 Jenkins执行Testng 比如我现在就有一个单元测试失败的项目 执行mvn clean install的时候就会报错 下面是我现在的pom.xml 但我们不希望这样&#xff0c;怎么办 <plugin><gr…...

RISC-V基础之函数调用(二)栈与寄存器(包含实例)

堆栈是一种后进先出&#xff08;LIFO&#xff09;的队列&#xff0c;用于存储函数调用时的临时数据和现场数据。堆栈指针sp&#xff08;寄存器2&#xff09;是一个普通的RISC-V寄存器&#xff0c;按照惯例&#xff0c;指向堆栈的顶部。堆栈从高地址向低地址增长&#xff0c;即当…...

解析器模式(C++)

定义 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一种解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 应用场景 在软件构建过程中&#xff0c;如果某一特定领域的问题比较复杂&#xff0c;类似的结构不断重复出现&#xff0c;如果使用…...

电子元器件选型与实战应用—02 电容选型第1篇(8000字)

文章目录 0. 电阻选型案例回顾1. 入门知识1.1 基础1.2 串并联1.3 常用容值1.4 常用品牌2. 参数详解2.1 静电容量2.2 额定电压2.3 精度2.4 漏电流和绝缘电阻2.5 ESR3. 电容种类3.1 陶瓷电容3.1.1 陶瓷电容优缺点3.1.2 容量和电压的关系3.1.3 陶瓷电容的介质3.1.4 容量和温度的关…...

终极指南:PrivateGPT增量文档处理策略与动态更新解决方案

终极指南&#xff1a;PrivateGPT增量文档处理策略与动态更新解决方案 【免费下载链接】privateGPT 利用GPT的强大功能与你的文档进行互动&#xff0c;确保100%的隐私保护&#xff0c;无数据泄露风险 项目地址: https://gitcode.com/GitHub_Trending/pr/privateGPT Priva…...

告别电量焦虑:用STM32+IP2366打造你的140W双向快充移动电源方案

告别电量焦虑&#xff1a;用STM32IP2366打造140W双向快充移动电源方案 1. 为什么需要高性能移动电源方案 当代智能设备对电力的需求呈现爆发式增长。从智能手机到笔记本电脑&#xff0c;从无人机到便携式医疗设备&#xff0c;快速充电和大容量储能已成为刚需。传统移动电源方…...

Mermaid Live Editor:3分钟学会专业图表制作的终极免费工具

Mermaid Live Editor&#xff1a;3分钟学会专业图表制作的终极免费工具 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-e…...

ThinkPHP6(TP6)控制器404问题排查与Nginx伪静态配置指南

1. 为什么你的TP6控制器总是404&#xff1f; 最近帮朋友排查一个ThinkPHP6项目&#xff0c;明明控制器写得没问题&#xff0c;路由也配置了&#xff0c;但一访问就蹦出个404页面。这种问题在新手部署TP6时特别常见&#xff0c;尤其是用Nginx服务器的环境。我自己第一次用TP6时也…...

[特殊字符] GLM-4V-9B企业级方案:客户上传截图问题自动诊断

GLM-4V-9B企业级方案&#xff1a;客户上传截图问题自动诊断 1. 引言 想象一下这个场景&#xff1a;你是一家SaaS公司的技术支持工程师&#xff0c;每天的工作就是处理海量的客户工单。其中&#xff0c;有相当一部分问题描述是模糊的&#xff0c;比如“我的页面显示不正常”、…...

零基础入门AI集成:在快马平台编写你的第一个豆包AI对话程序

零基础入门AI集成&#xff1a;在快马平台编写你的第一个豆包AI对话程序 作为一个刚接触AI开发的新手&#xff0c;第一次看到豆包开放平台的API文档时&#xff0c;我完全被各种参数和术语搞晕了。好在发现了InsCode(快马)平台&#xff0c;它让我不用从零开始写代码就能理解整个…...

大模型开发:裸辞还是在职?算清这笔账,转型之路少走弯路!

文章探讨了在大模型开发转型过程中&#xff0c;裸辞与在职学习的利弊及适用人群。裸辞可集中时间快速学习&#xff0c;但经济压力大&#xff1b;在职学习有稳定收入&#xff0c;但时间碎片化&#xff0c;学习周期长。文章建议根据个人经济状况、技能基础和风险承受能力选择路径…...

Hunyuan-MT-7B实战教程:Pixel Language Portal与RAG架构结合提升专业翻译

Hunyuan-MT-7B实战教程&#xff1a;Pixel Language Portal与RAG架构结合提升专业翻译 1. 产品概览与核心价值 Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同&#xff0c;它将语…...

UE4实战:利用VaRest与VictoryBPLibrary实现高效本地文件读写

1. 为什么需要本地文件读写 在虚幻引擎4开发过程中&#xff0c;我们经常需要保存游戏配置、玩家进度或者关卡数据。想象一下你正在开发一个RPG游戏&#xff0c;需要记录玩家背包里的所有物品、当前任务进度和角色属性。如果每次退出游戏这些数据都消失&#xff0c;玩家肯定会抓…...

Z-Image-Turbo-辉夜巫女显存优化技巧:在低配置GPU上运行大模型的实战方法

Z-Image-Turbo-辉夜巫女显存优化技巧&#xff1a;在低配置GPU上运行大模型的实战方法 你是不是也遇到过这种情况&#xff1a;看到一个效果很棒的图像生成模型&#xff0c;比如Z-Image-Turbo-辉夜巫女&#xff0c;兴冲冲地准备跑起来试试&#xff0c;结果一运行就提示“CUDA ou…...