DSpace 1.5.0加入CKIP中文斷詞器 / Add CKIP Chinese Analyzer in DSpace 1.5.0
原本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
CKIP的服務需要搭配帳號密碼才能使用。因此在開始之前我們需要先到CKIP申請帳號。
- 中文斷詞系統CKIP網站:http://ckipsvr.iis.sinica.edu.tw/
- 線上服務申請網址:http://ckipsvr.iis.sinica.edu.tw/reg.php
申請之後你註冊的電子郵件地址會收到一封認證信,裡面包含你設定的帳號與密碼。信中還有一個確認網址,請點下確認網址表示收到郵件。然後還要等待一天之後才能夠正常使用CKIP服務。
以下教學中,我用代號表示CKIP的帳號與密碼,請自行調整成你申請資料。
- CKIP帳號:[ckip_user]
- CKIP密碼:[ckip_password]
1. 加入CKIPChineseAnalyzer.java / Add CKIPChineseAnalyzer.java
- CKIPChineseAnalyzer.java 下載網址:http://pulipulichen.github.io/blogger/posts/2016/10/dspace-ckip-chinese-analyzer/CKIPChineseAnalyzer.java
請新增到以下路徑:
- [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。
- pom.xml下載網址:http://pulipulichen.github.io/blogger/posts/2016/10/dspace-ckip-chinese-analyzer/pom.xml
3. 增加CKIP服務的設定檔 / Add CKIP Configuration
接下來請修改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]當中。
- ckipclient-java-0.4.jar下載網址: http://pulipulichen.github.io/blogger/posts/2016/10/dspace-ckip-chinese-analyzer/ckipclient-java-0.4.jar
請加入到以下路徑:
- [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
如果最後訊息有看到「BUILD SUCCESSFUL」的話,那就是完成了。
以上就是適用於DSpace 1.5.0的CKIPChinese Analyzer的安裝過程。
從記錄檔中觀察斷詞結果 / Check Tokenized Result in Log
為了方便確認斷詞過程,我把斷詞的處理訊息加入在記錄檔中。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當中做的事情是這樣的:
- 從reader讀取要斷詞的資料。
- 把資料丟給CKIP斷詞、取得斷詞結果。
- 丟入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的檢索功能運作得更好吧。