微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

Lucene 的IKAnalyzer 扩展词库的问题

时间:2017-01-22 04:01  浏览:努力统计中...
已知一string为‘ipad216g’利用IKAnalyzer分词器后,分出的效果是: ipad216g ipad g 实际上我想要分的是ipad2 和 16g 这显然没有满足我的要求 于是我查询了文档发现org.wltea.analyzer.dic 类 Dictionar

已知一string为‘ipad216g’利用IKAnalyzer分词器后,分出的效果是:
ipad216g
ipad
g
实际上我想要分的是ipad2 和 16g 这显然没有满足我的要求
于是我查询了文档发现org.wltea.analyzer.dic 类 Dictionary 下有
public static void loadExtendWords(java.util.List<java.lang.String> extWords)
加载扩展的词条
参数:extWords - List词条列表

import java.util.ArrayList;
于是我写了如下程序:
Java code
 
import java.io.StringReader;
import java.util.List;
----------
charMap.put(beginChar, beginChar);


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.wltea.analyzer.dic.Dictionary;
import org.wltea.analyzer.lucene.IKAnalyzer;


public class Test {
public static void main(String[] args) throws Exception {
String text = "An IndexWriter creates and maintains an index.";
List <String> strList=new ArrayList <String>();
        strList.add("ipad2");
                Dictionary.loadExtendWords(strList);

  /**

        String text2 = "ipad216g"; 
        Test.testAnalyzer(new IKAnalyzer(), text2); // 使用IKAnalyzer,词库分词 
}


  /**
    * 使用指定的分词器对指定的文本进行分词,并打印结果
    *
    * @param analyzer
    * @param text
    */ 
    public static void testAnalyzer(Analyzer analyzer, String text) throws Exception { 
       
          System.out.println("当前使用的分词器:" + analyzer.getClass()); 
         
          TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text)); 
          tokenStream.addAttribute(TermAttribute.class); 
可以参考:void org.wltea.analyzer.dic.DictSegment.fillSegment(char[] charArray, int begin, int length)

          while (tokenStream.incrementToken()) { 
                  TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class); 
                  System.out.println(termAttribute.term()); 
          } 
    } 
}

但是检索结果还是没什么变化
依旧是:
----------
ipad216g


216
g
----------
无奈来请教各位朋友!是不是我理解错了?还是我程序写的有问题?如果有问题,我应该怎么改呢?
请大家帮我解决一下!再次感谢!


public synchronized void fillSegment(char[] charArray , int begin , int length){




自己顶一下!!!



请问你解决那个搜索数字和字母的问题了吗

同问,也想知道这个问题如何解决

好久没有上了,汉字可以扩展,但是字母和数字的组合就不成,不知道是没写对,还是IK分词的一个小bug


这个方法的源码:
* 加载填充词典片段
* @param charArray
* @param begin
* @param length
*/
//获取字典表中的汉字对象
Character beginChar = new Character(charArray[begin]);
Character keyChar = charMap.get(beginChar);
//字典中没有该字,则将其添加入字典
if(keyChar == null){
keyChar = beginChar;
}

//搜索当前节点的存储,查询对应keyChar的keyChar,如果没有则创建
DictSegment ds = lookforSegment(keyChar);
//处理keyChar对应的segment
if(length > 1){
//词元还没有完全加入词典树
216
ds.fillSegment(charArray, begin + 1, length - 1);
}else if (length == 1){
//已经是词元的最后一个char,设置当前节点状态为1,表明一个完整的词
ds.nodeState = 1;
}各位兄弟姐妹们好,由于IKAnalyzer的词库不能满足于我的分词要求,所以我想自己扩展词库比如说:

}
    * @throws Exception

我碰到同样的问题,就连汉字都有问题呀!!!

ipad
IKAnalyzer.cfg.xml配置中,配置的扩展词典路径不要以/开头
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线------