ansj_Seg5.0.1版本与lucene的集成以及ansj_seg 5.0.1使用

首先之前的ansj2.X版本需要导入两个包ansj_seg-2.0.8-min..jar、nlp-lang-0.2.jar。
现在只需要导入一个包就OK了 简单方便了ansj_seg-5.0.1-all-in-one.jar

好了不说了。直接贴与lucene的代码
其实就这么一句话,就OK了。
public static Analyzer analyzer = new AnsjAnalyzer(AnsjAnalyzer.TYPE.index);

public static void main(String[] args) throws IOException {
        Set<String> filter = new HashSet<String>() ;
        
        String stopDicStr = "y" ;  
        
        BufferedReader br = new BufferedReader(new StringReader(stopDicStr)) ;
        String temp = null ;
        while((temp=br.readLine())!=null){
            filter.add(temp) ;
        }
        
        StringReader reader = new StringReader("测试中华人名共和王y健") ;
        Tokenizer tokenizer = new AnsjTokenizer(new IndexAnalysis(reader), filter);
        while(tokenizer.incrementToken()){
            CharTermAttribute attribute = tokenizer.getAttribute(CharTermAttribute.class) ;
            System.out.println(attribute);
        }
    }

5.0.1 使用的jdk1.6.不过这里上传的包我处理过的。需要用jdk1.7的版本


public static void main(String[] args) {
		/**
		 * 这里我还是要说名下AnsjAnalyzer.TYPE里面有6个参数index, query, to, dic, user, search
		 * 这个6个参数使用的分词调用方式是不同的。具体调用的是什么分词方式。我下面贴ansj的源码
		 * 
		 */
        Analyzer ca = new AnsjAnalyzer(TYPE.index);        
        String content = "王占三李四王五,中华人名共和国xx格原信息技术有限公司" ;        
        try {
			TokenStream tokenStream = ca.tokenStream(content, new StringReader(content)) ;
			
			while(tokenStream.incrementToken()){
				CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class)  ;
				System.out.println(attribute);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        ca.close();

	}



/**
	 * 获得一个tokenizer就是这段了
	 * IndexAnalysis、DicAnalysis、ToAnalysis 三个调用方式
	 * @param reader
	 * @param type
	 * @param filter
	 * @return
	 */
	public static Tokenizer getTokenizer(BufferedReader reader, TYPE type, Set<String> filter) {
		Tokenizer tokenizer;

		switch (type) {
		case index:
			if (reader == null) {
				tokenizer = new AnsjTokenizer(new IndexAnalysis(), filter);
			} else {
				tokenizer = new AnsjTokenizer(new IndexAnalysis(reader), filter);
			}
			break;
		case dic:
		case user:
			if (reader == null) 
				tokenizer = new AnsjTokenizer(new DicAnalysis(), filter);
			} else {
				tokenizer = new AnsjTokenizer(new DicAnalysis(reader), filter);
			}
			break;

		case to:
		case query:
		case search:
			if (reader == null) {
				tokenizer = new AnsjTokenizer(new ToAnalysis(), filter);
			} else {
				tokenizer = new AnsjTokenizer(new ToAnalysis(reader), filter);
			}
			break;
		default:
			if (reader == null) {
				tokenizer = new AnsjTokenizer(new ToAnalysis(), filter);
			} else {
				tokenizer = new AnsjTokenizer(new ToAnalysis(reader), filter);
			}
		}

		return tokenizer;
	}

面向索引的分词-IndexAnalysis:
支持:用户自定义分词,数字识别、人名识别功能:
Result  term=  IndexAnalysis.parse("材米油盐是一个主副食品");
	     System.out.println(term.toString());
	     Iterator<Term> it=term.iterator();
	     while(it.hasNext()){
	    	 org.ansj.domain.Term t=it.next();
	    	 if(t.getNatureStr() !=null && !(t.getNatureStr().equalsIgnoreCase("null"))&& t.getNatureStr().startsWith("n")){
	    		 System.out.println(t.getNatureStr());
		    	 System.out.println(t.getName());
	    	 }
	     }

材/ng,米/q,油盐/n,油/n,盐/n,是/v,一个/m,一/m,个/q,主副食品/n,主副食/n,主/ag,副食品/n,副食/n,副/b,食品/n,食/v,品/ng


用户自定义词典优先级升高-DicAnalysis:
如果你有自定义词库用这个很好

精准分词-ToAnalysis。



好吧,最后说下ansj_seg5.X升级的内容:
1、支持自训练CRF模型的加载。目前支持CRF++ 及 Wapiti两种模型。并提供训练语料的生成工具。
2、将默认crfmodel移动到jar包内。并压缩了大小控制在16m。
3、正式发布了DicAnalysis分词策略,使用户自定义词典优先级升高。如果你用户自定义词典足够强建议用这个方式的分词。
4、将分词结果封装为Result对象。这样便于对结果的二次处理。
5、增加Recognition接口,对结果的二次处理。可以通过链式调用的方式增加你的操作。同时6、去掉了FilterModifWord类,用Recognition重新来实现。
7、删除了DownLibrary.java 类的功能。不再提供自动下载模型的方式

原谅我吧。。。jar太大 ,eye不让上传 这里给你们一个百度云的链接地址:
JAR:
http://pan.baidu.com/s/1hspuLM0

猜你喜欢

转载自wj-geyuan.iteye.com/blog/2315466