Sphinx系列文章\SCWS中文分詞

軟件清單

安裝

For Mac / Linux

請注意,個人系統是Mac OS X 10.11.2數組

假設你已經下載好了上面的軟件。安全

第一步:編譯和安裝網絡

# 解壓
➜  tar -xvf scws-1.2.2.tar.bz2 

# 編譯和安裝 scws
./configure --prefix=/usr/local/Cellar/scws # --preifx=[安裝路徑]
make -j4
make install

# 編譯和安裝 php-scws
➜  cd phpext
➜  phpize
➜  ./configure --with-scws=/usr/local/Cellar/scws --with-php-config=/usr/local/Cellar/php56/5.6.16/bin/php-config
➜  make -j4
➜  make install
# 輸出
Installing shared extensions: /usr/local/Cellar/php56/5.6.16/lib/php/extensions/debug-non-zts-20131226/

<!-- more -->函數

這說明 php-sces 擴展被安裝到了,/usr/local/Cellar/php56/5.6.16/lib/php/extensions/debug-non-zts-20131226/ 路徑下。而後啓用這個 PHP 模塊:測試

# 兩種方法:
# 1.直接在 php.ini 中配置;2.寫成單獨的配置文件(前提是啓用了加載附加 .ini 配置文件這個功能)
# 配置內容都同樣:
[scws]
extension = "/usr/local/Cellar/php56/5.6.16/lib/php/extensions/debug-non-zts-20131226/scws.so"
scws.default.charset = utf-8
scws.default.fpath = "/usr/local/Cellar/scws/etc"

解釋一下:
extension: 模塊連接庫路徑
scws.default.charset:scws 模塊執行時默認編碼集
scws.default.fpath:scws 配置文件路徑編碼

重啓PHP,看看模塊是否加載成功:debug

➜  kill -USR2 311
➜  php -m | grep scws
# 輸出
scws

第二步:詞庫code

# 解壓詞庫
➜  tar -xvf scws-dict-chs-utf8.tar.bz2
# 輸出
x dict.utf8.xdb

將詞庫移動至安裝 scws 的 etc 目錄下:

➜  mv dict.utf8.xdb /usr/local/Cellar/scws/etc

測試安裝是否成功

<?php
header('Content-type: text/html; charset=utf-8');

if (extension_loaded('scws')) {
    $module = 'scws';
    $funcs  = get_extension_funcs($module);
    echo "模塊包含如下函數:\n";
    echo "---------------------------------------\n";
    print_r($funcs);
    echo "---------------------------------------\n";
    echo "模塊版本:\n";
    echo scws_version();
} else {
    echo '模塊未找到!<br>';
}

輸出:

模塊包含如下函數:
---------------------------------------
Array
(
    [0] => scws_open
    [1] => scws_new
    [2] => scws_close
    [3] => scws_set_charset
    [4] => scws_add_dict
    [5] => scws_set_dict
    [6] => scws_set_rule
    [7] => scws_set_ignore
    [8] => scws_set_multi
    [9] => scws_set_duality
    [10] => scws_send_text
    [11] => scws_get_result
    [12] => scws_get_tops
    [13] => scws_has_word
    [14] => scws_get_words
    [15] => scws_version
)
---------------------------------------
模塊版本:
SCWS (Module version:0.2.2, Library version:1.2.2) - by hightman%

SCWS 自帶函數詳解


mixed scws_new(void)

功能: 建立並返回一個 SimpleCWS 類操做對象。

返回值: 成功返回類操做句柄,失敗返回 false。


mixed scws_open(void)

功能: 建立並返回一個分詞操做句柄。

返回值: 成功返回 scws 操做句柄,失敗返回 false。


bool scws_close(resource scws_handle)

功能: 關閉一個已打開的 scws 分詞操做句柄。

參數: scws_handle 即以前由 scws_open 打開的返回值。

返回值: 始終爲 true


bool scws_set_charset(resource scws_handle, string charset)

功能: 設定分詞詞典、規則集、欲分文本字符串的字符集。

