zoukankan      html  css  js  c++  java
  • IKanalyzer 分词器(???)

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

  • 相关阅读:
    打印乘法口诀
    sum() 求和用法
    Python 2 和 Python 3 有哪些主要区别
    列表 enumerat 解包, 针对索引和元素
    冒泡排序,纯数字列表排序 解包,加中间值
    python 字符串与列表的相互转换 数据类型转换
    赋值 深浅拷贝
    python去掉字符串中空格的方法
    #上节多线程内容回顾#多线程的使用场景 #多进程的基本使用
    #queue队列 #生产者消费者模型
  • 原文地址:https://www.cnblogs.com/lixingle/p/3313040.html
Copyright © 2011-2022 走看看