代码改变世界

IKanalyzer 分词器(???)

2012-04-29 13:26  Lves Li  阅读(232)  评论(0编辑  收藏  举报

//今天看了看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)