SCWS PHP 中文簡易分詞

最閒的碼農發表於2019-07-12

PHP 分詞演示

  1. 首先安裝SCWS,取得 scws 原始碼並解壓到當前目錄

    wget -q -O - http://www.xunsearch.com/scws/down/scws-1.... | tar xjf -

  2. 進入原始碼目錄配置和編譯

    cd scws-1.2.1 ; ./configure ; make install

   cd /usr/local/scws/etc
   wget <http://www.xunsearch.com/scws/down/scws-dict-chs-gbk.tar.bz2>
   wget <http://www.xunsearch.com/scws/down/scws-dict-chs-utf8.tar.bz2>
   tar xvjf scws-dict-chs-gbk.tar.bz2
   tar xvjf scws-dict-chs-utf8.tar.bz2

1.編譯安裝

    cd scws-1.2.1;cd phpext;
    phpize
    ./configure --with-scws=/usr/local --with-php-config=php安裝路徑/bin/php-config
    sudo make && make install

2.在 php.ini 中加入以下內容

    [scws]
    ; 注意請檢查 php.ini 中的 extension_dir 的設定值是否正確, 否則請將 extension_dir 設為空,
    ; 再把 extension = scws.so 或 php_scws.dll(win) 指定絕對路徑。
    extension = scws.so
    scws.default.charset = gbk
    scws.default.fpath = /usr/local/scws/etc

3.命令列下執行 php -m 就能看到 scws 了,phpinfo() 也會包含關於 scws 的資訊。

$so = scws_new();   
// 這裡沒有呼叫 set_dict 和 set_rule 系統會自動試呼叫 ini 中指定路徑下的詞典和規則檔案
$so->set_charset('utf8'); // $so->set_charset('gbk');  

$so->set_dict('/usr/local/scws/etc/dict.utf8.xdb'); //設定分詞所用詞典(此處使用utf8的詞典)
$so->set_rule('/usr/local/scws/etc/rules.utf8.ini ');//設定分詞所用規則 
//分詞前去掉標點符號
$so->set_ignore(true);
//是否複式分割,如“中國人”返回“中國+人+中國人”三個詞。
$so->set_multi(true);
//設定將文字自動以二字分詞法聚合
$so->set_duality(true);
//要進行分詞的語句
$words = array();
//var_dump($so->get_result());
while ($tmp = $so->get_result())
{
    foreach ($tmp as $val) {
        if(!new_in_array($val, $words,'word')){
            $words[] = array(
                'word' => $val['word'],
                'weight' => $val['idf'],
            );
        }
    }
}
$so->close();
var_dump($words);
//遞迴分詞 
function new_in_array($need,$array,$column=''){  
    $flag = false; 
    foreach ($array  as  $val) { 
        if($val[$column] == $need[$column]){ 
            $flag = true; break; 
        } 
    } 
    return  $flag;
}
  1. scws 這是分詞的命令列工具,執行 scws -h 可以看到詳細幫助說明。

    Usage: scws [options] [[-i] input] [[-o] output]
    
    • -i string|file 要切分的字串或檔案,如不指定則程式自動讀取標準輸入,每輸入一行執行一次分詞

    • -o file 切分結果輸出儲存的檔案路徑,若不指定直接輸出到螢幕

    • -c charset 指定分詞的字符集,預設是 gbk,可選 utf8

    • -r file 指定規則集檔案(規則集用於數詞、數字、專有名字、人名的識別)

    • -d file[:file2[:...]] 指定詞典檔案路徑(XDB格式,請在 -c 之後使用)

      自 1.1.0 起,支援多詞典同時載入,也支援純文字詞典(必須是.txt結尾),多詞典路徑之間用冒號(:)隔開,
      排在越後面的詞典優先順序越高。
      
      文字詞典的資料格式參見 scws-gen-dict 所用的格式,但更寬鬆一些,允許用不定量的空格分開,只有<詞>是必備專案,
      其它資料可有可無,當詞性標註為“!”(歎號)時表示該詞作廢,即使在較低優先順序的詞庫中存在該詞也將作廢。
      
    • -M level 複合分詞的級別:1~15,按位異或的 1|2|4|8 依次表示 短詞|二元|主要字|全部字,預設不復合分詞。

    • -I 輸出結果忽略跳過所有的標點符號

    • -A 顯示詞性

    • -E 將 xdb 詞典讀入記憶體 xtree 結構 (如果切分的檔案很大才需要)

    • -N 不顯示切分時間和提示

    • -D debug 模式 (很少用,需要編譯時開啟 --enable-debug)

    • -U 將閒散單字自動呼叫二分法結合

    • -t num 取得前 num 個高頻詞

    • -a [~]attr1[,attr2[,...]] 只顯示某些詞性的詞,加~表示過濾該詞性的詞,多個詞性之間用逗號分隔

    • -v 檢視版本

  2. scws-gen-dict 詞典轉換工具

    Usage: scws-gen-dict [options] [-i] dict.txt [-o] dict.xdb
    
    • -c charset 指定字符集,預設為 gbk,可選 utf8
    • -i file 文字檔案(txt),預設為 dict.txt
    • -o file 輸出 xdb 檔案的路徑,預設為 dict.xdb
    • -p num 指定 XDB 結構 HASH 質數(通常不需要)
    • -U 反向解壓,將輸入的 xdb 檔案轉換為 txt 格式輸出 (TODO)

    文字詞典格式為每行一個詞,各行由 4 個欄位組成,欄位之間用若干個空格或製表符(\t)分隔。 含義(其中只有 <詞> 是必須提供的),# 開頭的行視為註釋忽略不計:

    #<詞>  <詞頻(TF)>  <詞重(IDF)>  <詞性(北大標註)>
    新詞條 12.0        2.2          n

效能指標

在 FreeBSD 6.2 系統,單核單 CPU 至強 3.0G 的伺服器上,測試長度為 80,535 的文字。 用附帶的命令列工具耗時將約 0.17 秒,若改用 php 擴充套件方式呼叫,則耗時約為 0.65 秒。

分詞精度 95.60%,召回率 90.51% (F-1: 0.93)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章