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

中文分词应用很广泛,网上也有很多开源项目。我在这里主要讲一下中文分词里面算法的简单实现,废话不多说了,现在先上代码

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("应聘");
	}

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

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

	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;
	}

	private int aheadCount(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(0, s.length())))) count ++;
		}
		return count;
	}

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

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

算法的核心就是从前往后搜索,然后找到最长的字典分词。

中文分词——正向最大匹配法,布布扣,bubuko.com

时间: 2024-11-03 21:22:54

中文分词——正向最大匹配法的相关文章

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

上一篇文章中介绍了正向最大匹配,可以看到有时候效果不是很好,这里在介绍一种逆向最大匹配的算法.词典和匹配的字符串都和上一篇文章相同 只是本算法是从后到前搜索字符串,然后找到最长的匹配结果输出.上代码 package com; import java.util.ArrayList; import java.util.List; public class Segmentation1 { private List<String> dictionary = new ArrayList<Strin

NLP: 中文分词---正向匹配 (Forward Matching)

在采用FMM (正向最大匹配) 进行中文分词的时候, 可能会存在比较多的交集歧义, 这个时候为了解决交集歧义的问题, 可以采用 FM (Forwar Matching, 正向匹配) 进行中文分词, 正向匹配会在最大匹配的路径上查找所有可能成词的term(这里所有可能成词的term的意思是在构建索引的时候所有切分出来的词, 因为不是路径上的所有节点都会是切分成的词). http://blog.csdn.net/watkinsong/article/details/37696389 这个文章中给出了

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

最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描).例如:词典中最长词为"中华人民共和国"共7个汉字,则最大匹配起始字数为7个汉字.然后逐字递减,在对应的词典中进行查找. 下面以"我们在野生动物园玩"为例详细说明一下正向与逆向最大匹配方法: 1.正向最大匹配法: 正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下

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

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

中文分词技术一:概念

分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行的一种技术.当然,我们在进行数据挖掘.精准推荐和自然语言处理工作中也会经常用到中文分词技术. 一.为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键. Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分.除此之外,还有最大切分(包括

中文分词技术(中文分词原理)

一.       为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键. Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分.除此之外,还有最大切分(包括向前.向后.以及前后相结合).最少切分.全切分等等. 二.       中文分词技术的分类 我们讨论的分词算法可分为三大类:基于字典.词库匹配的分词方法:基于词频度统计的分词方法

中文分词原理和实现

三大主流分词方法:基于词典的方法.基于规则的方法和基于统计的方法. 1.基于规则或词典的方法 定义:按照一定策略将待分析的汉字串与一个"大机器词典"中的词条进行匹配,若在词典中找到某个字符串,则匹配成功. 按照扫描方向的不同:正向匹配和逆向匹配 按照长度的不同:最大匹配和最小匹配 1.1正向最大匹配思想MM 从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数. 查找大机器词典并进行匹配: 若匹配成功,则将这个匹配字段作为一个词切分出来. 若匹配不成功,则将这个匹

中文分词学习整理

主要分为两大类 1. 字符串匹配(扫描字符串),发现子串与词匹配,就算是匹配 这类分词通常加入一些启发式规则,比如“正向/反向最大匹配”,“长词优先”等策略. 优点:速度快.O(n)时间复杂度. 缺点:歧义和未登陆词处理不好. 歧义的例子很简单"长春市/长春/药店" "长春/市长/春药/店". 未登录词即词典中没有出现的词,当然也就处理不好. ikanalyzer,paoding 等就是基于字符串匹配的分词 2. 基于统计及机器学习 这类分词基于人工标注的词性和统计

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

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