美文网首页
ik分词器词典的加载

ik分词器词典的加载

作者: 阳春是你 | 来源:发表于2017-02-19 18:10 被阅读150次

    项目的下载和maven安装

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

    ik-analyzer工程结构


    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<String> 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分词器词典的加载

          本文链接:https://www.haomeiwen.com/subject/ilmjwttx.html