text-classify-ui/README.md
2025-03-31 04:35:10 +08:00

249 lines
8.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔍 中文文本分类系统 (子尧毕业设计)
![版本](https://img.shields.io/badge/版本-1.0-blue.svg)
![Python](https://img.shields.io/badge/Python-3.9-green.svg)
![Flask](https://img.shields.io/badge/Flask-最新版-red.svg)
![TensorFlow](https://img.shields.io/badge/TensorFlow-最新版-orange.svg)
---
## 📋 项目简介
本项目是一个基于 Flask 和 TensorFlow/Keras 实现的中文文本分类系统,旨在作为"子尧"同学的毕业设计。系统允许用户上传文本文件(单个 .txt、直接输入文本或上传包含多个 .txt 文件的压缩包(.zip 或 .rar并自动对这些文本内容进行预定义的类别如体育、娱乐、科技等分类。
分类完成的文档会被存储在 MySQL 数据库中,并按照"类别-编号-原文件名"的格式保存在服务器指定目录。用户可以方便地在网页端查看已分类的文档列表,并按类别筛选,支持下载单个或批量打包下载已分类的原始文件。
---
## ✨ 主要功能
- **📄 单文件分类**: 上传单个 `.txt` 文件进行文本分类
- **📝 文本输入分类**: 直接在文本框中输入内容进行分类
- **📦 批量文件分类**: 上传 `.zip``.rar` 压缩包,系统会自动解压并分类包内所有 `.txt` 文件
- **💾 结果存储**: 将分类结果(类别、原始文件名、存储路径等)存入 MySQL 数据库
- **📊 文档管理**: 在网页端展示已分类的文档列表,支持按类别筛选
- **⬇️ 文件下载**: 提供单个文件下载和多选文件打包zip下载功能
- **🔐 用户认证**: 基础功能,确保用户只能看到自己上传和分类的文档
---
## 🔧 技术栈
- **🔙 后端框架**: Flask (Python 3.9)
- **🧠 机器学习**: TensorFlow / Keras (模型加载与预测), Jieba (中文分词)
- **🗄️ 数据库**: MySQL
- **🔄 反向代理**: Nginx
---
## 📥 部署说明 (Debian 12)
以下步骤将指导您如何在 Debian 12 服务器上部署此应用。**请注意,由于 Debian 12 默认 Python 版本为 3.11,我们将使用 `pyenv` 来安装和管理所需的 Python 3.9 版本。**
### 📋 部署目标:
- 使用 `pyenv` 安装 Python 3.9
- 使用 Gunicorn 运行 Flask 应用 (监听指定端口或 Socket)
- 使用 Nginx 作为反向代理
### 🔍 先决条件:
- 一台 Debian 12 服务器
- 拥有 `sudo` 权限的用户
- 已安装 Git
- MySQL 数据库服务(本地或远程),并准备好数据库名、用户名、密码
### 🚀 部署步骤:
#### 1⃣ 服务器准备与 pyenv 安装
```bash
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础编译工具、Nginx、Git 及 pyenv 依赖
sudo apt install -y --no-install-recommends make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git nginx
# 安装 pyenv (使用官方脚本)
curl https://pyenv.run | bash
# 配置 Shell 环境 (添加到 ~/.bashrc)
echo '# pyenv config' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# 使配置生效 (或重新登录)
source ~/.bashrc
# 验证 pyenv
pyenv --version
```
#### 2⃣ 安装 Python 3.9
```bash
# 查看可用的 Python 3.9.x 版本
# pyenv install --list | grep " 3.9"
# 安装一个具体的 3.9.x 版本 (例如 3.9.18, 请检查并使用最新的 3.9 补丁版本)
pyenv install 3.9.18 # 安装过程可能需要几分钟
```
#### 3⃣ 获取代码
```bash
# 创建项目部署目录 (例如 /var/www)
sudo mkdir -p /var/www/text-classify-ui
# 更改所有权给你当前的用户,方便操作
sudo chown $USER:$USER /var/www/text-classify-ui
cd /var/www/text-classify-ui
# 克隆代码仓库
git clone https://git.sq0715.com/qin/text-classify-ui.git .
```
#### 4⃣ 设置 Python 虚拟环境 (使用 Python 3.9)
```bash
# 进入项目目录
cd /var/www/text-classify-ui
# 使用 pyenv 安装的 Python 3.9 创建虚拟环境 'ziyao'
# 注意: 这里的路径 ~/.pyenv/... 依赖于你的 pyenv 安装和选择的 Python 版本
~/.pyenv/versions/3.9.18/bin/python -m venv ziyao
# 激活虚拟环境
source ziyao/bin/activate
# 升级 pip 并安装项目依赖
pip install --upgrade pip
pip install -r requirements.txt
```
#### 5⃣ 应用配置
- 项目可能使用 `.env` 文件或 `config.py` 来管理配置。
- **创建或编辑 `.env` 文件**: 在项目根目录 (`/var/www/text-classify-ui`) 创建一个名为 `.env` 的文件,至少包含以下内容(请替换为你的实际值):
```dotenv
# .env 文件示例
FLASK_APP=app.py
FLASK_ENV=production # 设置为 production 环境
SECRET_KEY='一个非常安全且随机的密钥' # 请生成一个强密钥
# 数据库连接信息
DB_HOST='localhost' # 或你的数据库服务器地址
DB_PORT='3306'
DB_USER='your_db_user'
DB_PASSWORD='your_db_password'
DB_NAME='text_classify_db'
# 上传和临时文件夹 (相对于 app.py)
UPLOAD_FOLDER='uploads'
TEMP_FOLDER='temp'
# 模型路径 (相对于 app.py)
MODEL_PATH='model/trained_model.h5'
TOKENIZER_PATH='model/tokenizer.pickle'
```
- **确保数据库已创建**:
```sql
CREATE DATABASE text_classify_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';
GRANT ALL PRIVILEGES ON text_classify_db.* TO 'your_db_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
*注意: 如果数据库在不同服务器,请将 `'localhost'` 替换为 Flask 应用服务器的 IP 地址。*
#### 6⃣ 配置 Nginx 反向代理
- **创建 Nginx 配置文件**:
```bash
sudo nano /etc/nginx/sites-available/text-classify-ui
```
粘贴以下配置,替换 `your_domain_or_server_ip`
```nginx
server {
listen 80;
server_name your_domain_or_server_ip; # 替换为你的域名或服务器 IP
client_max_body_size 20M; # 允许上传最大 20MB 的文件 (根据需要调整)
location / {
# 将请求转发给 Gunicorn
proxy_pass http://127.0.0.1:50004; # 如果 Gunicorn 监听端口
# 如果 Gunicorn 使用 Socket:
# proxy_pass http://unix:/var/www/text-classify-ui/text-classify-ui.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s; # 增加超时,防止大文件上传或处理中断
proxy_connect_timeout 75s;
}
location /static {
# 直接服务静态文件
alias /var/www/text-classify-ui/static;
expires 30d; # 静态文件缓存 30 天
}
}
```
- **启用配置并重启 Nginx**:
```bash
# 创建软链接到 sites-enabled 目录
sudo ln -s /etc/nginx/sites-available/text-classify-ui /etc/nginx/sites-enabled/
# 测试 Nginx 配置是否有语法错误
sudo nginx -t
# 如果测试成功,重新加载 Nginx 服务
sudo systemctl reload nginx
```
#### 7⃣ 配置防火墙 (如果使用 `ufw`)
```bash
# 允许 Nginx 的 HTTP (80) 和 HTTPS (443) 流量
sudo ufw allow 'Nginx Full'
# 确保 SSH 端口已允许 (通常默认是允许的)
# sudo ufw allow OpenSSH
# 启用防火墙 (如果尚未启用)
# sudo ufw enable
```
### ✅ 完成!
现在你应该可以通过浏览器访问 `http://your_domain_or_server_ip` 来使用你的文本分类系统了。
---
## ⚠️ 注意事项
- **🔒 安全**: 确保 `.env` 文件中的 `SECRET_KEY` 是强随机值且不被泄露。考虑为数据库连接使用更严格的权限。
- **🔐 HTTPS**: 为了生产环境安全,强烈建议配置 Nginx 使用 SSL/TLS 证书启用 HTTPS (可以使用 Let's Encrypt 免费获取)。
- **📊 模型文件**: 确保模型文件 (`trained_model.h5` 和 `tokenizer.pickle`) 随代码一起部署到服务器的 `model` 目录中,并且运行 Gunicorn 的用户有读取权限。
- **📦 依赖库**: 如果在部署过程中遇到特定库的编译错误,可能需要安装额外的 `-dev` 包。
---
## 📞 联系方式
如有任何问题或需要技术支持,请通过以下邮箱联系我:
📧 **联系邮箱**: [1980721162@qq.com](mailto:1980721162@qq.com)
---
🙏 祝部署顺利!