108-基于Python的中国古诗词数据可视化分析系统

基于Python的中国古诗词数据可视化分析系统 - 技术实现与架构设计

作者:码界筑梦坊

发布时间:2025年

技术栈:Python + Django + Vue.js + MySQL + 智谱AI

📖 目录

🎯 项目概述

本项目是一个基于Python技术栈的中国古诗词数据可视化分析系统,集成了诗词浏览、AI智能写诗、数据可视化分析等功能。系统采用前后端分离架构,后端使用Django REST Framework提供API服务,前端使用Vue.js构建用户界面,数据库采用MySQL存储诗词数据。

项目背景

随着传统文化的复兴,古诗词作为中华文化的重要组成部分,其数字化展示和智能分析需求日益增长。本项目旨在构建一个现代化的古诗词数据平台,通过技术手段让传统文化焕发新的活力。

设计理念

  • 文化传承:通过数字化手段保护和传承中华诗词文化
  • 技术创新:结合AI技术,实现智能诗词创作
  • 用户体验:提供直观友好的界面,让用户轻松浏览和交互
  • 数据驱动:通过可视化分析,挖掘诗词数据的内在价值

项目演示

💭项目源码获取,码界筑梦坊各大平台同名,博客底部含联系方式卡片,欢迎咨询!



























🏗️ 技术架构

技术栈详情

后端技术栈
python 复制代码
# 核心框架
Django==4.2.7                    # Web框架
Django REST Framework==3.14.0     # API框架
django-simpleui==2024.4.1         # 后台管理美化
django-cors-headers==4.3.1        # 跨域处理

# 数据库
MySQL==8.0                        # 关系型数据库
mysqlclient==2.2.0                # MySQL驱动

# AI集成
requests==2.31.0                  # HTTP客户端,用于调用智谱AI
python-decouple==3.8              # 环境变量管理

# 其他工具
Pillow==10.1.0                    # 图像处理
前端技术栈
javascript 复制代码
// 核心框架
Vue.js 3.x                        // 渐进式JavaScript框架
Vue Router 4.x                    // 路由管理
Vuex 4.x                          // 状态管理

// UI组件库
Element Plus 2.x                  // Vue 3 UI组件库

// 样式处理
SCSS                              // CSS预处理器
Axios                             // HTTP客户端

