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

(个人学习笔记,慎重参考)

1 基本概念

中文分词

指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。
作为中文信息处理的第一站,是后续nlp任务的基础,中文分词算法大致可分为词典规则与统计学习,针对具体问题往往会以统计学习为主、词典规则为辅。

2 正向最长匹配

最长匹配算法

就是在以某个下标为起点递增查词的过程中,优先输出更长的单词,这种规则被称为最长匹配算法。从前往后匹配则称为正向最长匹配,反之则称为逆向最长匹配。

# -*- coding:utf-8 -*-from tests.book.ch02.utility import load_dictionarydef 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))

运行结果:

['就读', '北京大学']
['研究生', '命', '起源']
  • 从代码逻辑可以看出,在匹配到字典中的最长字符串优先输出,若以该起点的字符中都不在字典中,则该起点的单字作为分词输出;
  • [‘研究生’, ‘命’, ‘起源’]产生误差的原因在于,正向最长匹配“研究生”的优先级大于“研究”,下面采用逆向最长匹配解决这个问题;

3 逆向最长匹配

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-05-22 21:05
# 《自然语言处理入门》2.3.3 逆向最长匹配
# 配套书籍:http://nlp.hankcs.com/book.php
# 讨论答疑:https://bbs.hankcs.com/
from tests.book.ch02.utility import load_dictionarydef 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_listif __name__ == '__main__':dic = load_dictionary()print(backward_segment('研究生命起源', dic))print(backward_segment('项目的研究计划', dic))

运行结果:

['研究', '生命', '起源']
['项', '目的', '研究计划']
  • [‘研究’, ‘生命’, ‘起源’]分词正确了,但是[‘项’, ‘目的’, ‘研究计划’]又错了,后者用正向最长匹配可以正确分词;

4 双向最长匹配

  • 清华大学的孙茂松教授曾经做过统计,在随机挑选的3680个句子中,正向匹配错误而逆向匹配正确的句子占比9.24%9.24\%9.24%,正向匹配正确而逆向匹配错误的情况则没有。
  • 基于类似上面观察到的一些经验,人们继续提出了双向最长匹配,具体规则如下:

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

# -*- coding:utf-8 -*-from tests.book.ch02.backward_segment import backward_segment
from tests.book.ch02.forward_segment import forward_segment
from tests.book.ch02.utility import load_dictionarydef 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                                     # 都相等时逆向匹配优先级更高if __name__ == '__main__':dic = load_dictionary()print(bidirectional_segment('研究生命起源', dic))

运行结果:

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

5 三种算法对比

在这里插入图片描述

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

6 参考文献

  1. 何晗《自然语言处理入门》;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL Developer 运用Profiler 分析存储过程性能

最近应公司需要&#xff0c;需要编写ORACLE存储过程。本人新手&#xff0c;在完成存储过程的编写后&#xff0c;感觉需要对存储过程中各个语句的执行时间进行分析&#xff0c;以便 对整个存储过程进行优化。 由于用的是PLSQL Developer 客户端工具&#xff0c;而网上大多介绍的…

四、Dynamic-programming algorithm Dynamic--LCS

