本文作者王大锤实现了最长正向匹配算法与最长逆向匹配算法,同时,也顺便写了将两种算法判断取最优的一种的算法。
如下:
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{
//}
}
}
}
分享到:
相关推荐
北邮 计算机院 自然语言处理 中文分词程序
HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP提供下列功能: 中文...
中文分词一直都是中文自然语言处理领域的基础研究。目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率。而且不少中文分词软件支持Lucene扩展。但不管实现如何,目前而言的分词系统...
自然语言处理课程的小作业,以新闻语料为基础,用HMM算法实现中文分词。按照每个字为B,E,S,M进行划分。以新闻语料为基础,用HMM算法实现中文分词。按照每个字为B,E,S,M进行划分。
中文分词一直都是中文自然语言处理领域的基础研究。目前,分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种...
细介绍自然语言处理各主要领域的原理以Java 实现,包括中文分词、词性标注、依存句法分析等。其中详细介绍了中文分词和词性标注的过程及相关算法,如隐马尔可夫模型等。在自然语言处理的应用领域主要介绍了信息抽取...
中文分词一直都是中文自然语言处理领域的基础研究。目前,分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种...
自然语言处理(汉语)算法实现,Java语言实现,经过优化,效率很高。主要包括: 1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给...
自然语言处理实验。三个实验,包括nltk基本使用,最大匹配算法,文本分类。 第一个实验是了解一些语料库的使用和corpus接口,玩玩chatbots,srparser。 第二个实验是最大匹配算法实现中文分词。 第三个实验是根据...
《统计自然语言处理》全面介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,内容包括形式语言与自动机及其在自然语言处理中的应用、语言模型、隐马尔可夫模型、语料库技术、汉语自动分词与词性标注、句法...
这是一篇关于自然语言处理的论文,介绍了汉语分词的n-gram算法,绝对值得推荐
本课程将首先介绍自然语言处理的发展现状与挑战,同时,讲解深度学习和自然语言处理的结合应用。除了基本算法外,本课程还配备实践环节,从一些典型的方向:机器翻译、文本分类、问答等。最后,将和大家讨论NLP的...
自然语言处理(汉语)算法实现,Java语言实现,经过优化,效率很高。主要包括: 1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给...
遗忘算法演示程序及源码,功能包括词库生成、分词、词权重计算。是CSDN博文《非主流自然语言处理——遗忘算法系列》的配套资源。作者老憨欢迎交流讨论。
HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。 HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点
中文分词是自然语言处理的前提和基础,利用分类效果较好的交叉覆盖算法实现中文分词。
python自制自然语言处理系统 实现: 分词:使用jieba中文分词(去停用词,精确模式); 词性标注:使用jieba库里的posseg包进行词性标注; 关键词提取:基于lda模型结合tfidf的最合适前六个词; 文本分类:给复旦...
该模型使用了HMM(隐马尔可夫)模型建立中文分词程序,使用了词性标注的思想进行中文分词,更加适合自然语言处理方向的新手进行学习!