温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用IKAnalyzer与Lucene怎么实现一个中文分词功能

发布时间:2020-12-08 16:22:49 来源:亿速云 阅读:337 作者:Leah 栏目:编程语言

利用IKAnalyzer与Lucene怎么实现一个中文分词功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

步骤如下:

step1:准备相关的Jar依赖,lucene-core-5.1.0.jar、ik.jar,然后新建项目,引入相关依赖项目结构如下:

IkDemo-src
     -con.funnyboy.ik
-IKAnalyzer.cfg.xml
     -stopword.dic
-ext.dic
-Reference Libraries
     -lucene-core-5.1.0.jar
     -ik.jar

IKAnalyzer.cfg.xml:配置扩展词典以及停止词典 内容如下:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> <comment>IK Analyzer 扩展配置</comment>
   <entry key="ext_dict">ext.dic;</entry>
   <entry key="ext_stopwords">stopword.dic;</entry>
</properties>

其中的ext.dic配置自己的扩展字典,stopword.dic配置自己的扩展停止词字典

step2:通过java代码验证测试

public class MyIkTest {
  public static String str = "中国人民银行我是中国人";
  public static void main(String[] args) { 
     MyIkTest test = new MyIkTest(); 
     test.wordCount("", str);
   }
   private void wordCount(String arg,String content) {
     Analyzer analyzer = new IKAnalyzer(true); // IK实现分词 true:用最大词长分词 false:最细粒度切分 
    StringReader reader = null; 
    TokenStream ts = null; try { 
      reader = new StringReader(content); 
      ts = analyzer.tokenStream(arg,reader); 
      CharTermAttribute term = ts.addAttribute(CharTermAttribute.class); 
      ts.reset(); 
      Map<String, Integer> map = new HashMap<String, Integer>(); //统计 
      while (ts.incrementToken()) { 
        String str = term.toString(); 
        Object o = map.get(str); 
        if (o == null) { 
          map.put(str, new Integer(1)); 
         } else { 
          Integer i = new Integer(((Integer) o).intValue() + 1); 
           map.put(str, i); 
        } 
       } 
      List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() { 
        public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2) { 
          return (o2.getValue() - o1.getValue()); 
        } });  
       for (int k=0;k<list.size();k++) { 
        Entry<String, Integer> it=list.get(k); 
        String word = it.getKey().toString(); 
        System.err.println(word+"["+it.getValue()+"]"); 
       }  
    } catch (Exception e) {
     } finally { 
      if(reader != null){ 
         reader.close(); 
      } 
      if (analyzer != null) { 
        analyzer.close(); 
      } 
     } 
   }
  }

执行程序测试结果如下:

中国人民银行[1]

中国人[1]

我[1]

3、配置说明

a、如何自定义配置扩展词典和停止词典 IKAnalyzer.cfg.xml中定义了扩展词典和停止词典,如果有多好个可以通过;配置多个。扩展词典是指用户可以根据自己定义的词义实现分词,比如人名在默认的词典中并未实现,需要自定义实现分词,卡可以通过在ext.dic中新增自定义的词语。停止词是指对于分词没有实际意义但出现频率很高的词,比如吗、乎等语气词,用户也可以通过在stopword.dic中自定义相关的停止词。

b、关于最大词长分词和最小粒度分词的区分 在IKAnalyzer构造方法中可以通过提供一个标示来实现最大词长分词和最小粒度分词,true为最大词长分词,默认是最小粒度分词。对"中国人民银行我是中国人"分别测试结果如下:

最大词长分词结果如下:

中国人民银行[1]

中国人[1]

我[1]

最小粒度分词结果如下:

国人[2]
中国人[2]
中国[2]
人民[1]
中国人民银行[1]
我[1]
人民银行[1]
中国人民[1]
银行[1]

关于利用IKAnalyzer与Lucene怎么实现一个中文分词功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI