中文分词接口:长文本如何切分与批量处理
chinese-segmentation-long-text-269 # 中文分词接口:长文本如何切分与批量处理
> 接口:中文分词接口(269-1) · 免费 · POST/GET · JSON · 适用人群:后端、数据工程师 · 阅读时间:9 分钟
## 核心要点
- 单接口即可处理整段文本;超长文本建议按句/段切片后多次调用,避免单请求体过大。
- 批量处理用并发 + 限流(令牌桶),在免费档位内平稳跑完,不触发限流。
- 切片后各片段的 `list` 按顺序拼接即可还原全文词序列。
## Why:长文本为什么要切片
一篇几千字文章直接塞进 `text` 也能返回,但单请求体过大、单次耗时变长、失败重试成本高。按段落切片后并发调用,既能控制单请求大小,又能在某段失败时只重切那段,整体更稳。
## What:处理方案速览
| 项 | 说明 |
|----|------|
| 切片单位 | 按句号/换行切段,或固定字符窗口 |
| 并发 | 多段并行调用,配令牌桶限速 |
| 合并 | 按原顺序拼接各段 `list` |
| 容错 | 单段失败仅重切该段,不整体重跑 |
## How:切片 + 并发 + 限流
**Python(令牌桶限速 + 并发拼接)**
```python
import urllib.request, urllib.parse, json, time, threading
from concurrent.futures import ThreadPoolExecutor
APP_KEY = "YOUR_APPKEY"
_bucket = threading.Semaphore(5) # 并发上限,按免费档位调整
_rate = threading.Semaphore(10) # 令牌桶:每秒约 10 次
_lock = threading.Lock()
def segment_one(text):
with _rate:
time.sleep(0.1) # 简单限速
with _bucket:
url = f"https://route.showapi.com/269-1?appKey={APP_KEY}"
data = urllib.parse.urlencode({"text": text}).encode("utf-8")
req = urllib.request.Request(url, data=data,
headers={"content-type": "application/x-www-form-urlencoded"})
try:
with urllib.request.urlopen(req, timeout=10) as resp:
res = json.loads(resp.read().decode("utf-8"))
body = res.get("showapi_res_body", {})
return body.get("list", []) if body.get("ret_code") == 0 else []
except Exception as e:
print("段失败:", e)
return []
def segment_long(text, max_len=200):
pieces = [text[i:i+max_len] for i in range(0, len(text), max_len)]
results = [None] * len(pieces)
def worker(i, p):
results[i] = segment_one(p)
with ThreadPoolExecutor(max_workers=5) as ex:
for i, p in enumerate(pieces):
ex.submit(worker, i, p)
words = []
for r in results:
words.extend(r or [])
return words
long_text = "第一段很长的内容……第二段很长的内容……" # 实际替换为真实长文本
print("总词数:", len(segment_long(long_text)))
```
**cURL(单段)**
```bash
curl -X POST "https://route.showapi.com/269-1?appKey=YOUR_APPKEY" \
--data-urlencode "text=这是其中的一个切片段落"
```
**Node.js(Promise 并发)**
```js
async function segmentLong(text, maxLen = 200) {
const pieces = Array.from({length: Math.ceil(text.length/maxLen)},
(_, i) => text.slice(i*maxLen, (i+1)*maxLen));
const out = await Promise.all(pieces.map(async p => {
const res = await fetch(`https://route.showapi.com/269-1?appKey=YOUR_APPKEY`, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ text: p }).toString()
}).then(r => r.json());
return (res.showapi_res_body || {}).list || [];
}));
return out.flat();
}
```
## 返回示例与解析
长文本切片后每段独立返回 `list`,按原序拼接得到完整词序列,与"整段一次调用"语义一致(分词边界以片内为准,跨片边界词可能略有差异)。
## 进阶 / 边界
- 切片会切断跨段词语(如段尾词被截断),如需严格连续可在切片处留重叠窗口。
- 并发数与限速需对照[免费档位说明](https://www.showapi.com/free-api)设置,避免被限流。
- 失败重试建议指数退避,见[免费档位下的限流与调用策略](https://www.showapi.com/guides/chinese-segmentation-free-tier-269)。
## FAQ
**Q:一次能传多长的 text?**
A:接口未公开明确上限,建议控制单请求体量;超长文本按本文切片处理更稳。
**Q:切片会影响分词准确性吗?**
A:片内分词正常,仅跨切片边界的词可能受影响;可用重叠窗口缓解。
**Q:并发多高合适?**
A:依免费档位而定,先用小并发(如 5) + 限速跑,观察后再调。
**Q:批量结果如何保序?**
A:按切片原顺序拼接各段 `list` 即可,如上代码用下标数组保序。
## 相关能力 / 下一步阅读
- [中文分词接口:免费档位下的限流与调用策略](https://www.showapi.com/guides/chinese-segmentation-free-tier-269)
- [中文分词接口:中文编码与英文/数字/标点的处理边界](https://www.showapi.com/guides/chinese-segmentation-encoding-269)
- [中文分词接口:5 分钟从注册到拿到第一条分词结果](https://www.showapi.com/guides/chinese-segmentation-quickstart-269)
- **本系列共 11 篇**:查看[中文分词接口指南总目录](https://www.showapi.com/guides/chinese-segmentation-guides-269)