// 构建工具
Vue CLI                           // 项目脚手架
数据库设计
sql 复制代码
-- 主要数据表结构
CREATE TABLE poetry_author (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    dynasty VARCHAR(50),
    avatar_url TEXT,
    famous_quotes_count INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE poetry_poetry (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content TEXT NOT NULL,
    author_id INT,
    cipai_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES poetry_author(id),
    FOREIGN KEY (cipai_id) REFERENCES poetry_cipai(id)
);

系统架构图

展示层 数据层 后端层 前端层 数据可视化 MySQL数据库 智谱AI服务 Django REST API 后台管理 用户界面 Vue.js前端

🚀 核心功能

1. 用户管理系统

用户注册与登录
python 复制代码
# users/models.py
class User(AbstractUser):
    """自定义用户模型"""
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    bio = models.TextField(max_length=500, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = '用户'
        verbose_name_plural = '用户'
身份验证
python 复制代码
# poetry_system/authentication.py
class SessionAuthentication(authentication.SessionAuthentication):
    """自定义会话认证"""
    def authenticate(self, request):
        user = getattr(request, 'user', None)
        if not user or not user.is_active:
            return None
        return (user, None)

2. 诗词数据管理

数据模型设计
python 复制代码
# poetry/models.py
class Author(models.Model):
    """作者模型"""
    name = models.CharField(max_length=100, verbose_name='姓名')
    dynasty = models.CharField(max_length=50, verbose_name='朝代')
    avatar_url = models.TextField(blank=True, verbose_name='头像URL')
    famous_quotes_count = models.IntegerField(default=0, verbose_name='名句数量')
    
    class Meta:
        verbose_name = '作者'
        verbose_name_plural = '作者'
        ordering = ['-famous_quotes_count']

class Poetry(models.Model):
    """诗词模型"""
    title = models.CharField(max_length=200, verbose_name='标题')
    content = models.TextField(verbose_name='内容')
    author = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者')
    cipai = models.ForeignKey('CiPai', on_delete=models.SET_NULL, null=True, verbose_name='词牌')
    
    class Meta:
        verbose_name = '诗词'
        verbose_name_plural = '诗词'
        ordering = ['-id']

3. AI智能写诗

智谱AI集成
python 复制代码
# ai_poetry/poem_generator.py
import requests
import json

def generate_poem_zhipuai(prompt, model_type, line_type):
    """调用智谱AI生成诗词"""
    api_key = "your_zhipuai_api_key"
    url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
    
    # 根据参数构建提示词
    if model_type == "Tang":
        style = "唐诗"
    elif model_type == "Song":
        style = "宋词"
    else:
        style = "元曲"
    
    if line_type == "5":
        line_style = "五言"
    else:
        line_style = "七言"
    
    system_prompt = f"你是一位精通{style}的诗人,请根据关键词'{prompt}'创作一首{line_style}{style}。要求:1. 符合{style}的格律要求 2. 意境优美,用词精炼 3. 体现关键词的意境"
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    data = {
        "model": "glm-4",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": f"请以'{prompt}'为主题创作一首{line_style}{style}"}
        ],
        "temperature": 0.8,
        "max_tokens": 200
    }
    
    try:
        response = requests.post(url, headers=headers, json=data)
        response.raise_for_status()
        result = response.json()
        
        if 'choices' in result and len(result['choices']) > 0:
            content = result['choices'][0]['message']['content']
            return {
                'success': True,
                'content': content,
                'model_type': model_type,
                'line_type': line_type
            }
        else:
            return {'success': False, 'error': 'AI生成失败'}
            
    except Exception as e:
        return {'success': False, 'error': str(e)}
前端AI写诗界面
vue 复制代码
<!-- frontend/src/views/AiPoetry.vue -->
<template>
  <div class="ai-poetry-container">
    <div class="hero-section">
      <h1>AI智能写诗</h1>
      <p>输入关键词,选择体裁,让AI为您创作优美的古诗词</p>
    </div>
    
    <div class="form-section">
      <el-form :model="form" label-width="100px">
        <el-form-item label="关键词">
          <el-input 
            v-model="form.keywords" 
            placeholder="请输入创作关键词"
            class="custom-input"
          />
        </el-form-item>
        
        <el-form-item label="诗体类型">
          <el-select v-model="form.model_type" placeholder="选择诗体">
            <el-option label="唐诗" value="Tang" />
            <el-option label="宋词" value="Song" />
            <el-option label="元曲" value="Yuan" />
          </el-select>
        </el-form-item>
        
        <el-form-item label="句式类型">
          <el-select v-model="form.line_type" placeholder="选择句式">
            <el-option label="五言" value="5" />
            <el-option label="七言" value="7" />
          </el-select>
        </el-form-item>
        
        <el-form-item>
          <el-button 
            type="primary" 
            @click="generatePoem"
            :loading="loading"
            :disabled="!isLoggedIn"
          >
            开始创作
          </el-button>
        </el-form-item>
      </el-form>
    </div>
    
    <div v-if="result" class="result-section">
      <h3>创作结果</h3>
      <div class="poem-card">
        <h4>{{ result.title }}</h4>
        <p class="poem-content">{{ result.content }}</p>
        <div class="poem-meta">
          <span>体裁:{{ getModelTypeName(form.model_type) }}</span>
          <span>句式:{{ getLineTypeName(form.line_type) }}</span>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'AiPoetry',
  data() {
    return {
      form: {
        keywords: '',
        model_type: 'Tang',
        line_type: '7'
      },
      result: null,
      loading: false,
      isLoggedIn: false
    }
  },
  methods: {
    async generatePoem() {
      if (!this.form.keywords.trim()) {
        this.$message.warning('请输入关键词')
        return
      }
      
      this.loading = true
      try {
        const response = await axios.post('/api/ai/ai-poems/generate_zhipuai/', {
          prompt: this.form.keywords,
          model_type: this.form.model_type,
          line_type: this.form.line_type
        }, {
          withCredentials: true
        })
        
        if (response.data.success) {
          this.result = {
            title: this.form.keywords,
            content: response.data.content
          }
          this.$message.success('诗词创作成功!')
        } else {
          this.$message.error(response.data.error || '创作失败')
        }
      } catch (error) {
        this.$message.error('网络错误,请稍后重试')
      } finally {
        this.loading = false
      }
    }
  }
}
</script>