參數: charset 要新設定的字符集,只支持 utf8 和 gbk。(默認爲 gbk,utf8不要寫成utf-8)。
返回值: 始終爲 true


bool scws_add_dict(resource scws_handle, string dict_path [, int mode])

功能: 添加分詞所用的詞典,新加入的優先查找。

參數: dict_path 詞典的路徑,能夠是相對路徑或徹底路徑(遵循安全模式下的 open_basedir)。

參數: mode 可選,表示加載的方式,其值有:

- SCWS_XDICT_TXT  表示要讀取的詞典文件是文本格式,能夠和後2項結合用
- SCWS_XDICT_XDB  表示直接讀取 xdb 文件(此爲默認值)
- SCWS_XDICT_MEM  表示將 xdb 文件所有加載到內存中,以 XTree 結構存放,可用異或結合另外2個使用。

返回值: 成功返回 true 失敗返回 false


bool scws_set_dict(resource scws_handle, string dict_path [, int mode])

功能: 設定分詞所用的詞典並清除已存在的詞典列表

參數: dict_path 詞典的路徑,能夠是相對路徑或徹底路徑(遵循安全模式下的 open_basedir)。
參數: mode 可選,表示加載的方式。參見 scws_add_dict

返回值: 成功返回 true 失敗返回 false


bool scws_set_rule(resource scws_handle, string rule_path)

功能: 設定分詞所用的新詞識別規則集(用於人名、地名、數字時間年代等識別)。

參數: rule_path 規則集的路徑,能夠是相對路徑或徹底路徑(遵循安全模式下的 open_basedir)。
參數: mode 表示加載的方式。參見 scws_add_dict

返回值: 成功返回 true 失敗返回 false


bool scws_set_ignore(resource scws_handle, bool yes)

功能: 設定分詞返回結果時是否去除一些特殊的標點符號之類。

參數: yes 若是爲 true 則結果中不返回標點符號,若是爲 false 則會返回,缺省爲 false。

返回值: 始終爲 true


bool scws_set_multi(resource scws_handle, int mode)

功能: 設定分詞返回結果時是否複式分割,如「中國人」返回「中國+人+中國人」三個詞。

參數: mode 複合分詞法的級別,缺省不復合分詞。取值由下面幾個常量異或組合(也可用 1-15 來表示):

- SCWS_MULTI_SHORT   (1)短詞
- SCWS_MULTI_DUALITY (2)二元(將相鄰的2個單字組合成一個詞)
- SCWS_MULTI_ZMAIN   (4)重要單字
- SCWS_MULTI_ZALL    (8)所有單字

返回值: 始終爲 true


bool scws_set_duality(resource scws_handle, bool yes)

功能: 設定是否將閒散文字自動以二字分詞法聚合

參數: yes 設定值,若是爲 true 則結果中多個單字會自動按二分法聚分,若是爲 false 則不處理,缺省爲 false。

返回值: 始終爲 true


bool scws_send_text(resource scws_handle, string text)

功能: 發送設定分詞所要切割的文本。

參數: text 要切分的文本的內容。

返回值: 成功返回 true 失敗返回 false

注意: 系統底層處理方式爲對該文本增長一個引用,故不論多長的文本並不會形成內存浪費;執行本函數時,若未加載任何詞典和規則集,則會自動試圖在 ini 指定的缺省目錄下查找缺省字符集的詞典和規則集。


mixed scws_get_result(resource scws_handle)

功能: 根據 send_text 設定的文本內容,返回一系列切好的詞彙。

返回值: 成功返回切好的詞彙組成的數組,若無更多詞彙,返回 false。返回的詞彙包含的鍵值以下:

- word  string      詞自己
- idf   float       逆文本詞頻
- off   int         該詞在原文本路的位置
- attr  string      詞性

注意: 每次切詞後本函數應該循環調用,直到返回 false 爲止,由於程序每次返回的詞數是不肯定的。


mixed scws_get_tops(resource scws_handle [, int limit [, string attr]])

功能: 根據 send_text 設定的文本內容,返回系統計算出來的最關鍵詞彙列表。

參數: limit 可選參數,返回的詞的最大數量,缺省是 10 。

參數: attr 可選參數,是一系列詞性組成的字符串,各詞性之間以半角的逗號隔開,這表示返回的詞性必須在列表中,若是以~開頭,則表示取反,詞性必須不在列表中,缺省爲NULL,返回所有詞性,不過濾。

返回值: 成功返回統計好的的詞彙組成的數組,返回 false。返回的詞彙包含的鍵值以下:

- word    string    詞自己
- times   int       詞在文本中出現的次數
- weight  float     該詞計算後的權重
- attr    string    詞性

mixed scws_get_words(resource scws_handle, string attr)

功能: 根據 send_text 設定的文本內容,返回系統中詞性符合要求的關鍵詞彙。

參數: attr 是一系列詞性組成的字符串,各詞性之間以半角的逗號隔開,這表示返回的詞性必須在列表中,若是以~開頭,則表示取反,詞性必須不在列表中,若爲空則返回所有詞。

返回值: 成功返回符合要求詞彙組成的數組,返回 false。返回的詞彙包含的鍵值參見 scws_get_result


bool scws_has_word(resource scws_handle, string attr)

功能: 根據 send_text 設定的文本內容,返回系統中是否包括符合詞性要求的關鍵詞。

參數: attr 是一系列詞性組成的字符串,各詞性之間以半角的逗號隔開,這表示返回的詞性必須在列表中,若是以~開頭,則表示取反,詞性必須不在列表中,若爲空則返回所有詞。

返回值: 若是有則返回 true,沒有就返回 false。


string scws_version(void)

功能: 返回 scws 版本號名稱信息(字符串)。

返回值: 返回string,scws 版本號名稱信息。


測試分詞功能

<?php
echo "開始測試分詞:\n";
echo "------------------------------------------------\n";
// 記錄開始時間
$starttime = microtime(true);

// 開始分詞
$keyword = <<<EOF
陳凱歌並非《無極》的惟一著做權人,一部電影的總體版權歸電影製片廠全部。

一部電影的做者包括導演、攝影、編劇等創做人員,這些創做人員對他們的創做是有版權的。不通過製片人受權,其餘人不能對電影作拷貝、發行、反映,不能經過網絡來傳播,既不能把電影改編成小說、連環畫等其餘藝術形式發表,也不能把一部幾個小時才能放完的電影改編成半個小時就能放完的短片。

著做權和版權在我國是同一個概念,是法律賦予做品創做者的專有權利。所謂專有權利就是沒有通過權利人許可又不是法律規定的例外,要使用這個做品,就必須通過做者受權,沒有受權就是侵權。

一九八零年春天
EOF;
$cws = scws_open();
// 設置分詞編碼
scws_set_charset($cws, "utf8");
// 設置分詞所用字典
scws_set_dict($cws, ini_get('scws.default.fpath') . '/dict.utf8.xdb');
// 設定分詞所用的識別規則集
scws_set_rule($cws, ini_get('scws.default.fpath') . '/rules.utf8.ini');
// 發送要分割的字符串
scws_send_text($cws, $keyword);
// 設定分詞返回結果時是否去除一些特殊的標點符號之類
scws_set_ignore($cws, true);
// 設定分詞返回結果時是否複式分割,如「中國人」返回「中國+人+中國人」三個詞
// scws_set_multi($cws, false);
// 散文字自動以二字分詞法聚合
scws_set_duality($cws, true);

echo "\n最關鍵詞彙列表\n";
echo "-------------------------------------------------------------\n";
echo "No. 關鍵詞                       Attr     Weight(times)\n";
echo "-------------------------------------------------------------\n";
$list = scws_get_tops($cws, 20, '');
$number = 1;
foreach ($list as $value) {
    printf("%02d. %s \t\t\t %s \t  %.2f(%d)\n",
        $number, $value['word'], $value['attr'], $value['weight'], $value['times']);
    $number++;
}

