`
yucang52555
  • 浏览: 70209 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ansj_seg源码分析之用户自定义词性覆盖系统原有词性

阅读更多
    今天遇到一个需求,需要用用户自定义词库的词性标注,替换系统原有词库的词性标注。也就是玉壶自定义词性覆盖系统原有词性。
    废话不多说,直接上代码:
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(指尖天下),欢迎大伙加入交流学习。
0
0
分享到:
评论
5 楼 yucang52555 2015-01-23  
yeyefengiswo 写道
我手动添加了词库且有与default.dic重合的部分,但是还是获取不到自定义的词性,获取的仍然是原始词性

这是因为源码里面的词性匹配顺序,默认先匹配系统词库中的词性。改一下源代码的加载顺序就好了。
4 楼 yeyefengiswo 2015-01-21  
大神,你出现下了,其他的词也可以吗?比如"教授"一词
3 楼 yeyefengiswo 2015-01-20  
我手动添加了词库且有与default.dic重合的部分,但是还是获取不到自定义的词性,获取的仍然是原始词性
2 楼 yucang52555 2014-12-23  
qindongliang1922 写道
词性,是自己定义的词库,ansj原本不带这种功能么

ansj自带有词性标注,但是ansj默认先识别核心词库,如果出现用户自定义词库与核心词库冲突,则以核心词库为准,此文是针对这一需求修改。
1 楼 qindongliang1922 2014-12-12  
词性,是自己定义的词库,ansj原本不带这种功能么

相关推荐

    ansj分词ansj_seg-5.1.5.jar

    它支持自定义词典,允许用户根据实际需求添加或删除词汇,提高了分词的准确性。此外,ANSJ还支持繁体分词、英文分词以及数字识别,对于混合语言的处理有显著优势。 在标题提到的"ansj_seg-5.1.5.jar"中,"seg"代表...

    ansj_seg-master

    其次,ansj_seg-master支持自定义词典,用户可以根据实际需求添加或删除特定词汇,以适应特定领域的分词工作。这对于处理行业术语或者特定主题的文本非常有用。此外,该工具还提供了词语关系识别、关键词提取等功能...

    ansj_seg-master_java_中文自然语言_

    ansj_seg是一个Java实现的中文分词工具,它不仅提供了基本的分词功能,还支持用户自定义分词逻辑,这使得它具有很高的灵活性和适应性,可以广泛应用于各种中文文本处理场景,如搜索引擎、聊天机器人、情感分析等。...

    ansj_seg-5.1.3

    这个库不仅包括了常用的词典和模型,还包含了对中文字符编码、停用词处理、词性标注等功能的支持,使得ansj_seg能够更好地处理各种中文文本。 在"ansj_seg-5.1.3-javadoc.jar"中,包含了详细的API文档,这对于...

    ansj_seg.jar nlp-lang-1.7.7.jar

    在给定的压缩包中,包含两个重要的jar包:`ansj_seg-5.1.6.jar`和`nlp-lang-1.7.7.jar`,它们分别是ANSJ分词库和NLP工具包的不同版本。 **ANSJ分词库**是由易开源社区开发的一款高效的中文分词工具,其全称为...

    ansj分词.ict的真正java实现.分词效果速度都超过开源版的ict._中文分词,人名识别,词性_ansj_seg.zip

    ansj分词.ict的真正java实现.分词效果速度都超过开源版的ict._中文分词,人名识别,词性_ansj_seg

    ansj_seg:ansj分词.ict的真正java实现.分词效果速度都超过开源版的ict. 中文分词,人名识别,词性标注,用户自定义词典

    目前实现了中文分词、中文姓名识别、用户自定义词典、关键字提取、自动摘要、关键字标记等功能。 可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目。 maven &lt;groupId&gt;org.ansj &lt;artifactId&gt;...

    ansj所需jar及library

    ANSJ全称为“Any Natural Language Processing”,它是一个强大的中文分词、词性标注、命名实体识别和依存句法分析的开源库。这个标题暗示我们将探讨如何在Java项目中集成和使用这两个核心的jar文件:ansj_seg-5.1.6...

    ansj语义分析

    在"ansj_seg-master"这个压缩包中,包含了ansj语义分析库的源代码、文档和示例,用户可以通过阅读源码和运行示例来了解其工作原理并进行二次开发。对于希望深入学习和使用ansj的人来说,这是一个很好的起点。 总的...

    ansj0.9.jar 和 tree_split.jar

    ANSJ(全称Automatic NLP Simple Job)是由李航开发的一款开源中文分词和词性标注工具,它的主要功能是对中文文本进行快速准确的分词处理。ANSJ库包含了多种分词算法,如最大匹配法、HMM(隐马尔科夫模型)等,支持...

    人工智能-项目实践-文本分类-基于朴素贝叶斯实现的一款微信公众号文章分类器

    系统中使用了两个分词器,Ansj(默认)[https://github.com/NLPchina/ansj_seg] 和HanLp [https://github.com/hankcs/HanLP], 这里表示感谢。 根目录下的library/是Ansj所需要的文件 如有其他分词,则可以实现...

    ansj中文分词工具

    ansj(Ansj for NLP,自然语言处理)是由李东创建并维护的一款高性能、高准确度的中文分词和词性标注系统。它基于字典匹配和统计模型相结合的方法,能够处理各种复杂语境下的中文分词问题,广泛应用于搜索引擎、信息...

    Anjs的两个jar

    Anjs,全称为“Ansj for JavaScript”,是一个用于JavaScript的中文分词库,它提供了强大的中文处理能力,包括分词、词性标注等。在Java领域,Anjs也有其对应的实现,通过Java版本的jar包可以供Java项目使用。在这个...

    分词工具源码

    本文将深入探讨“分词工具源码”,特别是基于Java的实现,以及与之相关的ansj库。 首先,分词是将连续的文本序列划分为具有独立语义的词汇单元的过程。在中文文本中,由于没有明显的空格或标点作为词的边界,分词...

Global site tag (gtag.js) - Google Analytics