//今天看了看IKanalyzer 扩充词汇看得我一头雾水 分词器的使用还没理解直接搞扩充词汇有点知识脱节
//谁能举个例看看怎么扩充????
网上提供的方法是:
.基于api 我的想法如下 利用一个数据库表保存实时动态添加的词元,如果对应的实体类有更新,就执行添加词元的操作 具体的话就是从数据库读取词元,然后存在List<String> termList,执行 Dictionary.loadExtendWords(termList); 其实就是监听,也可以利用线程池实时扫描,目的是知道系统正在添加词元到数据库表,然后就是加载词典了
2.IK的文档这么写道3.1基于 API的词典扩充
IK 分词器支持使用 API 编程模型扩充您的词典和停止词典。如果您的个性化词典
储于数据库中,这个方式应该对您适用。API 如下:
? 类org.wltea.analyzer.dic.Dictionary
说明: IK 分词器的词典对象。它负责中文词汇的加载,内存管理和匹配检索。
? public static void addWords(Collection<String> words)
说明:加载用户扩展的词汇列表到 IK 的主词典中,增加分词器的可识别词语
参数1:Collection<String> words , 扩展的词汇列表
返回值:无
? public static void disableWords(Collection<String> words)
说明:屏蔽词典中的词元
参数1:Collection<String> words, 待删除的词列表
返回值:无
3.2基于配置的词典扩充
IK 分词器还支持通过配置 IKAnalyzer.cfg.xml 文件来扩充您的专有词典以及停止
(过滤词典)。
1. 部署IKAnalyzer.cfg.xml
IKAnalyzer.cfg.xml 部 署 在 代 码 根 目 录 下 ( 对 于 web 项 目 , 通 常
WEB-INF/classes 目录)同 hibernate、log4j 等配置文件相同。
2. 词典文件的编辑与部署
选择ikanalyzer作分词组件,它的词典是自带的,然后用户可以在配置文件中加入扩展词典,也可以用api实现往里面加入新词 比如利用
Dictionary.loadExtendWords(List<String> l);
不过这个好像只是加载一次,下次再启动词典的时候就没有这些词了。 所以我改成从配置文件添加,但是词典加载之后好像并没有这些词。用
Dictionary.matchInMainDict("甲流".toCharArray());
,查看输出false.
然后把它写在扩展词典文件中(采用无boom的utf8格式),然后重新建索引
Analyzer a = new IKAnalyzer();
writer = new IndexWriter(index, a, this.create,new IndexWriter.MaxFieldLength(1000000));
再查询 甲流 的时候,用
keyword = "甲流";
IKQueryParser.parse("content", keyword);
然后搜索结果用
System.out.println("this document's score is " + docs[i].score);
System.out.println(search.searcher.explain(q, docs[i].doc));
输出的结果是这样的(以第一个结果为例):this document's score is NaN
2.5944433 = (MATCH) sum of:
1.1501259 = (MATCH) weight(content:甲 in 806), product of:
0.6658104 = queryWeight(content:甲), product of:
3.454815 = idf(docFreq=401, maxDocs=4681)
0.19271956 = queryNorm
1.7274075 = (MATCH) fieldWeight(content:甲 in 806), product of:
1.0 = tf(termFreq(content:甲)=1)
3.454815 = idf(docFreq=401, maxDocs=4681)
0.5 = fieldNorm(field=content, doc=806)
1.4443176 = (MATCH) weight(content:流 in 806), product of:
0.746121 = queryWeight(content:流), product of:
3.8715372 = idf(docFreq=264, maxDocs=4681)
0.19271956 = queryNorm
1.9357686 = (MATCH) fieldWeight(content:流 in 806), product of:
1.0 = tf(termFreq(content:流)=1)
3.8715372 = idf(docFreq=264, maxDocs=4681)
0.5 = fieldNorm(field=content, doc=806)