您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“l(fā)ucene4.7分詞器怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“l(fā)ucene4.7分詞器怎么實(shí)現(xiàn)”吧!
首先擺在我們面前的第一個(gè)必須要解決的問題,就是關(guān)于中文分詞的問題,因?yàn)長ucene畢竟是國外的大牛們開發(fā)的,顯然會比較側(cè)重英文文章,不過還好,在Lucene的下載包里同步了SmartCN的分詞器針對中文發(fā)行的,每一次Lucene有新的版本發(fā)行,這個(gè)包同時(shí)更新。
筆者比較推薦的中文分詞器是IK分詞器,在進(jìn)入正式的講解之前,我們首先對Lucene里面內(nèi)置的幾個(gè)分析器做個(gè)了解.
分析器類型 | 基本介紹 |
WhitespaceAnalyzer | 以空格作為切詞標(biāo)準(zhǔn),不對語匯單元進(jìn)行其他規(guī)范化處理 |
SimpleAnalyzer | 以非字母符來分割文本信息,并將語匯單元統(tǒng)一為小寫形式,并去掉數(shù)字類型的字符 |
StopAnalyzer | 該分析器會去除一些常有a,the,an等等,也可以自定義禁用詞 |
StandardAnalyzer | Lucene內(nèi)置的標(biāo)準(zhǔn)分析器,會將語匯單元轉(zhuǎn)成小寫形式,并去除停用詞及標(biāo)點(diǎn)符號 |
CJKAnalyzer | 能對中,日,韓語言進(jìn)行分析的分詞器,對中文支持效果一般。 |
SmartChineseAnalyzer | 對中文支持稍好,但擴(kuò)展性差 |
評價(jià)一個(gè)分詞器的性能優(yōu)劣,關(guān)鍵是看它的切詞效率以及靈活性,及擴(kuò)展性,通常情況下一個(gè)良好的中文分詞器,應(yīng)該具備擴(kuò)展詞庫,禁用詞庫和同義詞庫,當(dāng)然最關(guān)鍵的是還得要與自己的業(yè)務(wù)符合,因?yàn)橛行r(shí)候我們用不到一些自定義詞庫,所以選擇分詞器的時(shí)候就可以不考慮這一點(diǎn)。IK官網(wǎng)發(fā)布的最新版IK分詞器對于Lucene的支持是不錯(cuò)的,但是對于solr的支持就不夠好了,需要自己改源碼支持solr4.x的版本。筆者使用的另一個(gè)IK包是經(jīng)過一些人修改過的可以支持solr4.3的版本,并對擴(kuò)展詞庫,禁用詞庫,同義詞庫完全支持,而且在solr里面配置很簡單,只需要在schmal.xml進(jìn)行簡單配置,即可使用IK分詞器的強(qiáng)大的定制化功能。不過官網(wǎng)上IK作者發(fā)布的IK包在lucene里面確都不支持同義詞庫擴(kuò)展的功能,如果你想使用,得需要自己修改下源碼了,不過即使自己修改擴(kuò)展同義詞也是非常容易的。
下面筆者給出使用官網(wǎng)最后一版發(fā)布的IK在Lucene中做的測試,筆者使用的已經(jīng)擴(kuò)展了同義詞庫部分。
下面先看第一個(gè)純分詞的測試
package com.ikforlucene; import java.io.StringReader; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; public class Test { public static void main(String[] args)throws Exception { //下面這個(gè)分詞器,是經(jīng)過修改支持同義詞的分詞器 IKSynonymsAnalyzer analyzer=new IKSynonymsAnalyzer(); String text="三劫散仙是一個(gè)菜鳥"; TokenStream ts=analyzer.tokenStream("field", new StringReader(text)); CharTermAttribute term=ts.addAttribute(CharTermAttribute.class); ts.reset();//重置做準(zhǔn)備 while(ts.incrementToken()){ System.out.println(term.toString()); } ts.end();// ts.close();//關(guān)閉流 } }
運(yùn)行結(jié)果:
三 劫 散 仙 是 一個(gè) 菜鳥
第二步,測試擴(kuò)展詞庫,使三劫為一個(gè)詞,散仙為一個(gè)詞,需要在同義詞庫里添加三劫,散仙(注意是按行讀取的),注意保存的格式為UTF-8或無BOM格式即可
添加擴(kuò)展詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個(gè) 菜鳥
第三步,測試禁用詞庫,我們把菜鳥二個(gè)字給屏蔽掉,每行一個(gè)詞,保存格式同上.
添加禁用詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個(gè)
最后我們再來測試下,同義詞部分,現(xiàn)在筆者把河南人,洛陽人作為"一個(gè)"這個(gè)詞的同義詞,添加到同義詞庫中(筆者在這里僅僅是做一個(gè)測試,真正生產(chǎn)環(huán)境中的同義詞肯定是正式的),注意同義詞,也是按行讀取的,每行的同義詞之間使用逗號分割。
添加同義詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個(gè) 河南人 洛陽人
至此,使用IK在Lucene4.3中大部分功能都已測試通過,下面給出擴(kuò)展同義詞部分的源碼,有興趣的道友們,可以參照借鑒下。
package com.ikforlucene; import java.io.IOException; import java.io.Reader; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.synonym.SynonymFilterFactory; import org.apache.solr.core.SolrResourceLoader; import org.wltea.analyzer.lucene.IKTokenizer; /** * 可以加載同義詞庫的Lucene * 專用IK分詞器 * * * */ public class IKSynonymsAnalyzer extends Analyzer { @Override protected TokenStreamComponents createComponents(String arg0, Reader arg1) { Tokenizer token=new IKTokenizer(arg1, true);//開啟智能切詞 Map<String, String> paramsMap=new HashMap<String, String>(); paramsMap.put("luceneMatchVersion", "LUCENE_43"); paramsMap.put("synonyms", "E:\\同義詞\\synonyms.txt"); SynonymFilterFactory factory=new SynonymFilterFactory(paramsMap); SolrResourceLoader loader= new SolrResourceLoader(""); try { factory.inform(loader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return new TokenStreamComponents(token, factory.create(token)); } }
到此,相信大家對“l(fā)ucene4.7分詞器怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。