4. 数据可视化

高频词统计
python 复制代码
# poetry/views.py
from collections import Counter
import jieba

class PoetryAnalysisViewSet(viewsets.ModelViewSet):
    """诗词分析视图集"""
    
    @action(detail=False, methods=['get'])
    def word_frequency(self, request):
        """获取高频词统计"""
        # 获取所有诗词内容
        poems = Poetry.objects.all()
        all_text = ' '.join([poem.content for poem in poems])
        
        # 使用jieba分词
        words = jieba.cut(all_text)
        
        # 过滤停用词和短词
        stop_words = {'的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'}
        filtered_words = [word for word in words if len(word) > 1 and word not in stop_words]
        
        # 统计词频
        word_count = Counter(filtered_words)
        top_words = word_count.most_common(50)
        
        return Response({
            'words': [word for word, count in top_words],
            'counts': [count for word, count in top_words]
        })
热门作者排行
python 复制代码
@action(detail=False, methods=['get'])
def popular_authors(self, request):
    """获取热门作者排行"""
    authors = Author.objects.annotate(
        poem_count=Count('poetry')
    ).order_by('-poem_count')[:20]
    
    return Response({
        'authors': [author.name for author in authors],
        'counts': [author.poem_count for author in authors]
    })

5. 后台管理系统

Django SimpleUI配置
python 复制代码
# poetry_system/settings.py
INSTALLED_APPS = [
    'simpleui',  # 必须在django.contrib.admin之前
    'django.contrib.admin',
    # ... 其他应用
]

# SimpleUI配置
SIMPLEUI_CONFIG = {
    'system_keep': False,
    'menu_display': ['诗词管理', '用户管理', 'AI写诗管理'],
    'dynamic': True,
    'menus': [
        {
            'name': '诗词管理',
            'icon': 'fas fa-book',
            'models': [
                {
                    'name': '作者管理',
                    'url': 'poetry/author/',
                    'icon': 'fas fa-user'
                },
                {
                    'name': '诗词管理',
                    'url': 'poetry/poetry/',
                    'icon': 'fas fa-file-alt'
                },
                {
                    'name': '词牌管理',
                    'url': 'poetry/cipai/',
                    'icon': 'fas fa-tags'
                }
            ]
        }
    ]
}

📊 数据可视化展示

词云图示例

复制代码
[词云图展示区域]
- 唐诗高频词云
- 宋词高频词云
- 元曲高频词云

作者作品统计

复制代码
[柱状图展示区域]
- 热门作者作品数量排行
- 朝代分布统计
- 词牌使用频率

诗词风格分析

复制代码
[雷达图展示区域]
- 不同朝代的诗词风格特征
- 作者创作风格对比
- 题材分布分析

🔧 部署与运维

环境要求

bash 复制代码
# Python环境
Python 3.8+
pip 20.0+

# 数据库
MySQL 8.0+

# Node.js环境
Node.js 14.0+
npm 6.0+

快速部署

bash 复制代码
# 1. 克隆项目
git clone https://github.com/your-repo/chinese-poetry-system.git
cd chinese-poetry-system

# 2. 安装后端依赖
pip install -r requirements.txt

# 3. 配置数据库
python manage.py migrate

# 4. 创建超级用户
python manage.py createsuperuser

# 5. 安装前端依赖
cd frontend
npm install

# 6. 启动服务
# 后端
python manage.py runserver

# 前端
npm run serve

Docker部署

dockerfile 复制代码
# Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

🎨 项目特色

1. 文化传承与技术创新

  • 结合传统文化与现代技术
  • AI智能创作,让古诗词焕发新活力
  • 数据可视化展示诗词之美

2. 用户体验优化

  • 响应式设计,支持多端访问
  • 直观友好的操作界面
  • 丰富的交互功能

3. 技术架构先进

  • 前后端分离架构
  • RESTful API设计
  • 模块化代码组织

4. 数据安全可靠

  • 完善的用户权限管理
  • 数据备份与恢复机制
  • 安全的API调用

🚧 技术难点与解决方案

