-
Notifications
You must be signed in to change notification settings - Fork 2.3k
用户自定义词典
Ansj的一个喜人的功能就是支持用户自定义词典.
词典是基于tree_split项目来的.就是一个超级简单.做过一些优化的tire树结构.它具有使用灵活.内存占用小等特点
- 从文件中加载词典
- 配置文件
- 编码路径
- 从内存操作词典
- 增加
- 删除
- 修改
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);
}
}