1. 程式人生 > >Solr之——整合mmseg4j中文分詞庫

Solr之——整合mmseg4j中文分詞庫

在上一篇博文《Solr之——整合Tomcat》中,我們介紹了Solr與Tomcat的整合方式,還沒有閱讀上一篇博文的朋友,請先閱讀上一篇博文《Solr之——整合Tomcat》,本文是在上一篇博文的基礎上整合mmseg4j中文分詞詞庫的。下面我們一起來實現Solr與mmseg4j的整合。

注:這篇博文中,我使用的是mmseg4j1.8.5。

1、環境準備

首先,下載mmseg4j1.8.5中文分詞詞庫包,解壓,在其目錄下找到mmseg4j-all-1.8.5.jar包,如下圖:

將這個包拷貝到我們在上一篇博文《Solr之——整合Tomcat》中建立的server目錄下的solr的lib目錄中。

同樣的我們在mmseg4j1.8.5下的dist目錄中找到mmseg4j-solr-1.8.5.jar包,如下圖:


也將其拷貝到我們在上一篇博文《Solr之——整合Tomcat》中建立的server目錄下的solr的lib目錄中。

拷貝完成後的效果如圖:

2、整合

在D:\lucence\solr\home\conf目錄下找到schema.xml檔案,如下圖:

開啟檔案,在Types節點下新增如下程式碼:

<!--MMsegAnalyzer-->
<fieldType name="textComplex" class="solr.TextField" >
  <analyzer>
    <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic"/>
  </analyzer>
</fieldType>
<fieldType name="textMaxWord" class="solr.TextField" >
  <analyzer>
    <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>
  </analyzer>
</fieldType>
<fieldType name="textSimple" class="solr.TextField" >
  <analyzer>
    <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="dic"/>
  </analyzer>
</fieldType>
啟動伺服器,開啟http://localhost:8080/solr/admin/連結,如圖所示選擇配置項:


在跳轉後的頁面中按照如圖所示進行配置與填寫內容:

大家可以看到左下角的分詞效果。這裡Field選擇的是type,而第一個文字框中我們輸入的是"textComplex",這裡我們可以選擇在schema.xml檔案中加入的fileType型別,如下圖所示:

至此,Solru與mmseg4j整合完成。

注:schema.xml中新增的程式碼在mmseg4j-1.8.5的README.txt檔案中有說明,如下圖:

為方便起見,我貼出整個README.txt的檔案說明:

以下是README.txt檔案的說明:

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

1、mmseg4j 用 Chih-Hao Tsai 的 MMSeg 演算法(http://technology.chtsai.org/mmseg/ )實現的中文分詞器,並實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。

2、MMSeg 演算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex 加了四個規則過慮。官方說:詞語的正確識別率達到了 98.41%。mmseg4j 已經實現了這兩種分詞演算法。
 * 1.5版的分詞速度simple演算法是 1100kb/s左右、complex演算法是 700kb/s左右,(測試機:AMD athlon 64 2800+ 1G記憶體 xp)。
 * 1.6版在complex基礎上實現了最多分詞(max-word)。“很好聽” -> "很好|好聽"; “中華人民共和國” -> "中華|華人|共和|國"; “中國人民銀行” -> "中國|人民|銀行"。
 * 1.7-beta 版, 目前 complex 1200kb/s左右, simple 1900kb/s左右, 但記憶體開銷了50M左右. 上幾個版都是在10M左右.

mmseg4j實現的功能詳情請看:http://mmseg4j.googlecode.com/svn/trunk/CHANGES.txt

3、在 com.chenlb.mmseg4j.example包裡的類示例了三種分詞效果。

4、在 com.chenlb.mmseg4j.analysis包裡擴充套件lucene analyzer。MMSegAnalyzer預設使用max-word方式分詞。

5、在 com.chenlb.mmseg4j.solr包裡擴充套件solr tokenizerFactory。
在 solr的 schema.xml 中定義 field type如:
    <fieldType name="textComplex" class="solr.TextField" >
      <analyzer>
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic"/>
      </analyzer>
    </fieldType>
    <fieldType name="textMaxWord" class="solr.TextField" >
      <analyzer>
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>
      </analyzer>
    </fieldType>
    <fieldType name="textSimple" class="solr.TextField" >
      <analyzer>
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="n:/OpenSource/apache-solr-1.3.0/example/solr/my_dic"/>
      </analyzer>
    </fieldType>
    
dicPath 指定詞庫位置(每個MMSegTokenizerFactory可以指定不同的目錄,當是相對目錄時,是相對 solr.home 的目錄),mode 指定分詞模式(simple|complex|max-word,預設是max-word)。

6、執行,詞典用mmseg.dic.path屬性指定、在classpath 目錄下或在當前目錄下的data目錄,預設是 classpath/data 目錄。如果使用 mmseg4j-*-with-dic.jar 包可以不指定詞庫目錄(如果指定也可以,它們也可以被載入)。

java -jar mmseg4j-core-1.8-with-dic.jar 這裡是字串。

java -cp .;mmseg4j-1.6.jar -Dmmseg.dic.path=./other-dic com.chenlb.mmseg4j.example.Simple 這裡是字串。

java -cp .;mmseg4j-1.6.jar com.chenlb.mmseg4j.example.MaxWord 這裡是字串

7、一些字元的處理
英文、俄文、希臘、數字(包括①㈠⒈)的分出一連串的。目前版本沒有處理小數字問題,
如ⅠⅡⅢ是單字分,字型檔(chars.dic)中沒找到也單字分。

8、詞庫:
 * data/chars.dic 是單字與語料中的頻率,一般不用改動,1.5版本中已經加到mmseg4j的jar裡了,我們不需要關心它,當然你在詞庫目錄放這個檔案可能覆蓋它。
 * data/units.dic 是單字的單位,預設讀jar包裡的,你也可以自定義覆蓋它。
 * data/words.dic 是詞庫檔案,一行一詞,當然你也可以使用自己的,1.5版本使用 sogou 詞庫,1.0的版本是用 rmmseg 帶的詞庫。
 * data/wordsxxx.dic 1.6版支援多個詞庫檔案,data 目錄(或你定義的目錄)下讀到"words"字首且".dic"為字尾的檔案。如:data/words-my.dic。

9、MMseg4jHandler:
新增 MMseg4jHandler 類,可以在solr中用url的方式來控制載入檢測詞庫。引數:
 * dicPath 是指定詞庫的目錄,特性與MMSegTokenizerFactory中的dicPath一樣(相對目錄是,是相對 solr.home)。
 * check 是指是否檢測詞庫,其值是true 或 on。
 * reload 是否嘗試載入詞庫,其值是 true 或 on。此值為 true,會忽視 check 引數。
 
solrconfig.xml:

    <requestHandler name="/mmseg4j" class="com.chenlb.mmseg4j.solr.MMseg4jHandler" >
        <lst name="defaults">
            <str name="dicPath">dic</str>
        </lst>
    </requestHandler>

此功能可以讓外接程式做相關的控制,如:嘗試載入詞庫,然後外接程式決定是否重做索引。


在 solr 1.3/1.4 與 lucene 2.3/2.4/2.9 測試過,官方部落格 http://blog.chenlb.com/category/mmseg4j , 如果發現問題或bug與我聯絡 chenlb2008#gmail.com 。

1.7.2 與 1.6.2 開始核心的程式與 lucene 和 solr 擴充套件分開打包,方便相容低版本的 lucene,同時給出低版本(<= lucene 2.2)的 lucene 擴充套件請仿照 MMSegTokenizer.java。

可以在 http://code.google.com/p/mmseg4j/issues/list 提出希望 mmseg4j 有的功能。

歷史版本:

 * 1.0.2 http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.0/
 * 1.5   http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.5/
 * 1.6.2 http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.6/
 * 1.7.3 http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.7/