溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

lucene4.7分詞器怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-23 09:12:24 來源:億速云 閱讀:106 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(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等等,也可以自定義禁用詞
StandardAnalyzerLucene內(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格式即可
lucene4.7分詞器怎么實(shí)現(xiàn)

添加擴(kuò)展詞庫后運(yùn)行結(jié)果如下:

三劫
散仙
是
一個(gè)
菜鳥

第三步,測試禁用詞庫,我們把菜鳥二個(gè)字給屏蔽掉,每行一個(gè)詞,保存格式同上.
lucene4.7分詞器怎么實(shí)現(xiàn)

添加禁用詞庫后運(yùn)行結(jié)果如下:

三劫
散仙
是
一個(gè)

最后我們再來測試下,同義詞部分,現(xiàn)在筆者把河南人,洛陽人作為"一個(gè)"這個(gè)詞的同義詞,添加到同義詞庫中(筆者在這里僅僅是做一個(gè)測試,真正生產(chǎn)環(huán)境中的同義詞肯定是正式的),注意同義詞,也是按行讀取的,每行的同義詞之間使用逗號分割。

lucene4.7分詞器怎么實(shí)現(xià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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI