`
xinklabi
  • 浏览: 1588212 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

中文分词算法 之 基于词典的逆向最大匹配算法

 
阅读更多

在之前的博文中介绍了基于词典的正向最大匹配算法,用了不到50行代码就实现了,然后分析了词典查找算法的时空复杂性,最后使用前缀树来实现词典查找算法,并做了3次优化。

 

下面我们看看基于词典的逆向最大匹配算法的实现,如下代码所示:

 

Java代码  收藏代码
  1. public static List<String> segReverse(String text){          
  2.     Stack<String> result = new Stack<>();  
  3.     while(text.length()>0){  
  4.         int len=MAX_LENGTH;  
  5.         if(text.length()<len){  
  6.             len=text.length();  
  7.         }  
  8.         //取指定的最大长度的文本去词典里面匹配  
  9.         String tryWord = text.substring(text.length() - len);  
  10.         while(!DIC.contains(tryWord)){  
  11.             //如果长度为一且在词典中未找到匹配,则按长度为一切分  
  12.             if(tryWord.length()==1){  
  13.                 break;  
  14.             }  
  15.             //如果匹配不到,则长度减一继续匹配  
  16.             tryWord=tryWord.substring(1);  
  17.         }  
  18.         result.push(tryWord);  
  19.         //从待分词文本中去除已经分词的文本  
  20.         text=text.substring(0, text.length()-tryWord.length());  
  21.     }  
  22.     int len=result.size();  
  23.     List<String> list = new ArrayList<>(len);  
  24.     for(int i=0;i<len;i++){  
  25.         list.add(result.pop());  
  26.     }  
  27.     return list;  
  28. }  

 

 

算法跟正向相差不大,重点是使用Stack来存储分词结果,具体差异如下图所示:



 

下面看看正向和逆向的分词效果,使用如下代码:

 

Java代码  收藏代码
  1. public static void main(String[] args){  
  2.     List<String> sentences = new ArrayList<>();  
  3.     sentences.add("杨尚川是APDPlat应用级产品开发平台的作者");  
  4.     sentences.add("研究生命的起源");  
  5.     sentences.add("长春市长春节致辞");  
  6.     sentences.add("他从马上下来");  
  7.     sentences.add("乒乓球拍卖完了");  
  8.     sentences.add("咬死猎人的狗");  
  9.     sentences.add("大学生活象白纸");  
  10.     sentences.add("他有各种才能");  
  11.     sentences.add("有意见分歧");  
  12.     for(String sentence : sentences){  
  13.         System.out.println("正向最大匹配: "+seg(sentence));  
  14.         System.out.println("逆向最大匹配: "+segReverse(sentence));  
  15.     }  
  16. }  

 

 

运行结果如下:

 

Java代码  收藏代码
  1. 开始初始化词典  
  2. 完成初始化词典,词数目:427452  
  3. 最大分词长度:16  
  4. 正向最大匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品开发, 平台, 的, 作者]  
  5. 逆向最大匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品开发, 平台, 的, 作者]  
  6. 正向最大匹配: [研究生, 命, 的, 起源]  
  7. 逆向最大匹配: [研究, 生命, 的, 起源]  
  8. 正向最大匹配: [长春市, 长春, 节, 致辞]  
  9. 逆向最大匹配: [长春, 市长, 春节, 致辞]  
  10. 正向最大匹配: [他, 从, 马上, 下来]  
  11. 逆向最大匹配: [他, 从, 马上, 下来]  
  12. 正向最大匹配: [乒乓球拍, 卖完, 了]  
  13. 逆向最大匹配: [乒乓球拍, 卖完, 了]  
  14. 正向最大匹配: [咬, 死, 猎人, 的, 狗]  
  15. 逆向最大匹配: [咬, 死, 猎人, 的, 狗]  
  16. 正向最大匹配: [大学生, 活象, 白纸]  
  17. 逆向最大匹配: [大学生, 活象, 白纸]  
  18. 正向最大匹配: [他, 有, 各种, 才能]  
  19. 逆向最大匹配: [他, 有, 各种, 才能]  
  20. 正向最大匹配: [有意, 见, 分歧]  
  21. 逆向最大匹配: [有, 意见分歧]  

 

 

参考资料:

1、中文分词十年回顾

2、中文信息处理中的分词问题

3、汉语自动分词词典机制的实验研究

4、由字构词_中文分词新方法

5、汉语自动分词研究评述

 

NUTCH/HADOOP视频教程

分享到:
评论

相关推荐

    中文分词程序-正向最大匹配算法及逆向最大匹配算法

    在这个“中文分词程序”中,包含了两种常见的分词算法:正向最大匹配算法(Forward Maximum Matching, FMM)和逆向最大匹配算法(Backward Maximum Matching, BMM)。 正向最大匹配算法是一种自左向右的分词策略。...

    最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码

    逆向最大匹配分词算法(Reverse Maximum Matching,RMM)是一种常见的中文分词技术,广泛应用于自然语言处理、搜索引擎和信息检索等领域。该算法的基本思想是从待分词文本的末尾开始,向前寻找最长的已存在于词典中...

    基于正向、逆向的最大分词算法实现

    总之,“基于正向、逆向的最大分词算法实现”是一个涵盖了词典管理、搜索策略、歧义解决等多个方面的综合性任务。通过理解和运用这些算法,我们可以构建高效、准确的中文分词系统,为后续的自然语言处理任务提供强大...

    基于逆向匹配的中文分词算法

    通过与其他分词算法(如正向最大匹配法、双向最大匹配法等)进行对比,可以更直观地看出基于逆向匹配的中文分词算法的优势与不足。实验结果表明,RMM算法在处理未登录词方面表现更优,尤其是在处理长难句时能够保持...

    基于逆向最大匹配算法的中文分词的设计与开发

    ### 基于逆向最大匹配算法的中文分词的设计与开发 #### 一、中文分词概述 中文分词是自然语言处理(NLP)领域中的一个基础且关键的环节,涉及将连续的中文文本切分成有意义的词汇单元。与英文等其他语言不同,中文...

    中文分词-正向最大匹配法和逆向最大匹配法的实现

    需要注意的是,Python提供了许多现成的中文分词库,如jieba,它们已经实现了包括正向、逆向匹配在内的多种分词算法,并且优化了性能。但在学习和理解分词原理时,自己动手实现这些方法是非常有益的。 总的来说,...

    python正向最大匹配分词和逆向最大匹配分词

    在本文中,我们将讨论 Python 实现的正向最大匹配分词和逆向最大匹配分词算法,并提供完整的源代码。 正向最大匹配分词 正向最大匹配分词是一种常用的分词算法,它从左到右扫描输入字符串,并尽可能地找到最长的...

    正向最大匹配中文分词算法

    但不管实现如何,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    2、中文分词算法 之 基于词典的逆向最大匹配算法 3、中文分词算法 之 词典机制性能优化与测试 4、中文分词算法 之 基于词典的正向最小匹配算法 5、中文分词算法 之 基于词典的逆向最小匹配算法 5、Java开源项目...

    Java实现分词(正向最大匹配和逆向最大匹配)两种方法实现

    本文将详细介绍如何利用Java编程语言来实现两种常见的分词算法——正向最大匹配法(FMM)和逆向最大匹配法(BMM),并给出具体的代码示例。 #### 二、正向最大匹配法(FMM) 正向最大匹配法的基本思路是从待分析...

    一种基于改进最大匹配快速中文分词算法

    ### 基于改进最大匹配快速中文分词算法的知识点 #### 一、中文分词技术概述 中文分词作为自然语言处理中的基础步骤,在文本分析、机器翻译、信息检索等多个领域发挥着至关重要的作用。它主要负责将连续的中文字符...

    正向最大匹配算法实现中文分词

    目前,分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本程序实现了正向最大匹配...

    一个简单的分词系统(可以选择正向最大匹配分词或逆向最大匹配)

    在这个简单的分词系统中,提供了两种主要的分词算法:正向最大匹配(Forward Maximum Matching, FMM)和逆向最大匹配(Backward Maximum Matching, BMM)。下面我们将详细探讨这两种方法及其应用。 首先,正向最大...

    python前向逆向最大匹配分词

    **逆向最大匹配法**则与之相反,从文本末尾开始,每次尝试匹配词典中最长的词,直至无法匹配。逆向匹配可以较好地解决过分割问题,但在处理某些特定情况时可能会导致欠分割(merging),即将两个或更多词汇错误地...

    基于逆向最大匹配分词论文及java代码

    基于逆向最大匹配(Reversed Maximum Matching,RMM)的分词方法是一种广泛应用的中文分词算法。本篇论文和Java代码正是针对这一主题进行探讨和实现的。 逆向最大匹配法是一种从右到左寻找最长词典词的策略,与传统...

    基于Hash结构的逆向最大匹配分词算法的改进_丁振国1

    总结,基于Hash结构的逆向最大匹配分词算法改进是一种有效的策略,它通过优化数据结构和算法设计,实现了分词速度和准确性的双重提升,为中文信息处理领域提供了有力的技术支持。这一改进对于处理大规模中文文本数据...

    最大正向逆向分词算法

    总结,最大正向逆向分词算法是中文分词的一种高效策略,它结合了正向和逆向匹配的优势,既能快速处理大部分常见情况,又能较好地处理复杂语境和多义词问题。在实际的自然语言处理系统中,如搜索引擎、文本分析和机器...

    正向最大匹配(FMM)和逆向最大匹配(BMM)的分词系统

    正向最大匹配(Forward Maximum Matching, 简称FMM)和逆向最大匹配(Backward Maximum Matching, 简称BMM)是两种广泛应用的分词算法,它们在C#环境下被实现并封装在一个名为"FMM&BMM_WordDivise"的压缩包中。...

    最大逆向中文分词算法

    ### 最大逆向中文分词算法详解 #### 一、引言 中文分词作为自然语言处理中的基础任务之一,在信息检索、文本挖掘等领域扮演着重要角色。与英文等基于空格分隔的语言不同,中文词语之间没有明显的界限,因此需要...

Global site tag (gtag.js) - Google Analytics