一、项目简介
自然语言处理(NLP)项目经常被写成单个脚本:输入一段文本,输出分词、关键词或情感结果。但在真实业务中,一个可交付的 NLP 工具包通常需要用户体系、语料管理、任务分析、结果留存、可视化操作界面和接口鉴权。本项目围绕“Python自然语言处理工具包开发”,实现一个可运行的全栈平台:用户注册登录后,可以保存待分析文本,调用后端 NLP 工具函数完成分词、关键词提取、情感分析、自动摘要和文本统计,并在前端查看历史分析记录。
二、技术栈
| 后端框架 | FastAPI | 提供 REST API、自动接口文档 |
| 数据库 | SQLite | 轻量本地数据库,适合演示和小型项目 |
| ORM | SQLAlchemy | 定义用户、语料、分析记录等数据模型 |
| 数据校验 | Pydantic | 请求体和响应体结构校验 |
| 认证方案 | PBKDF2 密码哈希 + Bearer Token | 实现注册、登录、退出和接口鉴权 |
| 前端框架 | Vue 3 + Vite | 构建单页应用和组件化页面 |
| NLP 实现 | Python 标准库规则算法 | 离线可运行,无需下载模型 |
注意:前端主技术栈是 Vue 3/Vite,不使用纯静态脚本作为主要实现。
三、系统架构
系统采用前后端分离架构:
Vue 3 页面
├─ 登录/注册组件
├─ 语料管理组件
├─ NLP 分析控制台
└─ 历史记录组件
│ HTTP + Bearer Token
▼
FastAPI 后端
├─ auth 接口:注册、登录、退出、当前用户
├─ document 接口:创建、查询用户语料
├─ analyze 接口:执行 NLP 分析并保存结果
└─ records 接口:查询历史记录
│ SQLAlchemy ORM
▼
SQLite 数据库
├─ users
├─ auth_tokens
├─ documents
└─ analysis_records
这种结构的优点是:后端可以独立提供 API,前端可替换为 Web、移动端或桌面端;NLP 算法也可以逐步替换为 jieba、HanLP、spaCy 或 Transformer 模型。
四、功能模块
1. 用户认证模块
- 用户注册
- 用户登录
- PBKDF2-HMAC-SHA256 密码哈希
- Bearer Token 认证
- 退出登录并删除 Token
- /api/auth/me 获取当前登录用户
2. 语料管理模块
- 新建语料文档
- 查询当前用户自己的文档
- 文档包含标题、正文、语言、创建时间
- 所有语料接口都需要登录后访问
3. NLP 工具模块
本项目实现了五类轻量 NLP 能力:
- tokens:中英文混合分词
- keywords:词频关键词提取
- sentiment:基于情感词典的正负向判断
- summary:基于关键词覆盖的抽取式摘要
- statistics:字符数、中文字符数、英文词数、句子数、Token 数统计
4. 分析记录模块
每次对文档执行分析,系统会将任务类型、结果 JSON、用户 ID、文档 ID 和创建时间保存到数据库,便于后续审计和复盘。
五、数据库/数据模型设计
后端在 backend/app/models.py 中定义四张核心表。
users:用户表
| id | Integer | 主键 |
| username | String | 唯一用户名 |
| password_hash | String | PBKDF2 哈希后的密码 |
| created_at | DateTime | 创建时间 |
auth_tokens:登录 Token 表
| id | Integer | 主键 |
| token | String | 登录令牌 |
| user_id | Integer | 所属用户 |
| created_at | DateTime | 创建时间 |
documents:语料表
| id | Integer | 主键 |
| title | String | 文档标题 |
| content | Text | 文本内容 |
| language | String | 语言标识 |
| user_id | Integer | 所属用户 |
| created_at | DateTime | 创建时间 |
analysis_records:分析记录表
| id | Integer | 主键 |
| task_type | String | 分析任务类型 |
| result_json | Text | JSON 字符串结果 |
| document_id | Integer | 关联文档 |
| user_id | Integer | 关联用户 |
| created_at | DateTime | 创建时间 |
六、后端接口设计
| GET | /api/health | 否 | 健康检查 |
| POST | /api/auth/register | 否 | 注册并返回 Token |
| POST | /api/auth/login | 否 | 登录并返回 Token |
| POST | /api/auth/logout | 是 | 退出登录 |
| GET | /api/auth/me | 是 | 当前用户信息 |
| POST | /api/documents | 是 | 创建语料 |
| GET | /api/documents | 是 | 查询语料列表 |
| POST | /api/analyze | 是 | 对指定文档执行分析 |
| POST | /api/analyze/batch | 是 | 对输入文本批量分析 |
| GET | /api/records | 是 | 查询历史分析记录 |
后端鉴权逻辑位于 main.py:
def extract_token(authorization: str = Header(default="")) –> str:
if not authorization.startswith("Bearer "):
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Missing bearer token")
return authorization.removeprefix("Bearer ").strip()
def current_user(token: str = Depends(extract_token), db: Session = Depends(get_db)) –> models.User:
user = crud.get_user_by_token(db, token)
if not user:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or expired token")
return user
所有核心业务接口都通过 Depends(current_user) 获得登录用户,避免越权访问别人的语料和分析记录。
七、前端页面设计
Vue 前端包含以下组件:
src/App.vue 主布局、登录状态、退出登录
src/components/AuthPanel.vue 注册/登录表单
src/components/DocumentManager.vue 语料创建与文档选择
src/components/AnalysisPanel.vue NLP 任务按钮与结果展示
src/components/RecordList.vue 历史分析记录
src/api.js API 封装、Token 存储、鉴权请求
src/style.css 全局样式
页面流程如下:
api.js 中的鉴权请求封装如下:
async function request(path, options = {}) {
const headers = { 'Content-Type': 'application/json', …(options.headers || {}) }
const token = getToken()
if (token) headers.Authorization = `Bearer ${token}`
const response = await fetch(`${API_BASE}${path}`, { …options, headers })
const data = await response.json().catch(() => ({}))
if (!response.ok) throw new Error(data.detail || '请求失败')
return data
}
八、核心代码讲解
1. 密码哈希与校验
crud.py 使用 Python 标准库实现 PBKDF2 密码哈希:
def hash_password(password: str, salt: Optional[str] = None) –> str:
salt = salt or secrets.token_hex(16)
digest = hashlib.pbkdf2_hmac("sha256", password.encode("utf-8"), salt.encode("utf-8"), 120000)
return f"pbkdf2_sha256${salt}${digest.hex()}"
校验时使用 hmac.compare_digest,避免普通字符串比较带来的时序攻击风险。
2. NLP 分词与关键词
nlp_service.py 将英文、数字、中文文本分别提取。中文部分为了保持离线轻量,没有依赖第三方词库,而是采用二元切分策略:
def tokenize(text: str) –> List[str]:
text = normalize_text(text)
english = re.findall(r"[A-Za-z][A-Za-z0-9_+-]*", text)
numbers = re.findall(r"\\d+(?:\\.\\d+)?", text)
chinese = re.findall(r"[\\u4e00-\\u9fff]+", text)
zh_tokens: List[str] = []
for block in chinese:
if len(block) <= 2:
zh_tokens.append(block)
else:
zh_tokens.extend(block[i:i + 2] for i in range(len(block) – 1))
tokens = [t.lower() for t in english] + numbers + zh_tokens
return [t for t in tokens if t and t not in STOP_WORDS]
关键词提取基于 Counter 统计词频:
def keywords(text: str, top_k: int = 10) –> List[Dict[str, int]]:
counter = Counter(tokenize(text))
return [{"word": word, "count": count} for word, count in counter.most_common(top_k)]
3. 情感分析
示例项目采用小型正负情感词典,适合教学演示:
def sentiment(text: str) –> Dict[str, object]:
tokens = set(tokenize(text))
pos = len(tokens & POSITIVE_WORDS)
neg = len(tokens & NEGATIVE_WORDS)
score = pos – neg
label = "positive" if score > 0 else "negative" if score < 0 else "neutral"
return {"label": label, "score": score, "positive_hits": pos, "negative_hits": neg}
后续可接入训练模型,将 sentiment() 替换为模型推理函数,但 API 响应结构不需要大改。
4. 分析并持久化
/api/analyze 接口先检查文档是否属于当前用户,再执行 NLP 任务并保存记录:
record, result = crud.analyze_document(db, user, doc, data.task_type)
return {"id": record.id, "task_type": record.task_type, "result": result, "created_at": record.created_at}
这种做法保证了业务结果可追踪,适合扩展为团队语料平台或企业文本分析后台。
九、部署与运行步骤
解压配套源码后,进入项目根目录 project/,分别启动后端和前端。
1. 启动后端
cd project/backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app –reload –host 0.0.0.0 –port 8000
启动后访问:
- API 地址:http://127.0.0.1:8000/api/health
- Swagger 文档:http://127.0.0.1:8000/docs
2. 启动 Vue 前端
cd project/frontend
npm install
npm run dev
访问 Vite 输出的地址,通常是:http://127.0.0.1:5173。
3. 初始化和使用
十、可扩展方向
- 接入 jieba 完成更准确的中文分词。
- 接入 scikit-learn 或 transformers 实现机器学习分类。
- 增加语料标签、项目空间、团队协作和权限角色。
- 增加任务队列,将大文本分析异步化。
- 使用 ECharts 展示词云、情感趋势和关键词排行。
- 将 SQLite 替换为 MySQL 或 PostgreSQL,适配生产环境。
十一、项目总结
本文完成了一个围绕“Python自然语言处理工具包开发”的全栈项目。它不是单纯讲 NLP 算法,而是把 NLP 能力包装为一个可登录、可管理语料、可保存分析结果、可通过 Vue 页面操作的完整系统。项目具备清晰的数据模型、认证鉴权、REST API、前端组件化页面和可运行部署步骤,适合继续扩展为企业文本分析平台、客服质检系统或内容运营辅助工具。
项目代码
下载链接




