首先我们查看IKAnalyzer的源码,看词典存储位置:
class DictSegment implements Comparable<DictSegment>{
//公用字典表,存储汉字
private static final Map<Character , Character> charMap = new HashMap<Character , Character>(16 , 0.95f);
//数组大小上限
private static final int ARRAY_LENGTH_LIMIT = 3;
..................
}
我们可以看到org.wltea.analyzer.dic.DictSegment.charMap是用来公用字典表,存储汉字,那么我们可以在加载词典的时候清空之。
在加入词典的时候可以通过配置文件的方式,但是一般不很现实,有时候需要用户维护动态的字典,那么字典就应该以List的形式加入,我们发现Dictionary.loadExtendWords(List extWords)可以以List的形式加入,代码如下:
Dictionary.loadExtendWords(Utils.getDicList());
综上整体代码如下:
Class ownerClass = Class.forName("org.wltea.analyzer.dic.DictSegment");
Field fs = ownerClass.getDeclaredField("charMap");
fs.setAccessible(true);
Map map = (Map) fs.get(ownerClass);
map.clear();
Dictionary.loadExtendWords(Utils.getDicList());
PS:上述代码仅适用IKAnalyzer 3.2.*,发现2012的代码已经修改成单利了,同时接口变动比较大,采用100w的文章对之切词发现速度没有声明的那么快。