IKAnalyzer結合Lucene實現中文分詞

一、基本介紹java

  隨着分詞在信息檢索領域應用的愈來愈普遍,分詞這門技術對你們並不陌生。對於英文分詞處理相對簡單,通過拆分單詞、排斥中止詞、提取詞幹的過程基本就能實現英文分詞,單對於中文分詞而言,因爲語義的複雜致使分詞並沒英文分詞那麼簡單,通常都是經過相關的分詞工具來實現,目前比較經常使用的有庖丁分詞以及IKAnalyzer等。這裏咱們主要經過一個簡單的Demo聊聊IKAnalyzer的基本使用。IKAnalyzer是一個開源的,基於java開發的分詞工具包,它獨立於Lucene項目,同時提供了Lucene的默認實現。工具

二、IKAnalyzer結合Lucene實現簡單的中文分詞測試

  咱們經過一個基本的Demo來實踐說明,步驟以下:spa

step1:準備相關的Jar依賴,lucene-core-5.1.0.jar、ik.jar,而後新建項目,引入相關依賴項目結構以下:xml

IkDemo-srctoken

     -con.funnyboy.ik開發

                  -IKAnalyzer.cfg.xmlrem

     -stopword.dicget

                  -ext.dicit

            -Reference Libraries

     -lucene-core-5.1.0.jar

     -ik.jar

IKAnalyzer.cfg.xml:配置擴展詞典以及中止詞典 內容以下:

<?xml version="1.0" encoding="UTF-8"?>

<!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]

三、配置說明

a、如何自定義配置擴展詞典和中止詞典    IKAnalyzer.cfg.xml中定義了擴展詞典和中止詞典,若是有多好個能夠經過;配置多個。擴展詞典是指用戶能夠根據本身定義的詞義實現分詞,好比人名在默認的詞典中並未實現,須要自定義實現分詞,卡能夠經過在ext.dic中新增自定義的詞語。中止詞是指對於分詞沒有實際意義但出現頻率很高的詞,好比嗎、乎等語氣詞,用戶也能夠經過在stopword.dic中自定義相關的中止詞。

b、關於最大詞長分詞和最小粒度分詞的區分    在IKAnalyzer構造方法中能夠經過提供一個標示來實現最大詞長分詞和最小粒度分詞,true爲最大詞長分詞,默認是最小粒度分詞。對"中國人民銀行我是中國人"分別測試結果以下:

最大詞長分詞結果以下:

中國人民銀行[1]

中國人[1]

我[1]

最小粒度分詞結果以下:
國人[2]
中國人[2]
中國[2]
人民[1]
中國人民銀行[1]
我[1]
人民銀行[1]
中國人民[1]
銀行[1]

相關文章
相關標籤/搜索