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

算法描述:

  1. S1为带切分字符串,S2为空,MaxLen为词典中的最大词长
  2. 判断S1是否为空,若是则输出S2
  3. 从S1右边开始,取出待处理字符串str(其中str的长度小于MaxLen)
  4. 查看str是否在词典中,若是则转5,若否则转6
  5. S2+=str+”/”,S1-=str,转2
  6. 将str最左边的一个字去掉
  7. 判断str是否为单字,若是则转5,若否则转4

Java实现代码:

 1 public static List<String> BMM(String text) {
 2         Stack<String> result = new Stack<String>();
 3         while (text.length() > 0) {
 4             int len = MAX_LENGTH;
 5             if (text.length() < len) {
 6                 len = text.length();
 7             }
 8             String tryWord = text.substring(text.length() - len);
 9             while (!DIC.contains(tryWord)) {
10                 if (tryWord.length() == 1) {
11                     break;
12                 }
13                 tryWord = tryWord.substring(1);
14             }
15             result.push(tryWord);
16             text = text.substring(0, text.length() - tryWord.length());
17         }
18         int len = result.size();
19         List<String> list = new ArrayList<String>(len);
20         for (int i = 0; i < len; i++) {
21             list.add(result.pop());
22         }
23         return list;
24     }

小结:

逆向最大匹配也是中文分词基本算法之一,因为是机械切分,所以它也有分词速度快的有点,最大逆向匹配比起正向最大匹配更符合人们的语言习惯,在上篇提到的“长春市长春节快乐”这句话它能完美的切分,但是它还是有局限性比如在切分“长春药店”、“画上荷花和尚画”这类句字时它的表现就没有正向最大匹配好,所以在此基础上我们可以使用双向最大匹配来解决此类问题。

时间: 2024-10-08 20:05:24

中文分词常用算法之基于词典的逆向最大匹配的相关文章

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

算法描述: S1为带切分字符串,S2为空,MaxLen为词典中的最大词长 判断S1是否为空,若是则输出S2 从S1左边开始,取出待处理字符串str(其中str的长度小于MaxLen) 查看str是否在词典中,若是则转5,若否则转6 S2+=str+”/”,S1-=str,转2 将str最右边的一个字去掉 判断str是否为单字,若是则转5,若否则转4 Java实现代码: 1 public static List<String> FMM(String text) { 2 List<Strin

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

算法描述: S1为带切分字符串,FMM为S1正向最大匹配切分结果,BMM为S1逆向最大匹配切分结果 如果FMM和BMM长度不相等则输出长度较短的那个否则转3 如果FMM和BMM的结果相同则输出任意一个否则输出单个字字数最少的结果 Java实现代码: 1 public static List<String> SegDouble(String text) { 2 List<String> FMM = FMM(text); 3 List<String> BMM = BMM(t

中文分词算法 之 基于词典的全切分算法

在使用 基于词典 的分词方法的时候,如果我们解决了下面4个问题: 1.如何把一句话中所有的词找出来呢?只要词典中有就一定要找出来. 2.如何利用1中找出来的词组合成完整的句子?组合成的句子要和原句一样. 3.如何保证2中组合而成的句子包含了所有可能的词序? 4.如何从所有可能的词序中选择最完美的一种作为最终的分词结果? 那么我们的分词方法称之为:基于词典的全切分算法. 下面我们以一个实例来说明,比如句子:中华人民共和国. 假设词典中包含如下词: 中华人民共和国 中华人民 中华 华人 人民共和国

深度解析中文分词器算法(最大正向/逆向匹配)

中文分词算法概述: 1:非基于词典的分词(人工智能领域) 相当于人工智能领域计算.一般用于机器学习,特定领域等方法,这种在特定领域的分词可以让计算机在现有的规则模型中, 推理如何分词.在某个领域(垂直领域)分词精度较高.但是实现比较复杂. 例:比较流行的语义网:基于本体的语义检索. 大致实现:用protege工具构建一个本体(在哲学中也叫概念,在80年代开始被人工智能),通过jena的推理机制和实现方法. 实现对Ontology的语义检索. Ontology语义检索这块自己和一朋友也还在琢磨,目

大数据算法-&gt;推荐系统常用算法之基于内容的推荐系统算法

港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一个好的商品,向朋友安利之类的.在以前广告系统不发达的时候,我们也是靠口口相传来进行商品的推广.那么为什么,现在推荐系统变的非常重要了呢?,在以前,我们的商品不像现在的物品一样琳琅满目,我们有时间,可以把商品都浏览一遍在进行选择,因为我们都想选择所有商品中最好的,而现在,由于资源的众多,我们不会用大把

中文分词算法综述

英文文本词与词之间以空格分隔,方便计算机识别,但是中文以字为单位,句子所有字连起来才能表达一个完整的意思.如英文"I am writing a blog",英文词与词之间有空格进行隔开,而对应的中文"我在写博客",所有的词连在一起,计算机能很容易的识别"blog"是一个单词,而很难知道"博"."客"是一个词,因此对中文文本序列进行切分的过程称为"分词".中文分词算法是自然语言处理的基础,

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

中文分词选取-依概率选取

上一篇文章中介绍了一种中文分词的选取算法,本篇文章将介绍另外一种中文分词选取算法,依概率选取算法. 中文分词分词完成之后,还是上篇文章中的原则,分词结果不唯一,然后我们算法的目的是从几种分词好的算法之后选取一个作为分词的最终结果.算法会统计每个词在所有文档中的概率,该算法的中心思想是计算一个字符串中所有分词的概率之积,选取概率最大的作为分词的最终结果. 算法步骤:第一步,通过上几篇文章的的算法对字符串进行分词:第二步,扫描每一次分词结果:第三步,计算每一次分词结果的所有词的概率之积:第四步,选出

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

中文分词应用很广泛,网上也有很多开源项目.我在这里主要讲一下中文分词里面算法的简单实现,废话不多说了,现在先上代码 package com; import java.util.ArrayList; import java.util.List; public class Segmentation1 { private List<String> dictionary = new ArrayList<String>(); private String request = "北京