技术博客
中文分词接口:长文本如何切分与批量处理

中文分词接口:长文本如何切分与批量处理

作者: 万维易源
2026-09-01
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)