今天遇到一个需求,需要用用户自定义词库的词性标注,替换系统原有词库的词性标注。也就是玉壶自定义词性覆盖系统原有词性。
废话不多说,直接上代码:
package org.ansj.demo;
import java.io.IOException;
import java.util.List;
import org.ansj.domain.Term;
import org.ansj.recognition.NatureRecognition;
import org.ansj.splitWord.analysis.ToAnalysis;
/**
* 词性标注
*
* @author ansj
*
*/
public class NatureDemo {
public static void main(String[] args) throws IOException {
List<Term> terms = ToAnalysis.parse("Ansj中文分词是一个真正的ict的实现.并且加入了自己的一些数据结构和算法的分词.实现了高效率和高准确率的完美结合!");
new NatureRecognition(terms).recognition();
System.out.println(terms);
}
}
1:List<Term> terms = ToAnalysis.parse("Ansj中文分词是一个真正的ict的实现.并且加入了自己的一些数据结构和算法的分词.实现了高效率和高准确率的完美结合!");用于对字符串进行分词,获得词元列表。
2:new NatureRecognition(terms).recognition();标注词性。
在标注词性的方法里面修改如下:
将原有方法:
/**
* 传入一组。词对词语进行。词性标注
* @param words
* @param offe
* @return
*/
public static List<Term> recognition(List<String> words, int offe) {
List<Term> terms = new ArrayList<Term>(words.size());
int tempOffe = 0;
String[] params = null;
for (String word : words) {
// 获得词性 , 先从系统辞典。在从用户自定义辞典
AnsjItem ansjItem = DATDictionary.getItem(word);
TermNatures tn = null;
if (ansjItem.termNatures != TermNatures.NULL) {
tn = ansjItem.termNatures;
} else if ((params = UserDefineLibrary.getParams(word)) != null) {
tn = new TermNatures(new TermNature(params[0], 1));
} else if(WordAlert.isEnglish(word)){
tn = TermNatures.EN ;
} else if(WordAlert.isNumber(word)){
tn = TermNatures.M ;
} else{
tn = TermNatures.NULL ;
}
terms.add(new Term(word, offe + tempOffe, tn));
tempOffe += word.length();
}
new NatureRecognition(terms).recognition();
return terms;
}
替换为:
/**
* 传入一组。词对词语进行。词性标注
* @param words
* @param offe
* @return
*/
public static List<Term> recognition(List<String> words, int offe) {
List<Term> terms = new ArrayList<Term>(words.size());
int tempOffe = 0;
String[] params = null;
for (String word : words) {
// 获得词性 , 先从系统辞典。在从用户自定义辞典
AnsjItem ansjItem = DATDictionary.getItem(word);
TermNatures tn = null;
if ((params = UserDefineLibrary.getParams(word)) != null) {
tn = new TermNatures(new TermNature(params[0], 1));
} else if (ansjItem.termNatures != TermNatures.NULL) {
tn = ansjItem.termNatures;
} else if(WordAlert.isEnglish(word)){
tn = TermNatures.EN ;
} else if(WordAlert.isNumber(word)){
tn = TermNatures.M ;
} else{
tn = TermNatures.NULL ;
}
terms.add(new Term(word, offe + tempOffe, tn));
tempOffe += word.length();
}
new NatureRecognition(terms).recognition();
return terms;
}
在用户自定义词库中添加一条记录:
数据结构 userDefine 521
就可以看到分词结果变化如下:
由原来的:
[Ansj/en, 中文/nz, 分词/n, 是/v, 一个/m, 真正/d, 的/uj, ict/en, 的/uj, 实现/v, ./m, 并且/c, 加入/v, 了/ul, 自己/r, 的/uj, 一些/m, 数据结构/gi, 和/c, 算法/n, 的/uj, 分词/n, ./m, 实现/v, 了/ul, 高效率/nz, 和/c, 高/a, 准确率/n, 的/uj, 完美/a, 结合/v, !]
变为:
[Ansj/en, 中文/nz, 分词/n, 是/v, 一个/m, 真正/d, 的/uj, ict/en, 的/uj, 实现/v, ./m, 并且/c, 加入/v, 了/ul, 自己/r, 的/uj, 一些/m, 数据结构/userDefine, 和/c, 算法/n, 的/uj, 分词/n, ./m, 实现/v, 了/ul, 高效率/nz, 和/c, 高/a, 准确率/n, 的/uj, 完美/a, 结合/v, !]
可以看到“数据结构”的此行已经变成了我们自己定义的词性。
程序猿行业技术生活交流群:181287753(指尖天下),欢迎大伙加入交流学习。
分享到:
相关推荐
ansj_seg-3.7.6,由于maven库无法访问下载,只能直接引用jar包了。
ansj_seg-3.7.6-on的jar包,有需要的朋友可以自行下载!
ansj_seg-5.1.2.jar分词架包 5.1.2版本,ansj_seg-5.1.2.jar
ansj_seg-5.1.1.jar
ansj_seg-master
目前实现了:中文分词、中文姓名识别、用户自定义词典、关键字提取、自动摘要、关键字标记等功能。可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目。作者在最新的分词方式里增加了基于深度学习的...
ansj_seg5.1.6.jar nlp_lang_1.7.7.jar 实现Java分词技术的jar包
ansj_seg-5.0.0
ansj,做中文分词的好东西,非常的不错。希望对大家有用处
ansj_seg-3.7.2工具类
里面包含依赖包nlp-lang.jar
这是一个详细说明,实现中文分词功能,支持自定义分词逻辑
ansj_seg
ansj_seg-2.0.8.jar
ansj_seg-5.1.6.jar
本jar包是对ansj_seg-master文件中org.ansj.domain中的属性类进行了序列化,以便使属性对象可以在spark中传输。
ansj_seg-5.0.4-sources.jar
Ansj中文分词 使用帮助 开发文档:, 摘要 这是一个基于n-Gram+CRF+HMM的中文分词的java实现。... <artifactId>ansj_seg <version>5.1.1 调用demo 如果你第一次下载只想测试测试效果可以调用这个简易接口