web分詞程序和算法

注:最新的分詞系統 HTTPCWS 已經發布,用來取代 PHPCWS。

  請點擊以下網址下載 HTTPCWS:


  http://code.google.com/p/httpcws

  原來的 PHPCWS 停止更新。




  名稱:PHPCWS(PHP中文分詞擴展)
  協議:New BSD License
  作者:張宴
  網址:http://code.google.com/p/phpcws/
  SVN:http://code.google.com/p/phpcws/source/browse/#svn/trunk/phpcws

  一、PHPCWS 簡介

  1、什麼是 PHPCWS ?
  PHPCWS 是一款開源的PHP中文分詞擴展,目前僅支持Linux/Unix系統。

  PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞算法”的API進行初次分詞處理,再使用自行編寫的“逆向最大匹配算法”對分詞和進行詞語合併處理,並增加標點符號過濾功能,得出分詞結果。

  ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中國科學院計算技術研究所在多年研究工作積累的基礎上,基於多層隱馬模型研製出的漢語詞法分析系統,主要功能包括中文分詞;詞性標註;命名實體識別;新詞識別;同時支持用戶詞典。ICTCLAS經過五年精心打造,內核升級6次,目前已經升級到了ICTCLAS3.0,分詞精度 98.45%,各種詞典數據壓縮後不到3M。ICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan 組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。

  ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,很多詞語不存在。所以本人對ICTCLAS分詞後的結果,再採用逆向最大匹配算法,根據自己補充的一個9萬條詞語的自定義詞庫(與ICTCLAS詞庫中的詞語不重複),對ICTCLAS分詞結果進行合併處理,輸出最終分詞結果。

  由於 ICTCLAS 3.0 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用PHP的iconv函數轉換成GBK編碼,再用phpcws_split函數進行分詞處理,最後轉換回UTF-8編碼。

  2、PHPCWS 中文分詞在線演示

  演示網址:http://blog.s135.com/demo/phpcws/

  3、PHPCWS 分詞速度及用途

  初次使用時,Apache 或 php-cgi(FastCGI) 進程,需要加載一次詞庫到內存中,需要0.0X秒。58字節的一句話——“2009年2月13日,我編寫了一款PHP中文分詞擴展:PHPCWS 1.0.0。”,分詞速度只需0.0003秒。

  PHPCWS 屬於《億級數據的高併發通用搜索引擎架構設計》的一部分,用作“搜索查詢接口”的關鍵字分詞處理。在此架構中,Sphinx索引引擎對於CJK(中日韓)語言支持一元切分,假設【反恐行動是國產主視角射擊網絡遊戲】這段文字,Sphinx會將其切成【反 恐 行 動 是 國 產 主 視 角 射 擊 網 絡 遊 戲】,然後對每個字建立反向索引。如果用這句話中包含的字組成一個不存在的詞語,例如【恐動】,也會被搜索到,所以搜索時,需要加引號,例如搜索【"反恐行動"】,就能完全匹配連在一起的四個字,不連續的【"恐動"】就不會被搜索到。但是,這樣還有一個問題,搜索【"反恐行動遊戲"】或【"國產網絡遊戲"】就會搜索不到。所以,我在搜索層寫了個PHP中文分詞擴展,搜索“反恐行動遊戲”、“國產網絡遊戲”,會被PHPCWS中文分詞函數分別切分爲“反恐行動 遊戲”、“國產 網絡遊戲”,這時候,用PHP函數給以空格分隔的詞語加上引號,去搜索【"反恐行動" "遊戲"】或【"國產" "網絡遊戲"】,就能搜索到這條記錄了。由於PHPCWS位於搜索層,中文分詞詞庫發生增、刪、改,只需平滑重啓一次Web服務器或php-cgi進程即可,無需重建搜索索引。

  根據上述情況,對於那些採用二元交叉切分的搜索引擎,PHPCWS用在前端搜索層對用戶輸入的搜索關鍵字、短語進行分詞處理,同樣適合。PHPCWS開發的目的正在於此,對於短句、小文本中文分詞切分,速度非常之快。

  4、自定義詞庫

  自定義詞庫名稱爲userdict.tch,格式爲 Tokyo Cabinet DBM 的 Abstract key-value 內存哈希數據庫(key爲GBK編碼的詞語名詞,value爲詞頻。目前詞頻均填1,暫時用不上)。自定義詞庫的修改在安裝步驟中會詳細介紹。



  二、phpcws 1.0.1 安裝步驟

  1、安裝 Tokyo Cabinet 數據庫:
wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.17.tar.gz
tar zxvf tokyocabinet-1.4.17.tar.gz
cd tokyocabinet-1.4.17/
./configure --prefix=/usr/local/tokyocabinet-1.4.17
make && make install
mkdir -p /usr/local/tokyocabinet-1.4.17/lib/static/
cp -f /usr/local/tokyocabinet-1.4.17/lib/*.a /usr/local/tokyocabinet-1.4.17/lib/static/
echo "/usr/local/tokyocabinet-1.4.17/lib" >> /etc/ld.so.conf
/sbin/ldconfig
cd ../


  2、安裝 PHPCWS 擴展:
wget http://phpcws.googlecode.com/files/phpcws-1.0.1.tar.gz
tar zxvf phpcws-1.0.1.tar.gz
cd phpcws-1.0.1/
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-tc=/usr/local/tokyocabinet-1.4.17
make && make install
cd ../

  注:其中/usr/local/webserver/php/爲您的PHP安裝目錄。

  3、安裝 ICTCLAS 3.0 詞庫和 PHPCWS 自定義詞庫(詞庫漢字編碼均爲GBK):
cd /usr/local/
wget http://phpcws.googlecode.com/files/phpcws-dict-1.0.0.tar.gz
tar zxvf phpcws-dict-1.0.0.tar.gz
mv phpcws-dict-1.0.0 phpcws


  您可以往自定義詞庫內增加自己的詞語,方法如下:
cd /usr/local/phpcws/

#如果userdict.tch已經被PHP加載,請拷貝一個備份
cp userdict.tch userdict_new.tch

#添加新詞語
/usr/local/tokyocabinet-1.4.11/bin/tcamgr put userdict_new.tch 詞語一 1
/usr/local/tokyocabinet-1.4.11/bin/tcamgr put userdict_new.tch 詞語二 1

查詢某個詞語是否已經在詞庫內
/usr/local/tokyocabinet-1.4.11/bin/tcamgr get userdict_new.tch 詞語名詞

#刪除一個詞語
/usr/local/tokyocabinet-1.4.11/bin/tcamgr out userdict_new.tch 詞語名稱

#將修改後的新詞庫覆蓋回原詞庫
mv userdict_new.tch userdict.tch

#重啓您的Apache服務器,或php-cgi(FastCGI)進程。
#例如重啓php-cgi(FastCGI)進程:
/usr/local/webserver/php/sbin/php reload

  您可以從搜狗細胞詞庫網站下載自己需要的行業分類文本詞庫,整合到PHPCWS自定義詞庫中。

  4、修改您的php.ini文件,增加以下幾行內容:
[phpcws]
extension = "phpcws.so"
phpcws.dict_path = "/usr/local/phpcws"


  5、重啓您的Apache服務器,或php-cgi(FastCGI)進程

  6、查看您的phpinfo信息,如果搜索到以下內容,則表明安裝成功:

  點擊在新窗口中瀏覽此圖片



  三、phpcws 1.0.1 調用方式

  1、PHPCWS擴展擁有一個PHP函數:
  string phpcws_split ( string $text [, string $interpunction ] )

  參數說明:
  $text 爲GBK編碼的文本內容;

  $interpunction 爲可選參數,用來控制是否過濾標點符號。
  ①、值爲空時,表示不過濾;

  ②、值爲"default"時,過濾掉默認的標點符號,即以下標點符號:
  ,.!!"#¥%&`'()〔〕〈〉《》「」『』〖〗【】.*+,-.。、?…—·ˉˇ¨‘’“”々~‖∶"/:;|〃<=>?@[\]^_`{|} ̄

  ③、值爲其他字符串時,表示過濾掉自定義的標點符號,例如值爲",.!,。!"即過濾掉半角、全角的逗號、句號、感嘆號。

  2、PHP中文分詞實例:

  ①、對GBK編碼的字符串進行中文分詞處理(example_gbk.php):
  1. <?php  
  2. @header('Content-Type: text/html; charset=gb2312');  
  3. $text = "2009年2月13日,我編寫了一款PHP中文分詞擴展:PHPCWS 1.0.0。";  
  4.   
  5. echo "分詞結果爲:<BR>";  
  6. $result = phpcws_split($text);  
  7. echo $result . "<BR><BR>";  
  8.   
  9. echo "過濾掉默認標點符號的分詞結果爲:<BR>";  
  10. $result = phpcws_split($text"default");  
  11. echo $result . "<BR><BR>";  
  12.   
  13. echo "過濾掉全角逗號與冒號的分詞結果爲:<BR>";  
  14. $result = phpcws_split($text",:");  
  15. echo $result . "<BR><BR>";  
  16. ?>  

  ②、對UTF-8編碼的字符串進行中文分詞處理(example_utf8.php):
  1. <?php  
  2. @header('Content-Type: text/html; charset=utf-8');  
  3. $text = "2009年2月13日,我編寫了一款PHP中文分詞擴展:PHPCWS 1.0.0。";  
  4. $text = iconv("UTF-8""GBK//IGNORE"$text);  
  5.   
  6. echo "分詞結果爲:<BR>";  
  7. $result = phpcws_split($text);  
  8. $result = iconv("GBK""UTF-8//IGNORE"$result);  
  9. echo $result . "<BR><BR>";  
  10.   
  11. echo "過濾掉默認標點符號的分詞結果爲:<BR>";  
  12. $result = phpcws_split($text"default");  
  13. $result = iconv("GBK""UTF-8//IGNORE"$result);  
  14. echo $result . "<BR><BR>";  
  15.   
  16. echo "過濾掉全角逗號與冒號的分詞結果爲:<BR>";  
  17. $result = phpcws_split($text",:");  
  18. $result = iconv("GBK""UTF-8//IGNORE"$result);  
  19. echo $result . "<BR><BR>";  
  20. ?>  

  輸出結果爲:
分詞結果爲:
2009年 2月 13日 , 我 編寫 了 一款 PHP 中文 分詞 擴展 : PHPCWS 1.0.0 。

過濾掉默認標點符號的分詞結果爲:
2009年 2月 13日 我 編寫 了 一款 PHP 中文 分詞 擴展 PHPCWS 1.0.0

過濾掉全角逗號與冒號的分詞結果爲:
2009年 2月 13日 我 編寫 了 一款 PHP 中文 分詞 擴展 PHPCWS 1.0.0 。


  以上兩個實例PHP程序文件可以從SVN中獲取:

發佈了52 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章