文本相似度 API 接入文档text-similarity
纯本地计算的文本相似度比对,输入两段文本(每段 ≤ 5000 字)输出 4 种相似度指标 + 加权综合评分 + 5 级评级。 • **零延迟零成本**:纯 PHP 本地计算,无外部上游依赖,平均响应 < 100ms • **4 种指标**:余弦相似度(35%)+ Jaccard 系数(25%)+ 编辑距离归一化(20%)+ LCS 比率(20%) • **5 级评级**:几乎相同 / 高度相似 / 中度相似 / 轻度相似 / 差异较大 • **修复源码 bug**:自实现 mb_levenshtein 字符级编辑距离,杜绝 PHP 内置 levenshtein 按字节计算导致的 85 汉字崩溃问题 • **超长保护**:超过 500 字符自动截取并按比例还原,5000×5000 字符比对约 60-80ms • **典型场景**:评论查重、AI 生成内容检测、多语言翻译质量评估、客服话术匹配
1. 基本信息
| 接口地址 | https://v1.apizero.cn/api/text-similarity |
|---|---|
| 请求方法 | POST |
| 分类 | dev |
| 提供方 | 极数本源 |
| 计费模式 | 免费试用 |
| 单次消耗 | 0 积分 |
| 起步价 | — |
| QPS 限制 | 10 req/s |
| 每日免费额度 | 50000 次(已认证用户) |
| 匿名每日额度 | 10000 次(无 API Key) |
| VIP 免费 | 否 |
| 调用次数 |
2. 认证
匿名每日 100 次、QPS 5;登录用户每日 500 次、QPS 10(全部免费)。零上游成本,纯本地计算。
获取 API Key:登录 https://apizero.cn/account/keys
3. 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
text1 | string | 是 | 第一段文本,1-5000 字符(中英文均按 1 字符计) | 今天天气不错,适合出门散步 |
text2 | string | 是 | 第二段文本,1-5000 字符 | 今天天气真好,适合出门走走 |
4. 请求头
| Header | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
Authorization | string | 否 | API Key 鉴权头,格式 Bearer sk_live_xxx;匿名调用时可省略(每日 100 次免费) | Bearer sk_live_xxxxxxxxxxxxxx |
Content-Type | string | 否 | 支持 application/x-www-form-urlencoded 或 application/json | application/json |
5. 请求示例
以下 5 种语言示例都是可直接运行的,只需把 YOUR_API_KEY 替换为实际 Key。
cURL
curl -X POST "https://v1.apizero.cn/api/text-similarity" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text1": "今天天气不错,适合出门散步",
"text2": "今天天气真好,适合出门走走"
}'Python
import requests
resp = requests.request(
"POST",
"https://v1.apizero.cn/api/text-similarity",
headers={"X-Api-Key": "YOUR_API_KEY", "Content-Type": "application/json"},
json={
"text1": "今天天气不错,适合出门散步",
"text2": "今天天气真好,适合出门走走",
},
timeout=15,
)
resp.raise_for_status()
print(resp.json())JavaScript (Node.js)
// Node.js 18+ / 浏览器原生 fetch
const res = await fetch("https://v1.apizero.cn/api/text-similarity", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"text1": "今天天气不错,适合出门散步",
"text2": "今天天气真好,适合出门走走"
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);Go
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
body := []byte(`{"text1":"今天天气不错,适合出门散步","text2":"今天天气真好,适合出门走走"}`)
req, _ := http.NewRequest("POST", "https://v1.apizero.cn/api/text-similarity", bytes.NewBuffer(body))
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}PHP
<?php
$payload = json_encode([
"text1" => "今天天气不错,适合出门散步",
"text2" => "今天天气真好,适合出门走走",
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("https://v1.apizero.cn/api/text-similarity");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($ch);
curl_close($ch);
$data = json_decode($body, true);
print_r($data);6. 响应字段
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
text1_length | number | text1 字符长度(mb_strlen) | — |
text2_length | number | text2 字符长度 | — |
overall_score | number | 综合相似度评分 0.0-1.0(保留 4 位小数) | — |
similarity_level | string | 相似度等级英文枚举:nearly_identical / highly_similar / moderately_similar / slightly_similar / different | — |
level_name | string | 相似度等级中文:几乎相同 / 高度相似 / 中度相似 / 轻度相似 / 差异较大 | — |
metrics | object | 详细指标对象 | — |
metrics.cosine | number | 余弦相似度 0-1(基于 2-gram 词频向量),权重 35% | — |
metrics.jaccard | number | Jaccard 相似系数 0-1(2-gram 集合交并比),权重 25% | — |
metrics.edit_similarity | number | 编辑距离归一化相似度 0-1(1 - distance/maxLen),权重 20% | — |
metrics.lcs_similarity | number | LCS 最长公共子序列归一化比率 0-1(2 × lcsLen / (len1+len2)),权重 20% | — |
metrics.edit_distance | number | 编辑距离原始值(字符数;超过 500 字符截取后按比例还原) | — |
metrics.lcs_length | number | LCS 最长公共子序列长度(截取后的实际值) | — |
truncated | boolean | edit/LCS 是否经过 500 字符截取近似(仅 cosine/jaccard 始终基于全文) | — |
7. 响应示例
{
"code": 0,
"msg": "成功",
"data": {
"text1_length": 13,
"text2_length": 13,
"overall_score": 0.6471,
"similarity_level": "moderately_similar",
"level_name": "中度相似",
"metrics": {
"cosine": 0.5833,
"jaccard": 0.4118,
"edit_similarity": 0.6923,
"lcs_similarity": 0.9231,
"edit_distance": 4,
"lcs_length": 12
},
"truncated": false
},
"request_id": "abc123def456"
}8. 错误码
| code | status | 说明 |
|---|---|---|
4000 | — | 参数错误:text1 / text2 任一为空 / 超过 5000 字符 |
4015 | — | 匿名调用每日额度用完,需要 API Key |
4029 | — | QPS 超限 |
4030 | — | 今日额度用完 |
9. 变更日志
- 1.0.0(2026-05-07)
- 首次上线,纯本地计算无上游依赖
- 4 种相似度指标加权融合:余弦 35% + Jaccard 25% + Edit 20% + LCS 20%
- 修复源码 BUG:自实现 mb_levenshtein 按字符(非字节)计算编辑距离,杜绝中文 85 字以上崩溃问题
- 修复源码 BUG:源码 levenshtein else 分支用 mb_substr(0,200) 截取后仍可能超 255 字节限制 → 已用纯字符级算法替代
- LCS 空间优化为 O(min(m,n)),5000×5000 比对内存 < 200KB
- 超过 500 字符自动截取并按比例还原 edit_distance(保证 P99 响应 < 100ms)
- 新增 truncated 字段,告知前端是否启用了截取近似
- 新增 metrics.lcs_length 字段,便于查重场景直接读取「连续相同片段长度」
- 5 级评级:nearly_identical(≥0.9) / highly_similar(≥0.7) / moderately_similar(≥0.4) / slightly_similar(≥0.2) / different
- 支持 application/json 请求体
常见问题
文本相似度 接口怎么免费使用?
未登录用户每个 IP 每天 10000 次免费。登录用户创建 API Key 后每天 50000 次免费,超额部分按点数计费(0 点/次)。
文本相似度 支持哪些调用方式?
接口使用 POST 请求。文档提供 cURL、Python、JavaScript (Node.js)、Go、PHP 五种语言的可运行示例。也可以下载 /openapi.json 导入 Postman / Insomnia / Apifox 反向生成 SDK。
调用不限额么? QPS 是多少?
本接口 QPS 限制 10 req/s,每个 API Key 每日免费 50000 次。需要更高额度可升级 VIP 套餐或联系售后提高 QPS。
这个接口跟自己直连上游有什么区别?
极数本源 作为中间层提供:统一鉴权(一个 Key 调所有接口)、统一计费(点数制)、统一限流、统一错误码、多上游自动切换。免去逐个对接上游、维护 Key、统计调用量的运维成本。