1. 为什么我要用 Codex 重做中文分词这件事中文分词看起来是个老话题但真正落到业务里麻烦往往不在“能不能分”而在“分得对不对”。比如“大语言模型”被切成“大 / 语言 / 模型”“提示工程”被切成“提示 / 工程”语义就散了。通用分词库的默认词典覆盖不了垂直领域的术语而手动维护词典又容易变成体力活。我这次想验证的是能不能让 Codex 帮我把一个支持自定义词典、带可视化页面的中文智能分词工具从零搭起来并且控制在半小时内跑通。结论是可以而且过程比想象中顺。核心思路是把任务拆成三层——分词内核、HTTP 接口、前端展示每一层都用自然语言描述清楚输入输出Codex 负责把骨架和细节补齐。这篇文章会交付几样能直接复制的东西一份 Codex 的config.toml骨架、自定义词典的文件格式示例、分词核心与 Flask 接口的关键代码、前端可视化页面的结构以及本地运行验证的完整步骤。适合谁看适合想用 AI 辅助写 Python 小工具、又不想被环境配置卡住的开发者也适合需要给团队快速搭一个分词 Demo 的产品或算法同学。下面按“先跑通、再优化”的顺序来每一步都有可复制的片段和验证方式。2. 前置准备Codex 配置与 TaoToken 接入在动手写代码之前先把 Codex 的运行环境理顺。我习惯用config.toml管理模型和接入参数这样切换模型或调整超时不用改代码。如果你用的是 TaoToken 提供的统一接入把 API 地址和 Key 填进去即可模型对话、编码计划、控制台和密钥管理都有对应的入口。2.1 config.toml 骨架# ~/.codex/config.toml model claude-sonnet-4-20250514 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY [profiles.default] model claude-sonnet-4-20250514 approval_policy on-request这里base_url用的是 API 地址不带任何多余参数。env_key指向环境变量Key 不要写进文件里。设置好之后在终端里导出export TAOTOKEN_API_KEY你的密钥密钥可以在控制台的 API Keys 页面生成建议按项目单独建一个方便后续轮换。如果你更习惯在网页里直接试模型效果模型对话页面可以先跑几句中文分词相关的 prompt确认模型对 jieba 的 API 熟悉程度。2.2 项目依赖分词内核用 jiebaWeb 框架用 Flask词云用 wordcloud图表前端用 ECharts。依赖不多用 uv 管理比较干净uv init chinese-tokenizer cd chinese-tokenizer uv add jieba flask flask-cors wordcloud matplotlib装完之后确认一下版本uv run python -c import jieba, flask, wordcloud; print(ok)输出ok就说明环境没问题。这一步别跳过后面报错大多能在这里提前发现。3. 可复制配置分词内核与自定义词典分词内核是整个工具的地基。我让 Codex 生成一个ChineseTokenizer类把分词、词性标注、关键词提取、词频统计、命名实体识别、词云生成都收进去外部只调方法不碰 jieba 的细节。3.1 自定义词典文件格式jieba 的用户词典格式是“词语 可选词频 可选词性”用空格分隔一行一个。放在dict/custom_dict.txt大语言模型 100 n 提示工程 100 n 检索增强生成 100 n 多模态 100 n 思维链 100 n 向量数据库 100 n词频给高一点能提高这些词被优先切出来的概率词性填n表示名词后续词性标注会用到。词典文件用 UTF-8 保存别用 GBK否则加载会乱码。3.2 分词核心代码tokenizer.py的关键部分如下重点是_load_custom_dict在初始化时加载词典以及add_custom_word同时更新内存和文件import os import jieba import jieba.posseg as pseg import jieba.analyse from collections import Counter class ChineseTokenizer: def __init__(self): base os.path.dirname(__file__) self.dict_dir os.path.join(base, dict) self.output_dir os.path.join(base, output) self.custom_dict_path os.path.join(self.dict_dir, custom_dict.txt) os.makedirs(self.dict_dir, exist_okTrue) os.makedirs(self.output_dir, exist_okTrue) self._load_custom_dict() def _load_custom_dict(self): if os.path.exists(self.custom_dict_path): jieba.load_userdict(self.custom_dict_path) def tokenize(self, text, modeprecise): if mode full: words jieba.cut(text, cut_allTrue) elif mode search: words jieba.cut_for_search(text) else: words jieba.cut(text, cut_allFalse) return [w for w in words if w.strip()] def add_custom_word(self, word, freqNone, posNone): if freq and pos: jieba.add_word(word, freqfreq, tagpos) else: jieba.add_word(word) line word if freq: line f {freq} if pos: line f {pos} with open(self.custom_dict_path, a, encodingutf-8) as f: f.write(line \n)三种分词模式的区别值得说清楚精确模式适合大多数场景全模式会把所有可能的词都切出来有冗余搜索引擎模式会在精确模式基础上把长词再切出短词适合做召回。你可以用同一句话分别跑三种模式对比结果。3.3 词性标注与实体识别词性标注用pseg.cut返回(词, 词性)对。命名实体识别没有额外模型直接基于词性标签筛nr是人名ns是地名nt是机构名。这种方式轻量但对未登录词效果一般适合 Demo 阶段。def pos_tagging(self, text): result [] for word, flag in pseg.cut(text): if word.strip(): result.append({word: word, pos: flag}) return result def named_entity_recognition(self, text): entities {persons: [], locations: [], organizations: []} for word, flag in pseg.cut(text): word word.strip() if not word: continue if flag in (nr, nrt, nrfg) and word not in entities[persons]: entities[persons].append(word) elif flag ns and word not in entities[locations]: entities[locations].append(word) elif flag nt and word not in entities[organizations]: entities[organizations].append(word) return entities4. 验证请求Flask 接口与可视化页面内核写好后用 Flask 包一层 HTTP 接口前端通过 fetch 调用。接口设计尽量扁平一个功能一个路由方便前端按标签页切换。4.1 Flask 接口app.py里注册分词、词性、关键词、词频、实体、词云、词典管理这几组路由。以分词和词典为例from flask import Flask, request, jsonify, send_from_directory, send_file from flask_cors import CORS from tokenizer import ChineseTokenizer app Flask(__name__, static_folderstatic, static_url_path) CORS(app) tokenizer ChineseTokenizer() app.route(/api/tokenize, methods[POST]) def api_tokenize(): data request.get_json() text data.get(text, ) mode data.get(mode, precise) if not text: return jsonify({error: 文本不能为空}), 400 words tokenizer.tokenize(text, modemode) return jsonify({words: words, count: len(words), mode: mode}) app.route(/api/dict/add, methods[POST]) def api_add_word(): data request.get_json() word data.get(word, ).strip() if not word: return jsonify({error: 词汇不能为空}), 400 tokenizer.add_custom_word(word, freqdata.get(freq), posdata.get(pos)) return jsonify({message: f已添加: {word}})启动服务uv run python app.py看到Running on http://localhost:5000就说明后端起来了。4.2 前端可视化页面前端用 Vue 3 的 CDN 版本加 ECharts不搭构建工具一个index.html加一个app.js就够。页面分三块顶部文本输入区、中间功能标签页、右侧自定义词典管理面板。标签页对应分词、词性、关键词、词频、实体、词云六个功能。词频用 ECharts 柱状图展示 Top 20关键词用横向条形图展示权重词云直接展示后端生成的 PNG。前端调用接口的写法async function analyze(tab) { if (!inputText.value.trim()) { alert(请先输入文本); return; } loading.value true; const r await fetch(/api/${tab}, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ text: inputText.value, mode: tMode.value }) }); const data await r.json(); // 按 tab 分发到对应结果对象 loading.value false; }4.3 运行验证打开浏览器访问http://localhost:5000输入一段测试文本比如大语言模型正在改变软件开发行业提示工程和检索增强生成成为热门方向。点击“分词”应该能看到“大语言模型”“提示工程”“检索增强生成”被完整切出来而不是被拆散。再点“词性标注”这些词会显示为名词。点“词云”后端生成图片并返回展示。如果词典里没加这些词分词结果会明显不同。你可以先在右侧面板添加“大语言模型”再重新分词对比前后差异——这就是自定义词典的价值。5. 本篇常见错排查跑通之后我把踩过的坑整理成一张表遇到问题先对照这里。现象可能原因处理方式启动报ModuleNotFoundError: jieba依赖没装进当前环境用uv run python app.py而不是直接python app.py词典加了但分词没变化词典文件编码不是 UTF-8用编辑器另存为 UTF-8重新加载词云图片中文变方块字体路径不对把font_path改成系统里存在的中文字体路径前端请求 404Flask 静态目录配置不对确认static_folderstatic且文件在static/下接口返回 400请求体没带text字段检查前端JSON.stringify的字段名词性标注结果为空文本全是标点或空白过滤后再传入或检查输入端口被占用5000 端口有其他服务改app.run(port5001)词云字体这块单独说一句Linux 上常见的中文字体路径是/usr/share/fonts/truetype/wqy/wqy-microhei.ttcmacOS 上是/System/Library/Fonts/PingFang.ttc。路径写错不会报错但生成的图里中文全是方块很容易误判成代码问题。6. 继续扩展与接入建议跑通基础版之后可以按需加功能。比如批量分析上传一个 TXT 文件后端一次性返回词频、关键词和实体适合处理长文档。再比如把词典管理做成持久化每次启动自动加载避免重启后丢失。如果你打算把这个工具接到更大的流程里比如让 Codex 在编码过程中直接调用分词接口可以考虑用 Coding Plan 管理长期的编码任务把模型调用和项目上下文统一起来。密钥和接入参数在控制台里集中管理换模型或加配额不用改代码。最后留一个实用技巧自定义词典不要一次性堆太多词按领域分批加每加一批就用同一段测试文本验证效果。词频给 100 左右通常够用给太高会让某些词过度切分反而影响其他词的边界。分词这件事调优比搭建更花时间但有了可视化页面每次调整都能立刻看到结果效率会高很多。
企业数字化 ERP 产品动态
相关推荐
多模态AI搜索信源筛选:大模型采信证据链与内容适配路径 一、多模态AI搜索的四个常见问题多模态AI搜索正在改变用户获取信息的路径。当用户向豆包、文心一言、DeepSeek等平台提问时,答案并非凭空生成,而是基于一套隐性的信源筛选与证据权重机制。企业面临的第一道困惑是:为什么官网内容详实… · 2026/9/25 16:51:41
GEO内容信任危机:AI搜索时代企业权威性如何构建 一、GEO优化的技术实践的四个常见问题当生成式引擎优化进入企业视野,一个被反复提及的困惑是:为什么精心准备的内容投喂给大模型后,AI在回答用户提问时依然绕开企业信息?行业调研中常遇到四类典型问题。其一,企业官网内… · 2026/9/25 16:51:41
Atlas 300V 24G部署YOLO实战:从ONNX转换到多路视频推理 1. 先说清楚:Atlas 300V 24G到底是什么卡这段时间好几个做视觉检测的朋友来问我同一件事——“Atlas 300V 24G是不是运算加速卡?能不能直接拿来部署YOLO?”问的人多了,我意识到很多人其实对这个系列的认知是模糊的,甚至… · 2026/9/25 16:51:41
ONNX Runtime端侧部署三要素:打包、量化与线程治理 1. 项目概述:为什么端侧推理不能只靠“跑通就行”ONNX Runtime 打包、量化与推理线程治理——这九个字不是技术堆砌,而是端侧模型落地的三道生死关。我带团队做过17个终端AI项目,从智能摄像头固件到车载语音助手,再到工业手持终端… · 2026/9/25 17:31:30
Seastar 高性能服务器框架实战指南:从编译构建、构建模式到异步编程工程接入 后端异步编程网络 【免费下载链接】seastar High performance server-side application framework 项目地址: https://gitcode.com/gh_mirrors/se/seastar 点击查看 免费下载 Seastar 是一个基于事件驱动与 future 编程模型的高性能服务器端 C 框架,支持… · 2026/9/25 17:31:30
vectorbt Rust 引擎(vectorbt-rust)完整指南:安装、引擎调度原理、源码构建与基准测试 金融科技数据分析 【免费下载链接】vectorbt The backtesting engine that gives you an unfair advantage. Run thousands of trading ideas before others finish one. 项目地址: https://gitcode.com/gh_mirrors/ve/vectorbt 点击查看 免费下载 vectorbt 是一个… · 2026/9/25 17:31:23
Atlas 300V 24G推理加速卡部署YOLO模型全流程详解 先说明一下:这篇分享完完全全来自我最近被“Atlas 300V 24G”这个型号折腾到半夜的真实经历。我前期为了把手头YOLO模型跑起来,把官方文档翻了个底朝天,中间踩过的坑、绕过的弯,绝对比官方FAQ里写的多得多。如果你正打算在新算力平… · 2026/9/25 17:30:53
AI Agent开发碎片化破局:GitAgent声明式配置与工程化实践 1. AI Agent开发的碎片化困局到底卡在哪做过AI Agent项目的人大概都有这种体会:明明只是想做一个能自动处理工单、能查数据库、能调API的小助手,结果光是项目结构就折腾了一整天。工具调用逻辑写在一个文件里,提示词模板散落在另一个目录&… · 2026/9/25 17:30:53
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37