IKAnalyzer結合Lucene實現中文分詞


1、基本介紹

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

2、IKAnalyzer結合Lucene實現簡單的中文分詞

  我們通過一個基本的Demo來實踐說明,步驟如下:

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:配置擴展詞典以及停止詞典 內容如下:

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

3、配置說明

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

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

最大詞長分詞結果如下:

中國人民銀行[1]

中國人[1]

我[1]

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM