当前位置: 首页 > 工具软件 > ansj_seg > 使用案例 >

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

上官波鸿
2023-12-01
首先之前的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:
[url]http://pan.baidu.com/s/1hspuLM0[/url]
 类似资料: