:::

DSpace 1.5.0加入CKIP中文斷詞器 / Add CKIP Chinese Analyzer in DSpace 1.5.0

10月 22, 2016 0 Comments Edit Copy Download

image

原本DSpace 1.5.0使用的是Lucene的ChineseAnalyzer,最近我需要把CKIP中文斷詞的服務加進DSpace當中,於是我自己做一個適合DSpace 1.5.0版本的CKIPChineseAnalyzer。這僅供需要研究斷詞器的人使用,一般使用者不建議更換斷詞器。以下介紹這個CKIPChineseAnalyzer的安裝步驟。


目錄代號 / Directories

以下說明中,我會用代號來指稱各個目錄,實際路徑請自行斟酌修改。如果你用的是DSpace-DLLL這個DSpace 1.5.0版本,那就可以直接使用我舉的例子。

  • [dspace-source]:DSpace原始碼的目錄,用來編譯用。在DSpace-DLLL中,此路徑為「/opt/dspace-1.5.0-src-release」。
  • [dspace]:運作DSpace的目錄,擺放設定檔用。在DSpace-DLLL中,此路徑為「/dspace」。
  • [tomcat-jspui]:DSpace在Tomcat運作中的目錄。在DSpace-DLL中,此路徑為「/opt/apache-tomcat- 6.0.16/webapps/jspui

最後必須確認你是以「dspace」身份登入,而不是用「root」,不然編譯時會有權限的問題。

確定這些目錄的路徑之後,接下來就來一一修改吧。

申請CKIP服務 / Register CKIP Service

2016-10-22_220444

CKIP的服務需要搭配帳號密碼才能使用。因此在開始之前我們需要先到CKIP申請帳號。

申請之後你註冊的電子郵件地址會收到一封認證信,裡面包含你設定的帳號與密碼。信中還有一個確認網址,請點下確認網址表示收到郵件。然後還要等待一天之後才能夠正常使用CKIP服務。

以下教學中,我用代號表示CKIP的帳號與密碼,請自行調整成你申請資料。

  • CKIP帳號:[ckip_user]
  • CKIP密碼:[ckip_password]

1. 加入CKIPChineseAnalyzer.java / Add CKIPChineseAnalyzer.java

2016-10-22_221227

請新增到以下路徑:

  • [dspace-source]/dspace-api/src/main/java/org/dspace/search/CKIPChineseAnalyzer.java

2. 修改dspace-api的pom.xml / Edit pom.xml in dspace-api

在CKIPChineseAnalyzer.java裡面用了CKIPClient跟lucene-analyzers兩個函式庫,因此我們要在dspace-api底下的pom.xml加入這兩個函式庫的資料,這樣子在maven編譯的時候才能夠正常引用需要的功能。

DSpace原始碼裡面有很多個pom.xml檔案,我們要修改的dspace-api底下的pom.xml路徑如下:

  • [dspace-source]/dspace-api/pom.xml

請在<dependencies>標籤底下加入以下XML設定:

<!-- https://mvnrepository.com/artifact/tw.cheyingwu/CKIPClient -->
<dependency>
  <groupId>tw.cheyingwu</groupId>
  <artifactId>CKIPClient</artifactId>
  <version>0.4.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-smartcn -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers</artifactId>
    <version>2.3.0</version>
</dependency>

如果你以前沒有改過這份pom.xml檔案的話,那你也可以下載我修改好的檔案,直接取代原本的pom.xml。

3. 增加CKIP服務的設定檔 / Add CKIP Configuration

2016-10-22_222528

接下來請修改DSpace設定檔,更換分析器為CKIPChineseAnalyzer,並加入CKIP的設定。

DSpace設定檔dspace.cfg的路徑如下:

  • [dspace]/config/dspace.cfg

請搜尋「search.analyzer」,找到原本的斷詞器設定「search.analyzer = org.apache.lucene.analysis.cn.ChineseAnalyzer」,請把該行前面加上「#」註解掉,並加入以下設定:

# CKIP analyzer
search.analyzer = org.dspace.search.CKIPChineseAnalyzer

search.analyzer.ckip.host = 140.109.19.104
search.analyzer.ckip.port = 1501
search.analyzer.ckip.username = [ckip_user]
search.analyzer.ckip.password = [ckip_password]

4. 加入ckipclient-java-0.4.jar函式庫 / Add ckipclient-java-0.4.jar Library

最後我們要將ckipclient-java-0.4.jar函式庫加到[tomcat-jspui]當中。

請加入到以下路徑:

  • [tomcat-jspui]/WEB-INF/lib/ckipclient-java-0.4.jar

5. 編譯DSpace / Build DSpace from Source Code

最後就是編譯與部屬DSpace。如果是用我做的DSpace-DLLL,dspace家目錄底下應該會有一個「quick_rebuild.sh」,請以以下指令執行它吧。

~/quick_rebuild.sh

2016-10-22_223604

如果最後訊息有看到「BUILD SUCCESSFUL」的話,那就是完成了。

以上就是適用於DSpace 1.5.0的CKIPChinese Analyzer的安裝過程。


從記錄檔中觀察斷詞結果 / Check Tokenized Result in Log

image

為了方便確認斷詞過程,我把斷詞的處理訊息加入在記錄檔中。DSpace的log檔路徑如下:

  • [dspace]/log/dspace.log

當有人在進行簡易搜尋的時候,就可以看到以下的斷詞處理訊息:

2016-08-02 00:20:37,754 INFO  org.dspace.search.CKIPChineseAnalyzer @ Before Token : 各位親愛的國人同胞
2016-08-02 00:20:37,775 INFO  org.dspace.search.CKIPChineseAnalyzer @ After ckip: 各 位 親愛 的 國人 同胞
2016-08-02 00:20:37,776 INFO  org.dspace.search.CKIPChineseAnalyzer @ Before Token : %u5404%u4f4d%u89aa%u611b%u7684%u570b%u4eba%u540c%u80de
2016-08-02 00:20:37,920 INFO  org.dspace.search.CKIPChineseAnalyzer @ After ckip: % u5404%u4f4d%u89aa%u611b%u7684%u570b%u4eba%u540c%u80de

其中可以看到比較重要的訊息是:

  • Before Token : 各位親愛的國人同胞
  • After ckip: 各 位 親愛 的 國人 同胞

如果要比較斷詞結果的變化,請到記錄檔來檢查喔。


結語:為什麼要自己做斷詞器? / Conclusion: Why I have to create another CKIPChineseAnalyzer?

513已經在GitHub上分享了她的CKIP斷詞器了,那為什麼我要自己做呢?原因很單純,因為她使用的CKIP斷詞器中用了較新版本Lucene的功能,導致DSpace 1.5.0內部使用的Lucene 2.3.0版本不合,不能兜在一起使用。用了她的版本、升級Lucene,會導致DSpace 1.5.0原本的功能不合;使用2.3.0的Lucene,她的斷詞器就不能使用。至於DSpace 1.5.0升級就不用提了,DSpace-DLLL修改的幅度之大,升級就等於是需要重寫全部功能。因此我只好自行開發適用於DSpace 1.5.0的CKIP斷詞器。

但眼尖的人也許可以發現事情沒那麼單純。在CKIPChineseAnalyzer.java當中做的事情是這樣的:

  1. 從reader讀取要斷詞的資料。
  2. 把資料丟給CKIP斷詞、取得斷詞結果。
  3. 丟入Lucene的ChineseAnalyzer,返回結果。

這個意思是,到頭來這個CKIPChineseAnalyzer還是用Lucene的ChineseAnalyzer來做最後的斷詞。既然如此,那為什麼還要從org.apache.lucene.analysis.cn.ChineseAnalyzer改到org.dspace.search.CKIPChineseAnalyzer呢?

我會這樣做的原因在於Lucene的ChineseAnalyzer已經做得相當極致,它會將所有輸入的中文斷成一個字一個字地去處理。舉例來說,「各位親愛的國人同胞」,ChienseAnalyzer會斷成「各 位 親 愛 的 國 人 同 胞」。因此只要文件中有搜尋字串中的其中一個字,它就可以把文件找回來。相較之下,CKIP斷詞服務的結果是「各位 親愛的 國人 同胞」,因此有些時候反而會找不到文件。

兩種混在一起,最後還是看到ChineseAnalyzer的結果,其實檢索效率不會有太大的改變。因此對一般的使用者來說,使用原本的ChineseAnalyzer就好了。

那我這樣做有什麼意義呢?其實這也不是真的要提升搜尋引擎的求全率或求準率,我現在這篇主要的目的只是開啟一個可以調整斷詞器的途徑。如果想要改良DSpace斷詞器的功能,不妨先照上面的步驟安裝完CKIPChineseAnalyzer.java之後,再來試著修改這個檔案,讓DSpace的檢索功能運作得更好吧。