首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

接入 Discuz! 在線分詞 API 實現 PHP 中文關鍵詞提取

     編輯:PHP 相關知識

自建分詞詞庫維護成本高、準確率難保證。Discuz! 官方提供免費在線中文分詞/關鍵詞提取 API,僅需 HTTP 請求即可獲得高質量分詞結果。本文封裝即用型函數,詳解參數、返回值解析、長度限制處理及調用示例。

API 端點與參數

GET https://keyword.discuz.com/related_kw.html
參數:
- title   (string, 必填) 標題,建議 < 100 字
- content (string, 可選) 正文內容,建議 < 2400 字節(超長會截取)
- ics     (string) 輸入編碼,默認 utf-8
- ocs     (string) 輸出編碼,默認 utf-8

返回 XML 結構

<?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>

封裝函數:dz_segment()

<?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 為公共免費服務,有頻率限制、可用性風險。生產環境建議:

  1. 本地緩存:以 md5($title.$content) 為鍵,Redis/File 緩存結果 24 小時。
  2. 超時控制:使用 cURL 替代 simplexml_load_file,設置 3 秒連接/讀取超時。
  3. 降級方案:API 失效時回退至本地分詞(如 phpanalysis、jieba-php)。
  4. 異步處理:寫入消息隊列,後台 Worker 調用 API 更新關鍵詞字段,不阻塞主請求。

cURL 版本(推薦生產用)

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 的內部微服務)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved