ik分词器词典的加载

项目的下载和maven安装

使用git clone https://github.com/wks/ik-analyzer.git将ik项目克隆下来,使用
mvn install -Dmaven.test.skip=true命令将其安装到本地

ik-analyzer工程结构

ik分词器词典的加载_第1张图片

cfg包负责配置管理,主要是读取IK-Analyzer.xml中的扩展词库和扩展停用词表 。dic包下是和词典相关的类。

分词所用词典的加载

在3.2.8版本中,dic包下的3个类是与词典的加载相关的类,DictSegment类表示词典子片段。分词相关的词典会被封装成DictSegmetn类,封装的过程是在Dictionary类中完成的。

在Dictionary类中,loadMainDict()方法,完成了对主词典的读取和封装。过程如下

  • 新建DictSegment对象
  • IO流逐行读取main.dic。
  • 调用DictSegment的fillSegment方法将新词加入词典的数据结构中。
  • 以上面的方式,读取扩展词典文件,加入到词典的数据结构中

** loadMainDict()的代码可以清晰看出以上过程 **

/**
     * 加载主词典及扩展词典
     */
    private void loadMainDict(){
        //建立一个主词典实例
        _MainDict = new DictSegment((char)0);
        //读取主词典文件
        InputStream is = Dictionary.class.getResourceAsStream(Dictionary.PATH_DIC_MAIN);
        if(is == null){
            throw new RuntimeException("Main Dictionary not found!!!");
        }
        
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);
            String theWord = null;
            do {
                theWord = br.readLine();
                if (theWord != null && !"".equals(theWord.trim())) {
                    _MainDict.fillSegment(theWord.trim().toCharArray());
                }
            } while (theWord != null);
            
        } catch (IOException ioe) {
            System.err.println("Main Dictionary loading exception.");
            ioe.printStackTrace();
            
        }finally{
            try {
                if(is != null){
                    is.close();
                    is = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        //加载扩展词典配置
        List extDictFiles  = Configuration.getExtDictionarys();
        if(extDictFiles != null){
            for(String extDictName : extDictFiles){
                //读取扩展词典文件
                is = Dictionary.class.getResourceAsStream(extDictName);
                //如果找不到扩展的字典,则忽略
                if(is == null){
                    continue;
                }
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);
                    String theWord = null;
                    do {
                        theWord = br.readLine();
                        if (theWord != null && !"".equals(theWord.trim())) {
                            //加载扩展词典数据到主内存词典中
                            //System.out.println(theWord);
                            _MainDict.fillSegment(theWord.trim().toCharArray());
                        }
                    } while (theWord != null);
                    
                } catch (IOException ioe) {
                    System.err.println("Extension Dictionary loading exception.");
                    ioe.printStackTrace();
                    
                }finally{
                    try {
                        if(is != null){
                            is.close();
                            is = null;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }   

扩展词库文件和扩展停用词词库该放在哪里?

在3.2.8版本中,词库文件最终放在了dic包下,在使用的时候,需要将xml中配置的扩展词典文件,放在resources下的org/wltea/analyzer/dic/目录下才能读取

ik分词器词典的加载_第2张图片

可以看到其他的词典文件也是放在这个目录下的

你可能感兴趣的:(ik分词器词典的加载)