中文分词--逆向最大匹配

上一篇文章中介绍了正向最大匹配,可以看到有时候效果不是很好,这里在介绍一种逆向最大匹配的算法。词典和匹配的字符串都和上一篇文章相同

只是本算法是从后到前搜索字符串,然后找到最长的匹配结果输出。上代码


package com;

import java.util.ArrayList;
import java.util.List;

public class Segmentation1 {
	private List<String> dictionary = new ArrayList<String>();
	private String request = "北京大学生前来应聘";

	public void setDictionary() {
		dictionary.add("北京");
		dictionary.add("北京大学");
		dictionary.add("大学");
		dictionary.add("大学生");
		dictionary.add("生前");
		dictionary.add("前来");
		dictionary.add("应聘");
	}

	private boolean isIn(String s, List<String> list) {
		for(int i=0; i<list.size(); i++) {
			if(s.equals(list.get(i))) return true;
		}
		return false;
	}

	public String rightMax() {
		String response = "";
		String s = "";
		for(int i=request.length()-1; i>=0; i--) {
			s = request.charAt(i) + s;
			if(isIn(s, dictionary) && tailCount(s, dictionary)==1) {
				response = (s + "/") + response;
				s = "";
			} else if(tailCount(s, dictionary) > 0) {

			} else {
				response = (s + "/") + response;
				s = "";
			}
		}
		return response;
	}

	private int tailCount(String s, List<String> list) {
		int count = 0;
		for(int i=0; i<list.size(); i++) {
			if((s.length()<=list.get(i).length()) && (s.equals(list.get(i).substring(list.get(i).length()-s.length(), list.get(i).length())))) count ++;
		}
		return count;
	}

	public static void main(String[] args) {
		Segmentation1 seg = new Segmentation1();
		seg.setDictionary();
		String response2 = seg.rightMax();
		System.out.println(response2);
	}
}

可以看到运行结果是:北京/大学生/前来/应聘/

分词效果很好

中文分词--逆向最大匹配,布布扣,bubuko.com

时间: 2024-10-23 03:22:52

中文分词--逆向最大匹配的相关文章

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

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

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

算法描述: 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> BMM(String text) { 2 Stack<Stri

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

算法描述: 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

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

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

NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

最近接触NLP中文分词, 在lunr.js的基础上, 实现了中文的最大正向匹配分词. 某些情况下, 我们在服务器端进行中文文本分词可以使用完整的基于mmseg算法的分词模块, 例如nodejieba, node-segment, 盘古分词等等,  但是在客户端环境下, 我们不能使用这些复杂的分词算法进行分词, 这个时候可以根据已经生成的索引进行简单的客户端分词, 就是所说的FMM (Forward Maximum Matching, 正向最大匹配), 有时候也可以使用正向匹配. 在做FMM的时候

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

算法描述: 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

中文分词选取-不成词个数判断法

运用前面几篇文章中的分词算法,可以把中文中的词语分出来,但是不同算法可能得到的分词结果不一样,到底如何确定那种分词效果最好呢.我们在这篇文章中探讨一种判断分词效果好坏的方法. 在分词的时候,有些单字是不成词的.可以搜索所有分词的可能性,然后对每一种分词结果进行统计,规则如下:每分出一个词就给分词统计结果加一,如果遇到不成词的单字就再给该分词结果加一.得到的结果分别计算出来.选出一个得分最低的就是所要分词的字符串的结果. 下面就用代码实现一下上面的思想.分别用正向最大匹配和逆向最大匹配,然后在对分

搜索引擎技术揭密:中文分词技术

http://www.williamlong.info/archives/333.html 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.中国搜索等大型搜索引擎一直是人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商机搜索.8848的购物搜索等也陆续面世,自然,搜索引擎技术也成为技术人员关注的热点. 搜索引擎技术的研究,国外比中国要早近十年,从最早的Archie,到后来的Excite,以及altvista.overture.g

中文分词与搜索引擎

看到题目就知道我要说什么了,这个话题好像已经被讨论过n次了,看雅虎搜索blog上在06年就有过专题系列文章,地址为:http://ysearchblog.cn/2006/07/post_16.html,文中详细的介绍了有关中文分词的意义,算法,跟搜索引擎的关系等等.个人认为文章质量非常不错.其实我所写的也不外乎这些东西,可我为什么还要写呢?是因为我花了将近一周的时间来理解中文分词,收集有关资料,为了不让努力白费,我还是总结一下吧. 一.为什么要中文分词? 对啊,为何要分词,不分词行不行?要讨论这