`
wangqisen
  • 浏览: 46801 次
文章分类
社区版块
存档分类
最新评论

自然语言处理之分词算法的实现

 
阅读更多

本文作者王大锤实现了最长正向匹配算法与最长逆向匹配算法,同时,也顺便写了将两种算法判断取最优的一种的算法。

如下:

package nlp;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.Map.Entry;

public class Proj2 {
	
	private String dicPath;
	private Map<String,String> map;
	private String word;
	private static final int MAXLEN=7;
	
	public Proj2(String dicPath){
		this.map=new HashMap<String,String>();
		this.dicPath=dicPath;
	}
	
	public void handle(){
		try {
			BufferedReader br = new BufferedReader(new FileReader(dicPath));
			while(true){
				String line=br.readLine();
				if(line==null)
					break;
				line=new String(line.getBytes(),"utf8");
				String key;
				for(int i=0;i<line.length();i++){
					if(line.charAt(i)==','){
						int pos=i;
						key=line.substring(0,pos);
						String value=line.substring(pos+1,line.length());
						map.put(key,value);
						break;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public String getWord(){
		return word;
	}
	
	public void getInput(String word){
		this.word=word;
	}
	
	public void FMM(String s,String words[]){
		int k=0;
		int index=0;
		int len=s.length();
		int mLen=MAXLEN;
		while(index<s.length()){
			for(mLen=MAXLEN;mLen>1&&index<s.length();mLen--){
				if(index+mLen>s.length()){
					continue;
				}
				if(map.containsKey(s.substring(index,index+mLen))){
					//System.out.print(s.substring(index,index+mLen)+"|");
					words[k++]=s.substring(index,index+mLen);
					index+=mLen;
					break;
				}
			}
			if(mLen==1){
				//System.out.print(s.charAt(index)+"|");
				words[k++]=s.substring(index,index+1);
				index++;
			}
		}
	}//姝e悜姣旇緝
	
	public void BMM(String s,String words[]){
		int k=0;
		int len=s.length();
		int index=len-1;
		int mLen=MAXLEN;
		while(index>=0){
			for(mLen=MAXLEN;mLen>1&&index>=0;mLen--){
				if(index+1-mLen<0)
					continue;
				if(map.containsKey(s.substring(index+1-mLen,index+1))){
					//System.out.print(s.substring(index+1-mLen,index+1));
					words[k++]=s.substring(index+1-mLen,index+1);
					index-=mLen;
					break;
				}
			}
			if(mLen==1){
				if(index>=1){
					//System.out.print(s.charAt(index));
					words[k++]=s.substring(index,index+1);
					index--;
				}else{
					words[k++]=s.substring(index,index+1);
					//System.out.print(s.charAt(index));
					break;
				}
			}
		}
		
	}//閫嗗悜姣旇緝
	
	
	public int compare(String[]fWords,String[]bWords){
		int nWords[]=new int[2];
		int sWords[]=new int[2];
		int tWords[]=new int[2];
		Arrays.fill(nWords,0);
		Arrays.fill(sWords,0);
		Arrays.fill(tWords,0);
		int i;
		for(i=0;i<fWords.length;i++){
			if(fWords.equals(""))
				break;
			if(!map.containsKey(fWords[i])){
				nWords[0]++;
			}
			if(map.containsKey(fWords[i])&&fWords[i].length()==1)
				sWords[0]++;
		}
		tWords[0]=i;
		
		for(i=0;i<bWords.length;i++){
			if(bWords.equals(""))
				break;
			if(!map.containsKey(bWords[i]))
				nWords[1]++;
			if(map.containsKey(bWords[i])&&bWords[i].length()==1)
				sWords[1]++;
		}
		tWords[1]=i;
		
		int total1=nWords[0]+sWords[0]+tWords[0];
		int total2=nWords[1]+sWords[1]+tWords[1];
		if(total1>total2)
			return 1;
		else 
			return 0;
	}
	
	public static void main(String args[]) throws Exception{
		int MAXSIZE=100;
		Proj2 p=new Proj2("d:\\ce.txt");
		p.handle();
		while(true){
			BufferedReader buffer=new BufferedReader(new InputStreamReader(System.in));   
			String str=buffer.readLine();
			p.getInput(str);
			String[] fWords=new String[MAXSIZE];
			Arrays.fill(fWords,"");
			p.FMM(p.getWord(),fWords);
			//if(c==0){
			for(int i=0;i<fWords.length;i++){
				if(fWords[i]!="")
					System.out.print(fWords[i]+"|");
			}
			System.out.println();
			//}else{
			//}
		}
	}
	
	
}


分享到:
评论

相关推荐

    自然语言处理-中文分词程序

    北邮 计算机院 自然语言处理 中文分词程序

    Android代码-Java 实现的自然语言处理中文分词

    HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP提供下列功能: 中文...

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

    中文分词一直都是中文自然语言处理领域的基础研究。目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率。而且不少中文分词软件支持Lucene扩展。但不管实现如何,目前而言的分词系统...

    HMM实现中文分词python实现作业

    自然语言处理课程的小作业,以新闻语料为基础,用HMM算法实现中文分词。按照每个字为B,E,S,M进行划分。以新闻语料为基础,用HMM算法实现中文分词。按照每个字为B,E,S,M进行划分。

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

    中文分词一直都是中文自然语言处理领域的基础研究。目前,分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种...

    自然语言处理原理与技术实现(java)传错了大家别下

    细介绍自然语言处理各主要领域的原理以Java 实现,包括中文分词、词性标注、依存句法分析等。其中详细介绍了中文分词和词性标注的过程及相关算法,如隐马尔可夫模型等。在自然语言处理的应用领域主要介绍了信息抽取...

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

    中文分词一直都是中文自然语言处理领域的基础研究。目前,分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种...

    自然语言处理全集

    自然语言处理(汉语)算法实现,Java语言实现,经过优化,效率很高。主要包括: 1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给...

    自然语言处理课程实验部分参考代码

    自然语言处理实验。三个实验,包括nltk基本使用,最大匹配算法,文本分类。 第一个实验是了解一些语料库的使用和corpus接口,玩玩chatbots,srparser。 第二个实验是最大匹配算法实现中文分词。 第三个实验是根据...

    宗成庆统计自然语言处理 .pdf

    《统计自然语言处理》全面介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,内容包括形式语言与自动机及其在自然语言处理中的应用、语言模型、隐马尔可夫模型、语料库技术、汉语自动分词与词性标注、句法...

    N-gram模型和机器学习的汉语分词算法

    这是一篇关于自然语言处理的论文,介绍了汉语分词的n-gram算法,绝对值得推荐

    自然语言处理之AI深度学习实战视频教程

    本课程将首先介绍自然语言处理的发展现状与挑战,同时,讲解深度学习和自然语言处理的结合应用。除了基本算法外,本课程还配备实践环节,从一些典型的方向:机器翻译、文本分类、问答等。最后,将和大家讨论NLP的...

    自然语言处理全集_代码结构说明.doc

    自然语言处理(汉语)算法实现,Java语言实现,经过优化,效率很高。主要包括: 1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给...

    遗忘算法(词库生成、分词、词权重)演示程序.rar

    遗忘算法演示程序及源码,功能包括词库生成、分词、词权重计算。是CSDN博文《非主流自然语言处理——遗忘算法系列》的配套资源。作者老憨欢迎交流讨论。

    HanLP自然语言处理

    HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。 HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点

    一种改进的中文分词歧义消除算法研究

    中文分词是自然语言处理的前提和基础,利用分类效果较好的交叉覆盖算法实现中文分词。

    NLP:python自制自然语言处理系统.zip

    python自制自然语言处理系统 实现: 分词:使用jieba中文分词(去停用词,精确模式); 词性标注:使用jieba库里的posseg包进行词性标注; 关键词提取:基于lda模型结合tfidf的最合适前六个词; 文本分类:给复旦...

    使用HMM模型实现的中文分词程序

    该模型使用了HMM(隐马尔可夫)模型建立中文分词程序,使用了词性标注的思想进行中文分词,更加适合自然语言处理方向的新手进行学习!

Global site tag (gtag.js) - Google Analytics