1. AI模型集成

难点:本地AI模型部署复杂,资源消耗大

解决方案

  • 采用智谱AI云服务
  • 实现动态提示词构建
  • 完善的错误处理机制
python 复制代码
# 错误处理示例
try:
    response = requests.post(url, headers=headers, json=data, timeout=30)
    response.raise_for_status()
    result = response.json()
    
    if 'choices' in result and len(result['choices']) > 0:
        content = result['choices'][0]['message']['content']
        return {'success': True, 'content': content}
    else:
        return {'success': False, 'error': 'AI生成失败'}
        
except requests.exceptions.Timeout:
    return {'success': False, 'error': '请求超时'}
except requests.exceptions.RequestException as e:
    return {'success': False, 'error': f'网络错误: {str(e)}'}
except Exception as e:
    return {'success': False, 'error': f'未知错误: {str(e)}'}

2. 跨域认证问题

难点:前后端分离架构下的会话认证

解决方案

python 复制代码
# settings.py
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:8080",
    "http://127.0.0.1:8080",
]

# 前端配置
axios.defaults.withCredentials = true

3. 数据可视化性能

难点:大量诗词数据的实时分析

解决方案

  • 使用缓存机制
  • 异步处理大数据
  • 分页加载优化

🔮 未来规划

短期目标(3-6个月)

  • 增加更多AI模型支持
  • 优化移动端体验
  • 增加诗词朗读功能
  • 完善用户反馈系统

中期目标(6-12个月)

  • 开发诗词创作社区
  • 增加诗词翻译功能
  • 支持多语言界面
  • 开发移动端APP

长期目标(1年以上)

  • 构建诗词知识图谱
  • 开发智能推荐系统
  • 建立诗词创作比赛平台
  • 拓展到其他文学体裁

📁 项目目录结构

text 复制代码
chinese-poetry-master/
├── poetry_system/          # Django项目配置与入口(settings/urls/asgi/wsgi)
├── poetry/                 # 诗词模块:模型、序列化、视图、路由
├── ai_poetry/              # AI写诗模块:智谱AI集成与生成接口
├── users/                  # 用户模块:注册/登录/资料
├── frontend/               # Vue3前端:页面、组件、路由、状态、样式
├── data/                   # 原始数据:唐诗/宋诗/元曲/五代/千家诗等
├── spider/                 # 爬虫脚本:作者/词牌抓取
├── spider_output/          # 爬虫输出
├── static/                 # 静态资源:logo/截图/可视化图片
├── images/                 # 其他图片资源(支付等)
├── requirements.txt        # 后端依赖
├── start_system.bat        # 一键启动(Windows)
└── README.md               # 项目说明

🧭 API索引(已实现)

  • 基础说明:所有接口基于REST风格,统一前缀与路由如下
    • 后端主路由:poetry_system/urls.py
    • 统一前缀:
      • 诗词模块:/api/poetry/
      • 用户模块:/api/users/
      • AI模块:/api/ai/

1) AI写诗模块 ai_poetry/urls.py

  • POST /api/ai/ai-poems/generate_zhipuai/:生成诗词(参数:promptmodel_typeline_type
  • GET /api/ai/ai-poems/:AI生成诗词列表
  • GET /api/ai/ai-poems/{id}/:AI生成诗词详情
  • GET /api/ai/configs/:生成配置列表
  • GET /api/ai/configs/active/:获取激活配置

2) 诗词模块 poetry/urls.py

  • GET /api/poetry/:诗词列表(支持searchordering、分页)
  • GET /api/poetry/{id}/:诗词详情
  • GET /api/poetry/random/?count=10:随机诗词
  • GET /api/poetry/popular/:热门诗词
  • GET /api/poetry/authors/:作者列表
  • GET /api/poetry/authors/hot/:热门作者
  • GET /api/poetry/cipai/:词牌列表
  • GET /api/poetry/comments/?poetry_id={id}:评论列表
  • POST /api/poetry/comments/add/:新增评论(需登录)
  • GET /api/poetry/favorites/:我的收藏(需登录)
  • POST /api/poetry/favorites/toggle/:收藏/取消收藏(需登录)
  • GET /api/poetry/dynasties/:朝代列表
  • GET /api/poetry/categories/:分类列表
  • GET /api/poetry/chart_data/:数据概览(用于可视化)
  • GET /api/poetry/analysis/{poetry_id}/:单篇诗词深度分析
  • GET /api/poetry/authors/{author_id}/works/:某作者作品
  • GET /api/poetry/dynasty_stats/:朝代统计
  • GET /api/poetry/word_frequency/:高频词统计(支持按朝代/作者筛选)

