本篇內(nèi)容主要講解“l(fā)ucene4.7分詞器怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“l(fā)ucene4.7分詞器怎么實(shí)現(xiàn)”吧!
成都創(chuàng)新互聯(lián)公司是專業(yè)的崇州網(wǎng)站建設(shè)公司,崇州接單;提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行崇州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
首先擺在我們面前的第一個必須要解決的問題,就是關(guān)于中文分詞的問題,因?yàn)長ucene畢竟是國外的大牛們開發(fā)的,顯然會比較側(cè)重英文文章,不過還好,在Lucene的下載包里同步了SmartCN的分詞器針對中文發(fā)行的,每一次Lucene有新的版本發(fā)行,這個包同時更新。
筆者比較推薦的中文分詞器是IK分詞器,在進(jìn)入正式的講解之前,我們首先對Lucene里面內(nèi)置的幾個分析器做個了解.
分析器類型 | 基本介紹 |
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ò)展性差 |
評價一個分詞器的性能優(yōu)劣,關(guān)鍵是看它的切詞效率以及靈活性,及擴(kuò)展性,通常情況下一個良好的中文分詞器,應(yīng)該具備擴(kuò)展詞庫,禁用詞庫和同義詞庫,當(dāng)然最關(guān)鍵的是還得要與自己的業(yè)務(wù)符合,因?yàn)橛行r候我們用不到一些自定義詞庫,所以選擇分詞器的時候就可以不考慮這一點(diǎn)。IK官網(wǎng)發(fā)布的最新版IK分詞器對于Lucene的支持是不錯的,但是對于solr的支持就不夠好了,需要自己改源碼支持solr4.x的版本。筆者使用的另一個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ò)展了同義詞庫部分。
下面先看第一個純分詞的測試
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 { //下面這個分詞器,是經(jīng)過修改支持同義詞的分詞器 IKSynonymsAnalyzer analyzer=new IKSynonymsAnalyzer(); String text="三劫散仙是一個菜鳥"; 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é)果:
三 劫 散 仙 是 一個 菜鳥
第二步,測試擴(kuò)展詞庫,使三劫為一個詞,散仙為一個詞,需要在同義詞庫里添加三劫,散仙(注意是按行讀取的),注意保存的格式為UTF-8或無BOM格式即可
添加擴(kuò)展詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個 菜鳥
第三步,測試禁用詞庫,我們把菜鳥二個字給屏蔽掉,每行一個詞,保存格式同上.
添加禁用詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個
最后我們再來測試下,同義詞部分,現(xiàn)在筆者把河南人,洛陽人作為"一個"這個詞的同義詞,添加到同義詞庫中(筆者在這里僅僅是做一個測試,真正生產(chǎn)環(huán)境中的同義詞肯定是正式的),注意同義詞,也是按行讀取的,每行的同義詞之間使用逗號分割。
添加同義詞庫后運(yùn)行結(jié)果如下:
三劫 散仙 是 一個 河南人 洛陽人
至此,使用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);//開啟智能切詞 MapparamsMap=new HashMap (); 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í)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!