自建分詞詞庫維護成本高、準確率難保證。Discuz! 官方提供免費在線中文分詞/關鍵詞提取 API,僅需 HTTP 請求即可獲得高質量分詞結果。本文封裝即用型函數,詳解參數、返回值解析、長度限制處理及調用示例。
GET https://keyword.discuz.com/related_kw.html
參數:
- title (string, 必填) 標題,建議 < 100 字
- content (string, 可選) 正文內容,建議 < 2400 字節(超長會截取)
- ics (string) 輸入編碼,默認 utf-8
- ocs (string) 輸出編碼,默認 utf-8
<?xml version="1.0" encoding="utf-8"?>
<total_response>
<svalid>36000</svalid> <!-- 緩存有效期(秒) -->
<keyword>
<info>
<count>1</count> <!-- 關鍵詞數量 -->
<errno>0</errno> <!-- 0 成功 -->
<nextuptime>1291287160</nextuptime>
<keep>0</keep>
</info>
<result>
<item><kw><![CDATA[高三歷史]]></kw></item>
<item><kw><![CDATA[復習精品]]></kw></item>
...
</result>
</keyword>
</total_response>
<?php
/**
* 調用 Discuz! 在線分詞 API 獲取關鍵詞
* @param string $title 標題(必填)
* @param string $content 正文(可選)
* @param string $encode 編碼,默認 utf-8
* @return array|false 關鍵詞數組,失敗返回 false
*/
function dz_segment(string $title, string $content = '', string $encode = 'utf-8'): array|false {
if ($title === '') return false;
// 1. 清洗輸入
$title = rawurlencode(strip_tags($title));
$content = strip_tags($content);
// 2. 內容長度限制(API 限制約 2400 字節)
if (strlen($content) > 2400) {
$content = mb_substr($content, 0, 800, $encode); // 保留前 800 字符
}
$content = rawurlencode($content);
// 3. 請求 API
$url = "https://keyword.discuz.com/related_kw.html?title=$title&content=$content&ics=$encode&ocs=$encode";
// 使用 simplexml_load_file 直接解析 XML(需 allow_url_fopen=On)
libxml_use_internal_errors(true); // 抑制警告
$xml = @simplexml_load_file($url);
if ($xml === false) {
error_log("Discuz 分詞 API 請求失敗: $url");
return false;
}
// 4. 提取關鍵詞
$keywords = [];
if (isset($xml->keyword->result->item)) {
foreach ($xml->keyword->result->item as $item) {
$kw = (string)$item->kw;
if ($kw !== '') $keywords[] = $kw;
}
}
return $keywords ?: false;
}
<?php
$title = '高三歷史全程復習精品教程';
$content = '本教程涵蓋高三歷史所有知識點,包含古代史、近代史、現代史專題復習,適合一輪、二輪復習使用...';
$keywords = dz_segment($title, $content);
if ($keywords) {
echo "提取關鍵詞:\n";
print_r($keywords);
/* 輸出示例:
Array
(
[0] => 高三歷史
[1] => 復習精品
[2] => 教程
...
)
*/
} else {
echo "分詞失敗,請檢查網絡或 API 狀態。";
}
API 為公共免費服務,有頻率限制、可用性風險。生產環境建議:
md5($title.$content) 為鍵,Redis/File 緩存結果 24 小時。simplexml_load_file,設置 3 秒連接/讀取超時。phpanalysis、jieba-php)。function dz_segment_curl(string $title, string $content = '', string $encode = 'utf-8'): array|false {
if ($title === '') return false;
$title = rawurlencode(strip_tags($title));
$content = rawurlencode(strip_tags(mb_substr($content, 0, 800, $encode)));
$url = "https://keyword.discuz.com/related_kw.html?title=$title&content=$content&ics=$encode&ocs=$encode";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 3,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MyApp/1.0)',
]);
$xmlStr = curl_exec($ch);
$errno = curl_errno($ch);
curl_close($ch);
if ($errno || empty($xmlStr)) {
error_log("Discuz 分詞 cURL 錯誤: $errno - " . curl_strerror($errno));
return false;
}
libxml_use_internal_errors(true);
$xml = simplexml_load_string($xmlStr);
if ($xml === false) return false;
$keywords = [];
foreach ($xml->keyword->result->item ?? [] as $item) {
$kw = (string)$item->kw;
if ($kw) $keywords[] = $kw;
}
return $keywords ?: false;
}
| 場景 | 適用性 | 說明 |
|---|---|---|
| 內容發布時自動提取標籤/關鍵詞 | ✅ 高 | 異步調用,不影響發布速度 |
| 搜索查詢擴展(同義詞/相關詞) | ✅ 中 | 結合同義詞庫使用 |
| 實時高併發分詞(如即時搜索建議) | ❌ 低 | 網絡延遲不可控,需本地分詞 |
| 敏感/私有數據分詞 | ❌ 禁用 | 數據會發送至第三方服務器 |
Discuz! 在線分詞 API 為中小項目提供了「零維護、高質量」的中文關鍵詞提取能力。通過 simplexml_load_file 或 cURL 封裝,加上緩存、超時、降級機制,即可穩健接入。注意數據隱私邊界,敏感業務請自建分詞服務(如基於 Jieba/SCWS 的內部微服務)。