echo "-------------------------------------------------------------\n";
echo "\n返回切好的詞彙\n";
echo "-------------------------------------------------------------\n";
while ($result = scws_get_result($cws)) {
    foreach ($result as $value) {
        if ($value['len'] == 1 && $value['word'] == "\r")
            continue;
        if ($value['len'] == 1 && $value['word'] == "\n")
            echo $value['word'];
        else
            printf("%s:%s  ", $value['word'], $value['attr']);
    }
}
scws_close($cws);

// 對於分詞返回結果去除特殊標點符號
// scws_set_ignore($cws, true);
// 對於分詞結果是否複試分割
// scws_set_multi($cws, SCWS_MULTI_ZMAIN);
$endtime = microtime(true);
// 執行時間
echo "\n-------------------------------------------------------------\n\n";
echo '腳本執行了:'.bcsub($endtime, $starttime,  6)."秒";
echo "\n\n";

輸出:

開始測試分詞:
------------------------------------------------

最關鍵詞彙列表
-------------------------------------------------------------
No. 關鍵詞                       Attr     Weight(times)
-------------------------------------------------------------
01. 電影                         n        25.02(6)
02. 不能                         v        19.08(4)
03. 通過                         v        14.82(3)
04. 創做                         vn       14.82(3)
05. 受權                         v        14.79(3)
06. 版權                         n        14.76(3)
07. 專有                         vn       13.94(2)
08. 陳凱歌                       nr       11.87(1)
09. 改編                         v        11.82(2)
10. 一九八零年                   t        10.72(1)
11. 無極                         ns       10.02(1)
12. 權利                         n        9.88(2)
13. 小時                         n        9.68(2)
14. 人員                         n        9.60(2)
15. 就是                         n        9.52(2)
16. 不是                         v        9.48(2)
17. 法律                         n        9.32(2)
18. 沒有                         v        9.30(2)
19. 做者                         n        9.18(2)
20. 做品                         n        9.12(2)
-------------------------------------------------------------

返回切好的詞彙
-------------------------------------------------------------
陳凱歌:nr  並:c  不是:v  無極:ns  的:uj  惟一:b  著做權人:n  一部:n  部:n  電影:n  的:uj  總體:n  版權:n  歸:v  電影:n  製片廠:n  全部:v  

一部:n  部:n  電影:n  的:uj  做者:n  包括:v  導演:n  攝影:vn  編劇:n  等:v  創做:vn  人員:n  這些:r  創做:vn  人員:n  對:p  他們:r  的:uj  
創做:vn  是:v  是有:v  有:v  版權:n  的:uj  不:d  通過:v  製片人:n  受權:v  其餘人:rr  不能:v  對:p  電影:n  作:v  拷貝:n  發行:vn  反映:v  
不能:v  經過:v  網絡:n  來:v  傳播:vn  既:c  不能:v  把:p  電影:n  改編:v  成:v  小說:n  連環畫:n  等:v  其餘:r  藝術:n  形式:n  發表:v  也
:d  不能:v  把:p  把一:m  一部:n  部幾:m  幾個:q  個:q  小時:n  才能:v  放:v  放完:v  完的:uj  的:uj  電影:n  改編:v  成半個:nr  小時:n  就
能:v  能放:v  放完:v  完的:uj  的:uj  短片:n  

著做權:n  和:c  版權:n  在:p  我國:n  是:v  同一個:b  概念:n  是:v  法律:n  賦予:v  做品:n  創做者:n  的:uj  專有:vn  權利:n  所謂:v  專有:v
n  權利:n  就是:n  沒有:v  通過:v  權利人:n  許可:v  又:d  不是:v  法律:n  規定:v  的:uj  例外:v  要:v  使用:v  這個:r  做品:n  就:d  必須:d
  通過:v  做者:n  受權:v  沒有:v  受權:v  就是:n  侵權:vn  

一九八零年:t  春天:t  
-------------------------------------------------------------

腳本執行了:0.004200秒

搞定!

總結

測試了一些詞,分詞準確性在90%左右。繼續對配置文件修改一下,應該能夠正常使用。

相關文章
相關標籤/搜索