(学习笔记&#xff0c;无什参考价值&#xff01;) 1 问题 2 算法 2.1 Brute-force LCS algorithm 检查每一个subsequence是否是yyy的子列时&#xff0c;遍历yyy的每一个元素&#xff0c;看是否依次可以全部覆盖subsequence所有元素&#xff0c;所以其复杂度为O(n)O(n)O(n); …

五、分治法应用--矩阵乘法

1 朴素算法 这个算法就是矩阵乘法的定义&#xff1a; 很容易看出这个算法复杂度是Θ(n3)\Theta(n^3)Θ(n3)。 2 递归算法 分治法首先是从分割问题开始的&#xff0c;得到数学上的递归关系后&#xff0c;然后使用递归的方式实现。 由上面的数学性质&#xff0c;可以使用递…

POJ 1300 Door Man(欧拉回路的判定)

题目链接 题意 &#xff1a; 庄园有很多房间&#xff0c;编号从0到n-1,能否找到一条路径经过所有开着的门&#xff0c;并且使得通过门之后就把门关上&#xff0c;关上的再也不打开&#xff0c;最后能回到编号为0的房间。 思路 &#xff1a; 这就是一个赤裸裸的判断欧拉通路的问…

bootstrap guide

bootstrap1. bootstrap 简单介绍2. demo演示3. 关于bootstrap使用注意的点1. bootstrap 简单介绍 起源 来自Twitter&#xff0c;是目前最受欢迎的前端框架。基于HTML、CSS、Javascript。Bootstrap js组件依赖于jquery 3.X简洁灵活&#xff0c;使得Web开发更加快捷。官网 https…

六、Analysis of quicksort

1 引言 如题目所示&#xff0c;本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题&#xff0c;里面有一些一般性的分析方法&#xff0c;如引入Indicator变量&#xff0c;从而把不确定问题引入到概率框架进行分析&#xff0c;一步一步把直觉上混乱的问题理清楚&#xff0c…

Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例

报错地址 2. 原因分析 1. Resource注解无效&#xff0c;注入失败&#xff0c;你得从容器中把bookInfoServie取去来&#xff0c;用getBean的方式创建BookInfoServiceImpl对象 2.删掉Resource注解&#xff0c;重新部署搞定。3.不要在意写了个Contorller, 初学spring&#xff0c;…

如何给APK文件签名

转载地址&#xff1a;http://www.apkbus.com/forum.php?modviewthread&tid1264211.签名的意义   为了保证每个应用程序开发商合法ID&#xff0c;防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序&#xff0c;我们需要对我们发布的APK文件进行唯一…

七、基于比较的排序算法总结

1 问题 至此&#xff0c;总结一下已经研究过的排序算法&#xff1a; insertion sort&#xff0c;Θ(n2)\Theta(n^2)Θ(n2) merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn) 从上面这个现象…

转账为demo,spring事务

spring 事务使用1. 业务代码2. xml配置3. 注解配置1. 业务代码 数据表结构 dao package com.lovely.dao.impl;import com.lovely.dao.AccountDao; import org.springframework.jdbc.core.JdbcTemplate;/*** author echo lovely* date 2020/8/9 11:01*/ public class AccountD…

八、计数排序及其应用分析

1 本节思路 之前的算法的最基本的思想是比较元素大小&#xff0c;所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn)&#xff0c;本节不再基于元素比较&#xff0c;而是基于计数的Counting sort&#xff0c;然后应用在Radix sort上。 2 Counting sort 2.1 算法思想 Cou…

Google开发者模式调试css样式的方法

界面如下&#xff0c;你需要调试css样式… 看下图&#xff0c;高仿某云播放界面部分 需求 1.h5开发手机端界面&#xff0c;禁用缩放 2.如何精准的定位像上图一样&#xff0c;或者更好 3.使用Google调试器&#xff0c;调试css样式如何调样式 选择对应的样式 确定多个元素…

OD汇编需要标签

如何解决&#xff0c;看那红体字。。。 push 0046ad70 标签就是地址的引用 zai破解的道路上面面前行 技术参考&#xff1a;http://zhidao.baidu.com/link?url8JP8KFxTinclhl6MwpaZw5buhtv1p4zgpjy8rKkBPvD4YqCq2uudXQZrhuBLPGZm5ahe3d7YsLb3MeAFDXfsua转载于:https://www.cnbl…

git与github使用

1 从github上clone到本地 配置Git 首先在本地创建ssh key&#xff1b; $ ssh-keygen -t rsa -C "your_emailyouremail.com"后面的your_emailyouremail.com改为你在github上注册的邮箱&#xff0c;之后会要求确认路径和输入密码&#xff0c;我们这使用默认的一路回车…

bootstrap panel 布局

panel1. 效果2. 基于bootstrap实现用于页面分专栏展示 1. 效果 成品 2. 基于bootstrap实现 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>panel 布局</title><link rel"stylesheet" href"cs…