Skip to content

用户自定义词典

Honghe edited this page Aug 13, 2018 · 16 revisions

Ansj的一个喜人的功能就是支持用户自定义词典.

词典是基于tree_split项目来的.就是一个超级简单.做过一些优化的tire树结构.它具有使用灵活.内存占用小等特点

Ansj目前支持以下的用户自定义词典的操作方式.

  • 从文件中加载词典
    • 配置文件
    • 编码路径
  • 从内存操作词典
    • 增加
    • 删除
    • 修改

ansj支持5种词典.分别为

DicLibrary,StopLibrary,CrfLibrary,AmbiguityLibrary,SynonymsLibrary.
词典各字段之间使用tab(\t)分割,而不是空格。

  • DicLibrary : 用户自定义词典,格式 词语 词性 词频, Demo example:
小	a	57969
高	a	57483
长	a	40281
重要	a	37557
老	a	33423
  • StopLibrary: 停用词词典,格式 词语 停用词类型[可以为空], example:
is
a
#
v	nature
.*了	regex
  • CrfLibrary: crf模型,格式 二进制格式,无例子,

  • AmbiguityLibrary: 歧义词典, 格式:'词语0 词性0 词语1 词性1.....'

习近平	nr
李民	nr	工作	vn
三个	m	和尚	n
的确	d	定	v	不	v
大	a	和尚	n
张三	nr	和	c
动漫	n	游戏	n
邓颖超	nr	生前	t 

SynonymsLibrary 同义词词典,格式'词语0 词语1 词语2 词语3',采用幂等策略,w1=w2 w2=w3 w1=w3

人类	生人	全人类
人手	人员	人口	人丁	口	食指
劳力	劳动力	工作者
匹夫	个人
家伙	东西	货色	厮	崽子	兔崽子	狗崽子	小子	杂种	畜生	混蛋	王八蛋	竖子	鼠辈	小崽子

从文件中加载词典/设置辞典路径

第二种 在自定义词典未加载前可以通过代码方式来加载

//分词调用前重新设定字典路径
MyStaticValue.ENV.put(DicLibrary.DEFAULT,"library/default.dic");

------------------5.1.0之前的版本分割线-------------------

从文件中加载词典/设置辞典路径

关于ansj分词用户自定义词典的路径设置

第一种.正规方式

简单起见,可以在项目根路径下创建library.properties,并且在library.properties中增加

#path of userLibrary
userLibrary=library/userLibrary/userLibrary.dic
ambiguityLibrary=/library/ambiguity.dic

第二种 在自定义词典未加载前可以通过代码方式来加载

MyStaticValue.userLibrary=[你的路径]

注意5.0.x以后的版本应按如下操作, userLibrary 改名为 dic

#path of userLibrary this is default library
dic=library/default.dic

第三种,调用api加载.在程序运行的任何时间都可以.动态价值

loadLibrary.loadLibrary(String path)方式加载

路径可以是具体文件也可以是一个目录 如果是一个目录.那么会扫描目录下的dic文件自动加入词典

动态添加

直接看例子.这个功能其实在tree-split中就已经存在的.

说明:

1..删除只能删除用户自定义词典的词.

2.对了分词默认把大写都转换为小写了.所以添加新词的时候要求必须是小写.

package org.ansj.demo;
import java.util.List;
import org.ansj.domain.Term;
import org.ansj.library.UserDefineLibrary;
import org.ansj.splitWord.analysis.ToAnalysis;
/**
* 动态添加删除用户自定义词典!
* 
* @author ansj
* 
*/
public class DynamicWordDemo {
public static void main(String[] args) {
// 增加新词,中间按照'\t'隔开
UserDefineLibrary.insertWord("ansj中文分词", "userDefine", 1000);
List<Term> terms = ToAnalysis.parse("我觉得Ansj中文分词是一个不错的系统!我是王婆!");
System.out.println("增加新词例子:" + terms);
// 删除词语,只能删除.用户自定义的词典.
UserDefineLibrary.removeWord("ansj中文分词");
terms = ToAnalysis.parse("我觉得ansj中文分词是一个不错的系统!我是王婆!");
System.out.println("删除用户自定义词典例子:" + terms);
}
}