PHPAnalysis 是 PHP 生態中廣泛使用的中文分詞庫,採用逆向最大匹配算法,兼容性強、無需擴展、純 PHP 實現。本文深度解析核心配置變量、分詞流程、詞典管理、關鍵 API。
核心配置變量
| 變量 | 默認值 | 說明 | 設置方法 |
| resultType | 1 | 結果類型:1=全部,2=詞典詞+單字+英文,3=詞典詞+英文 | SetResultType() |
| notSplitLen | 5 | 句子最小切分長度 | 直接賦值 |
| toLower | false | 英文轉小寫 | 直接賦值 |
| differMax | false | 最大切分模式消岐(二元詞) | 直接賦值 |
| unitWord | true | 嘗試合並單字(新詞識別) | 直接賦值 |
| differFreq | false | 高頻詞優先消岐 | 直接賦值 |
核心 API 詳解
1. 構造函數
public function __construct(
$source_charset = 'utf-8', // 輸入編碼
$target_charset = 'utf-8', // 輸出編碼
$load_all = true, // 已廢棄
$source = '' // 直接傳入文本
)
2. 設置源文本
public function SetSource($source, $source_charset = 'utf-8', $target_charset = 'utf-8')
// 返回 bool,建議使用此方法而非構造函數傳文本
3. 執行分詞
public function StartAnalysis($optimize = true)
// $optimize: 分詞後是否優化結果(合並數字、英文等)
4. 獲取結果:多種格式
// 關鍵詞提取(按頻率)
public function GetFinallyKeywords($num = 10) // 返回 "詞1,詞2,詞3"
// 完整分詞結果(字符串)
public function GetFinallyResult($spword = ' ') // 分隔符默認空格
// 簡單結果(陣列)
public function GetSimpleResult() // array('詞1', '詞2', ...)
// 詳細結果(含詞性等屬性)
public function GetSimpleResultAll()
// 返回 array(
// array('word'=>'詞', 'attr'=>1), // 1=中文詞, 2=英文, 3=標點, 4=數字, 5=未識別
// ...
// )
// 索引陣列(詞=>頻率,按頻率降序)
public function GetFinallyIndex()
// array('詞1'=>5, '詞2'=>3, ...)
5. 詞典管理
// 文本詞庫編譯為二進制詞典
public function MakeDict($source_file, $target_file = '')
// $target_file 為空則覆蓋默認詞典
// 導出當前詞典為文本
public function ExportDict($targetfile)
標準分詞流程
// 1. 實例化
$pa = new PhpAnalysis();
// 2. 設置文本
$pa->SetSource('PHPAnalysis 是一個優秀的中文分詞組件,支援 UTF-8 和 GBK 編碼。');
// 3. 配置屬性
$pa->resultType = 2; // 獲取詞典詞+單字+英文
$pa->differMax = true; // 開啟最大切分消岐
$pa->unitWord = true; // 開啟新詞識別
// 4. 執行分詞
$pa->StartAnalysis(true);
// 5. 獲取結果
$keywords = $pa->GetFinallyKeywords(10); // 關鍵詞
$index = $pa->GetFinallyIndex(); // 詞頻統計
$segments = $pa->GetFinallyResult(' | '); // 分詞字符串
$detail = $pa->GetSimpleResultAll(); // 詳細屬性
// 輸出示例
echo "關鍵詞: $keywords\n";
echo "分詞: $segments\n";
print_r($index);
詞典文件格式
# 文本詞典格式 (每行一詞)
PHPAnalysis
中文分詞
組件
UTF-8
GBK
編碼
支援
優秀
的
是
一個
# 編譯後生成二進制詞典文件,載入速度提升 10x+
進階配置組合推薦
| 場景 | 配置組合 | 效果 |
| 搜索引擎索引 | resultType=2, differMax=true, unitWord=true | 覆蓋面廣、支持新詞 |
| 關鍵詞提取 | resultType=3, differFreq=true | 高頻詞優先、過濾單字 |
| 文本分類 | resultType=1, toLower=true | 保留所有信息、英文統一 |
| 高性能分詞 | resultType=3, differMax=false, unitWord=false | 速度最快、精度稍低 |
性能優化建議
- 詞典預編譯:生產環境必須使用
MakeDict() 編譯二進制詞典
- 單例模式:分詞對象重用,避免重複載入詞典
- 內存管理:大文本分塊處理,避免一次性載入超大字符串
- 緩存結果:相同文本分詞結果緩存(MD5 作為鍵)
// 單例封裝示例
class Segmenter {
private static $instance;
private $pa;
private function __construct() {
$this->pa = new PhpAnalysis();
// 載入自定義詞典
$this->pa->MakeDict('/path/custom_dict.txt');
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function segment($text, $type = 2) {
$this->pa->SetSource($text);
$this->pa->resultType = $type;
$this->pa->StartAnalysis();
return $this->pa->GetFinallyResult(' ');
}
}
常見問題排查
| 問題 | 原因 | 解決 |
| 分詞結果為空 | 編碼不匹配 | 確認 SetSource charset 與文本一致 |
| 英文單詞被拆分 | 未識別為整體 | 啟用 toLower 或檢查詞典 |
| 專有名詞識別失敗 | 詞典缺失 | 添加到自定義詞典並重新 MakeDict |
| 內存耗盡 | 文本過大 | 分句處理、增加 memory_limit |
更多 NLP 技術:《中文分詞算法原理》、《PHP 自然語言處理實戰》