用正向和逆向最大匹配算法进行中文分词(续)

2024-05-08 18:48

本文主要是介绍用正向和逆向最大匹配算法进行中文分词(续),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是用正向和逆向最大匹配算法进行中文分词的续篇,对上文分词的结果作一些分析。


一、结果分析:

        1.程序运行结果,如下图所示:


        2.总体分析。
        (1)正向和逆向匹配都正确的句子数目为 1731,占句子总数的39.0%
        (2)正向最大匹配完全正确的句子数目为 1917,占句子总数的43.2%
        (3)逆向最大匹配完全正确的句子数目为 1982,占句子总数的44.7%
        (4)至少有一种方法分析正确的句子数为 2168,占句子总数的48.9%
        3.逆向最大匹配比正向最大匹配的准确率和召回率都高。
        4.错误分析
        (1)未登录词导致的错误占大部分,约70%左右,是导致分词错误的主要因素。
        (2)面对交集型歧义,正向最大匹配比逆向最大匹配更容易出错。
        (3)面对组合型歧义,正向最大匹配和逆向最大匹配都无能为力。


二、主要问题分析:
        1.准确率为什么低于召回率;
        二者的计算公式如下:
                准确率 = 切分正确的词 / 切分得到的词数
                召回率 = 切分正确的词 / 准确的词数
        从上述公式来看,他们的区别在于分母。通过对切分错误的汉字串的分析,发现未登录词在其中占了相当大的比例,大概四分之三左右。算法对于未登录词的处理方式是:将它们按照单字进行切分,这样势必导致切分出来的词的数量比真实值偏大。虽然也存在一些组合型歧义问题使切分出来的词的数量倾向于减少,但是这种情形较少,只占所有错误汉子串的十分之一左右。因此从总体上来看,实际切分得到的词的数目会比真实的词的数目要大,所以最终得到的准确率低于召回率。

        2.逆向匹配的准确率和召回率为什么高于正向匹配?
        逆向切分的错误较少。错误分三类:未登录词、组合型歧义、交集型歧义。其中未登录词对于两种切分方式来说是差不多的,组合型歧义也是相差无几。主要的区别在于交集型歧义问题,对于汉字串ABC,正向切分得到AB /C,逆向切分得到A/BC。在实际应用中,大多数的交集型歧义倾向于切分为A/BC这种形式。因此,正向匹配的错误数量相对来说较高。至于为什么汉语的交集型歧义倾向于切分为A/BC这种形式,那可能涉及到语言学的知识了。

        3.错误分词的主要问题什么?主流的解决办法是什么?
        从分词的结果来看,错误主要分为三类:
        (1)组合型歧义,该切分而未切分的词。正向切分中大概占13.8%,逆向切分中大概占14.2%。
        某些汉字串,它本身是词,切开来也是词,这就造成了组合型歧义。比如:比如“就是”,它本身是一个词,其中的“就”和“是”也都可以单独作为一个词。
        组合型歧义同最大匹配的原则是相矛盾的。最大匹配法的实质是要求切分出来的词的数量尽可能地少,而组合型歧义切分问题的存在,却要求考虑将这样的词再切分一次的可能性。如果不利用句法以及更高层面上的知识,组合型歧义切分是很难解决的。要利用上下文的语境信息进行识别。

         (2)交集型歧义。正向切分中大概占16.5%,逆向切分中大概占13.8%。
        交集型歧义切分是指,一个汉字串中包含ABC三个子串,AB和BC都是词,到底应该切分为A/BC还是AB/C。按照最大匹配切分方式,正向切分得到AB /C,逆向切分得到A/BC。因此,对同一个汉字串同时进行正向切分和逆向切分,可以检查出一部分交集型歧义,但是未必能发现所有的交集型歧义。
        解决交集型歧义,可以用统计学的手段计算出可能性最大的一种切分方式。可以利用最大概率法,基于支持向量机的方法,最大熵模型。
        这两种歧义的区别为:交集型歧义的问题在于在哪里切分,组合型歧义的问题在于该不该切。

        (3)未登录词。正向切分中大概占69.66%,逆向切分中大概占72.01%。
        即词典中不存在的词。一些未登录词是比较生僻的、不常用的词,如糌粑。还有一些是专有名词、人名、地名等。
        未登录词识别的基本方法主要采用的是:基于规则的方法和统计与规则相结合的方法。从目前的研究来看,多是对人名、地名、机构名等进行单独的识别研究。基于统计的方法是根据统计得到的各类用字的频度,加入构词可信度等概念进行识别。统计与规则相结合的方法是根据未登录词的用字规律和上下文特征,观察未登录词与标志位置的关系以及单词的左右结构,总结出适合绝大多数未登录词的识别规则,将规则应用于汉语文本的处理过程,从而识别未登录词。


这篇关于用正向和逆向最大匹配算法进行中文分词(续)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971142

相关文章

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

Nginx如何进行流量按比例转发

《Nginx如何进行流量按比例转发》Nginx可以借助split_clients指令或通过weight参数以及Lua脚本实现流量按比例转发,下面小编就为大家介绍一下两种方式具体的操作步骤吧... 目录方式一:借助split_clients指令1. 配置split_clients2. 配置后端服务器组3. 配