3) 用户模块 users/urls.py

  • POST /api/users/register/:注册
  • POST /api/users/login/:登录(会话)
  • POST /api/users/logout/:退出
  • GET /api/users/profile/:个人资料
  • POST /api/users/profile/update/:更新资料

提示:部分接口需登录;前端需设置 axioswithCredentials: true;后端需开启 CORS_ALLOW_CREDENTIALS=True 并设置白名单。

❓ 常见问题FAQ

  • 401未授权(已登录仍提示未登录)
    • 后端:CORS_ALLOW_ALL_ORIGINS=False、配置 CORS_ALLOWED_ORIGINSCORS_ALLOW_CREDENTIALS=True
    • 前端:所有请求添加 { withCredentials: true }
  • AI返回结构解析失败(取不到data
    • 智谱AI返回在choices[0].message.content,不是data字段
  • 管理后台访问404或权限问题
    • 使用自定义AdminSite:访问 http://localhost:8000/admin/
    • 确保注册了 GroupPermission 模型到自定义站点
  • Element Plus 输入框样式不一致
    • 使用 ::v-deep 覆盖内层 .el-input__inner 背景、边框、阴影
  • 分页总数与前端展示不一致
    • 前端走后端分页参数:pagepage_size;后端用DRF分页器或自定义分页

🧠 最佳实践与总结

  • 配置管理:敏感信息使用环境变量(如 ZHIPUAI_API_KEY
  • 会话认证:统一使用Session Auth,前端全局withCredentials
  • API一致性:保持请求参数与返回结构稳定,定义统一的错误码/消息
  • 可视化性能:聚合统计尽量在后端完成,前端只做渲染
  • AI提示词工程:根据体裁/句式动态拼装Prompt并限制max_tokens
  • 数据质量:导入前做去重、清洗;字符集统一使用utf8mb4
  • 前端UX:表单与搜索框样式统一,分页置底居中;移动端适配
  • 日志与排错:后端统一日志;关键路径加监控(AI调用、收藏/评论)

📞 联系方式

  • 各大平台同名:码界筑梦坊
  • 欢迎在任一平台私信/留言交流合作与技术问题

🙏 致谢

  • 开源社区与数据集贡献者
  • 智谱AI开放平台(GLM系列)
  • Django / DRF / Vue3 / Element Plus / ECharts 等优秀开源项目
  • 参与测试与反馈的每一位同学

📚 参考资料

  1. Django官方文档
  2. Vue.js官方文档
  3. 智谱AI开放平台
  4. Element Plus组件库
  5. MySQL官方文档

感谢阅读!如果本文对您有帮助,请给个⭐️支持一下!

相关推荐
yanxing.D2 分钟前
OpenCV轻松入门_面向python(第三章图像运算)
人工智能·python·opencv
鸭鸭鸭进京赶烤1 小时前
EI检索-学术会议 | 人工智能、虚拟现实、可视化
人工智能·物联网·5g·信息可视化·云计算·vr·信号处理
Ai财富密码1 小时前
Python 爬虫:Selenium 自动化控制(Headless 模式 / 无痕浏览)
爬虫·python·selenium
小五1272 小时前
数据科学与计算实例应用
开发语言·python
站大爷IP2 小时前
Python类型注解:让代码“开口说话”的隐形助手
python
站大爷IP2 小时前
Python多态实战:从基础到高阶的“魔法”应用指南
python
华科云商xiao徐3 小时前
TypeScript在异步处理与类型安全的双重优势
爬虫·数据挖掘·数据分析
incidite3 小时前
爬虫与数据分析入门:从中国大学排名爬取到数据可视化全流程
爬虫·信息可视化·数据分析
紫金修道3 小时前
python安装部署rknn-toolkit2(ModuleNotFoundError: No module named ‘rknn_toolkit2‘)
开发语言·python