天天看點

跟益達學Solr5之使用Ansj分詞器

        ok,直接開門見山,不繞彎子啦!基于上篇部落格,我們知道了在solr中配置分詞器有兩種方式,一種是直接配置分詞器類,比如:

跟益達學Solr5之使用Ansj分詞器

<fieldtype name="text_ik" class="solr.textfield">        

        <analyzer class="org.wltea.analyzer.lucene.ikanalyzer" />        

</fieldtype>  

 一種是配置tokenizerfactory類,由于solr api中并沒有内置類似ik,ansj這樣的中文分詞器的tokenizerfactory類,是以我們需要自己擴充,不過你們不用擔心,我已經擴充好了。配置樣例如下:

跟益達學Solr5之使用Ansj分詞器

<fieldtype name="text_ik" class="solr.textfield">  

        <analyzer type="index">  

            <tokenizer class="org.apache.lucene.analysis.ik.iktokenizerfactory" usesmart="true"/>  

        </analyzer>  

        <analyzer type="query">  

            <tokenizer class="org.apache.lucene.analysis.ik.iktokenizerfactory" usesmart="false"/>  

    我擴充的ansjtokenizerfactory源碼如下:

跟益達學Solr5之使用Ansj分詞器

public class ansjtokenizerfactory  extends tokenizerfactory {  

    /**是否查詢分詞*/  

    private boolean query;  

    /**是否分析詞幹.進行單複數,時态的轉換(隻針對英文單詞)*/  

    private boolean pstemming;  

    /**自定義停用詞詞典檔案路徑*/  

    private string stopwordsdir;  

    public ansjtokenizerfactory(map<string, string> args) {  

        super(args);  

        query = getboolean(args, "query", false);  

        pstemming = getboolean(args, "pstemming", false);  

        stopwordsdir = get(args, "stopwordsdir", "");  

    }  

    @override  

    public tokenizer create(attributefactory factory) {  

        if(query) {  

            return new ansjtokenizer(factory,new toanalysis(new forest[0]),stopwordsdir,pstemming);  

        }  

        return new ansjtokenizer(factory,new indexanalysis(new forest[0]),stopwordsdir,pstemming);  

}  

   下面介紹如何在solr中使用ansj分詞器,首先你需要在solr_home的core\lib目錄下添加依賴的jar:

    solr-analyzer-ansj-5.1.0.jar(這個jar包體積較小,請在底下的附件裡下載下傳)

    nlp-lang-0.2.jar(這是ansj-seg-2.0.8.jar依賴的jar包)

    如圖:

跟益達學Solr5之使用Ansj分詞器

 然後在schema.xml中添加如下配置:

跟益達學Solr5之使用Ansj分詞器

 至于query,pstemming,stopwordsdir這3個配置參數的含義,請看我在源碼中作的注釋,如圖:

跟益達學Solr5之使用Ansj分詞器

 query參數:分詞的兩個階段:建立索引階段和查詢階段,即表示是否為查詢階段分詞,針對不同的分詞階段采用的分詞政策是不一樣的。具體看源碼,如圖:

跟益達學Solr5之使用Ansj分詞器

 pstemming:表示是否對英文單詞進行單複數轉換以及時态轉換,比如apples還原成apple,loved還原成love,broken還原成break,注意pstemming參數僅僅是針對英文,因為隻有英文才有單複數和時态形式。

stopwordsdir參數就很好了解了,就是你的自定義停用詞詞典的存放路徑,

上面3個參數是可選的,不是必須配置的。

tokenizerfactory配置好了,然後你就在你的field中應用此分詞器了,如圖:

跟益達學Solr5之使用Ansj分詞器

 然後你需要把ansj的library.properties配置檔案copy到e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes路徑,如圖:

跟益達學Solr5之使用Ansj分詞器

 library.properties配置如下:

跟益達學Solr5之使用Ansj分詞器

#redress dic file path  

ambiguitylibrary=e:/apache-tomcat-7.0.55/webapps/solr/web-inf/classes/library/ambiguity.dic  

#path of userlibrary this is default library  

userlibrary=e:/apache-tomcat-7.0.55/webapps/solr/web-inf/classes/library  

#set real name  

isrealname=true  

 比較惡心的是,anasj分詞器的字典檔案加載路徑這裡隻能寫死成絕對路徑,因為它源碼裡加載字典檔案是直接通過new file(dicpath)這種方式來實作的。當你在eclipse中運作,你的dicpath相對路徑是你的項目根目錄,而如果你的項目部署到tomcat,那dicpath的相對路徑就是tomcat根目錄下的bin,這确實比較啃爹,是以我這裡幹脆直接寫成絕對路徑,當然你可以把字典檔案放到任意目錄下,比如c:\library,不是非要放到tomcat下,這個我必須要澄清下。下圖是ansj分詞器在加載字典檔案時比較惡心的實作方式:

跟益達學Solr5之使用Ansj分詞器

 如果改成這樣方式加載字典檔案會比較好點,我個人覺得:

   this.getclass().getclassloader().getresourceasstream(dicpath);

這樣你的字典檔案路徑dicpath的相對路徑才是目前classpath。不過ansj裡你把字典檔案配置成絕對路徑也可以,不一定非要相對路徑,這點仁者見仁智者見智吧!騷年,你怎麼看?

接着你需要在e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes目錄下建立一個library目錄,然後把ansj自帶的兩個字典檔案ambiguity.dic和default.dic複制進去,然後建立一個ext.dic檔案。相關的字典檔案和配置檔案我待會兒會上傳到附件裡供你們參考。其中ext.dic是使用者自定義擴充字典檔案,如圖:

跟益達學Solr5之使用Ansj分詞器
跟益達學Solr5之使用Ansj分詞器

 對于類似這種網絡新詞,ansj分詞器預設是分不出來的,這時就需要定義自定義擴充字典。

你應該已經發現了,我們在配置ansjtokenizerfactory的時候配置了stopwordsdir="stopwords/stopwords.dic"自定義停用詞加載路徑,這裡的stopwordsdir是相對于目前classpath的即e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes,是以我們需要在e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes下建立stopwords檔案夾,然後在stopwords檔案夾下建立一個stopwords.dic字典檔案,stopwords.dic内容如下:

跟益達學Solr5之使用Ansj分詞器

 這裡我隻加兩個詞語作為示範,你們可以根據你自己的需求随意添加你自己的停用詞。需要解釋下的是,之是以stopwordsdir參數是相對于目前classpath,是因為我在實作ansjtokenizerfactory時是采用這樣的方式來加載詞典檔案的,如圖:

跟益達學Solr5之使用Ansj分詞器

 這一切準備好了,你就開始進行分詞測試了,請如圖進行測試:

跟益達學Solr5之使用Ansj分詞器

 上圖是對自定義新詞進行分詞測試,麼麼哒和啪啪啪之是以能被分出來,是因為我們在library\ext.dic自定義詞典檔案中添加了那兩個詞語。

跟益達學Solr5之使用Ansj分詞器

 上圖是用來測試pstemming參數即英文單詞的單複數轉換以及時态轉換,loved是過去式,自動被轉換成原型love

跟益達學Solr5之使用Ansj分詞器

上圖是用來測試自定義停用詞的,如果你看到如圖效果,說明你配置成功了!

至于anseg分詞器我維護的最新源碼我有空會上傳到我的github上,請關注我的github

   益達q-q:                7-3-6-0-3-1-3-0-5

   益達的q-q群:      1-0-5-0-9-8-8-0-6

轉載:http://iamyida.iteye.com/blog/2220833