IKAnalyzer結(jié)合Lucene實(shí)現(xiàn)中文分詞(示例講解)
1、基本介紹
隨著分詞在信息檢索領(lǐng)域應(yīng)用的越來(lái)越廣泛,分詞這門(mén)技術(shù)對(duì)大家并不陌生。對(duì)于英文分詞處理相對(duì)簡(jiǎn)單,經(jīng)過(guò)拆分單詞、排斥停止詞、提取詞干的過(guò)程基本就能實(shí)現(xiàn)英文分詞,單對(duì)于中文分詞而言,由于語(yǔ)義的復(fù)雜導(dǎo)致分詞并沒(méi)英文分詞那么簡(jiǎn)單,一般都是通過(guò)相關(guān)的分詞工具來(lái)實(shí)現(xiàn),目前比較常用的有庖丁分詞以及IKAnalyzer等。這里我們主要通過(guò)一個(gè)簡(jiǎn)單的Demo聊聊IKAnalyzer的基本使用。IKAnalyzer是一個(gè)開(kāi)源的,基于java開(kāi)發(fā)的分詞工具包,它獨(dú)立于Lucene項(xiàng)目,同時(shí)提供了Lucene的默認(rèn)實(shí)現(xiàn)。
2、IKAnalyzer結(jié)合Lucene實(shí)現(xiàn)簡(jiǎn)單的中文分詞
我們通過(guò)一個(gè)基本的Demo來(lái)實(shí)踐說(shuō)明,步驟如下:
step1:準(zhǔn)備相關(guān)的Jar依賴(lài),lucene-core-5.1.0.jar、ik.jar,然后新建項(xiàng)目,引入相關(guān)依賴(lài)項(xiàng)目結(jié)構(gòu)如下:
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:配置擴(kuò)展詞典以及停止詞典 內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴(kuò)展配置</comment> <entry key="ext_dict">ext.dic;</entry> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
其中的ext.dic配置自己的擴(kuò)展字典,stopword.dic配置自己的擴(kuò)展停止詞字典
step2:通過(guò)java代碼驗(yàn)證測(cè)試
public class MyIkTest { public static String str = "中國(guó)人民銀行我是中國(guó)人"; 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實(shí)現(xiàn)分詞 true:用最大詞長(zhǎng)分詞 false:最細(xì)粒度切分 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>(); //統(tǒng)計(jì) 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(); } } } }
執(zhí)行程序測(cè)試結(jié)果如下:
中國(guó)人民銀行[1]
中國(guó)人[1]
我[1]
3、配置說(shuō)明
a、如何自定義配置擴(kuò)展詞典和停止詞典 IKAnalyzer.cfg.xml中定義了擴(kuò)展詞典和停止詞典,如果有多好個(gè)可以通過(guò);配置多個(gè)。擴(kuò)展詞典是指用戶(hù)可以根據(jù)自己定義的詞義實(shí)現(xiàn)分詞,比如人名在默認(rèn)的詞典中并未實(shí)現(xiàn),需要自定義實(shí)現(xiàn)分詞,卡可以通過(guò)在ext.dic中新增自定義的詞語(yǔ)。停止詞是指對(duì)于分詞沒(méi)有實(shí)際意義但出現(xiàn)頻率很高的詞,比如嗎、乎等語(yǔ)氣詞,用戶(hù)也可以通過(guò)在stopword.dic中自定義相關(guān)的停止詞。
b、關(guān)于最大詞長(zhǎng)分詞和最小粒度分詞的區(qū)分 在IKAnalyzer構(gòu)造方法中可以通過(guò)提供一個(gè)標(biāo)示來(lái)實(shí)現(xiàn)最大詞長(zhǎng)分詞和最小粒度分詞,true為最大詞長(zhǎng)分詞,默認(rèn)是最小粒度分詞。對(duì)"中國(guó)人民銀行我是中國(guó)人"分別測(cè)試結(jié)果如下:
最大詞長(zhǎng)分詞結(jié)果如下:
中國(guó)人民銀行[1]
中國(guó)人[1]
我[1]
最小粒度分詞結(jié)果如下:
國(guó)人[2]
中國(guó)人[2]
中國(guó)[2]
人民[1]
中國(guó)人民銀行[1]
我[1]
人民銀行[1]
中國(guó)人民[1]
銀行[1]
以上這篇IKAnalyzer結(jié)合Lucene實(shí)現(xiàn)中文分詞(示例講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Spring?MVC中使用@ControllerAdvice創(chuàng)建全局異常處理器的方法
在Spring?MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解來(lái)定義全局異常處理器類(lèi),并使用?@ExceptionHandler注解來(lái)定義處理特定異常的方法,本文就給大家介紹了Spring?MVC?@ControllerAdvice創(chuàng)建處理器的方法,需要的朋友可以參考下2023-08-08SpringCloud-Gateway網(wǎng)關(guān)的使用實(shí)例教程
Gateway網(wǎng)關(guān)在微服務(wù)架構(gòu)中扮演了不可或缺的角色,通過(guò)集中化管理、智能路由和強(qiáng)大的過(guò)濾器機(jī)制,為構(gòu)建高效、可擴(kuò)展的微服務(wù)系統(tǒng)提供了有力支持,這篇文章主要介紹了SpringCloud-Gateway網(wǎng)關(guān)的使用,需要的朋友可以參考下2024-03-03Java實(shí)現(xiàn)定時(shí)任務(wù)最簡(jiǎn)單的3種方法
幾乎在所有的項(xiàng)目中,定時(shí)任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)定時(shí)任務(wù)最簡(jiǎn)單的3種方法,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06初識(shí)Java一些常見(jiàn)的數(shù)據(jù)類(lèi)型
這篇文章主要介紹Java一些常見(jiàn)的數(shù)據(jù)類(lèi)型,Java是一種優(yōu)秀的程序設(shè)計(jì)語(yǔ)言,它具有令人賞心悅目的語(yǔ)法和易于理解的語(yǔ)義,下面文章小編就來(lái)簡(jiǎn)單介紹為什么說(shuō)Java是最好的語(yǔ)言并且介紹它的各種常見(jiàn)類(lèi)型,需要的朋友可以參考一下2021-10-10編程語(yǔ)言榜單Java與Python并列第二!Julia下滑
日新月異的技術(shù)圈,隨著云、大數(shù)據(jù)、人工智能等主流技術(shù)的廣泛應(yīng)用,作為開(kāi)發(fā)利器的編程語(yǔ)言的最新發(fā)展趨勢(shì)也在無(wú)形中發(fā)生了變化,本文主要介紹了java、Python、Julia等語(yǔ)言在Resmonk榜單的排名2021-08-08關(guān)于spring.factories失效原因分析及解決
這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07