博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍

技术栈:Python语言、Flask框架、Vue前端框架+Element UI、FastAPI后端+PaddleHub、数据集、新闻长文本10分类、Web+QT双端

研究背景:媒体内容爆炸时代,人工新闻分类效率低、标准不统一。利用PaddleHub训练的新闻10分类模型(财经、房产、教育等),结合FastAPI高并发服务与Vue+Element UI前端,可一分钟内完成“单条输入-模型预测-结果回显”闭环;同时提供QT客户端支持Excel批量导入,为媒体、企业、高校提供零门槛、可扩展的智能新闻归档工具。

研究意义:系统全程本地部署,保障数据隐私;前后端分离+双端设计支持Web便捷访问与桌面批量处理,模块化代码便于替换其他NLP模型,适合作为“机器学习”“Web开发”课程实践与毕业设计模板,推动NLP文本分类在教学与产业中的快速落地。

2、项目界面

(1)网页版本:输入新闻标题、新闻内容,点击新闻分类按钮,下方即可显示新闻的类型
在这里插入图片描述

(2)输入新闻标题、新闻内容,点击新闻分类按钮,下方即可显示新闻的类型
在这里插入图片描述

(3)QT版本:单条新闻文本分类:输入新闻标题、新闻内容,点击新闻分类,下方显示新闻类型
在这里插入图片描述

(4)QT版本:单条新闻文本分类:输入新闻标题、新闻内容,点击新闻分类,下方显示新闻类型
在这里插入图片描述

(5)页面设计
在这里插入图片描述

(6)页面设计
在这里插入图片描述

3、项目说明

NewsSort智能新闻分类系统采用“Web+QT”双端架构:Web端基于Vue+Element UI,通过Axios调用FastAPI接口,实现单条新闻实时分类;QT端支持单条输入与Excel批量导入两种模式,批量结果可一键导出CSV,大幅提升多文本处理效率。后端统一采用FastAPI+PaddleHub方案,加载已训练好的新闻10分类模型(财经、房产、教育、科技、军事、汽车、体育、游戏、娱乐、其他),单条预测<100ms,批量预测支持异步并发,RPS>500。

数据预处理模块自动完成长文本截断、分词、去停用词;预测结果返回类别名称与置信度,前端实时渲染高亮标签。用户管理采用SQLite,支持注册登录、历史记录查询、模型切换(Web/QT均可一键更换自有模型权重)。系统全程本地运行,不依赖外网,既保护数据隐私,又降低运维成本;代码开源、注释详尽,配套模型转换与前端打包教程,适合作为“NLP”“全栈开发”课程与毕业设计模板,也可用于媒体内容审核、信息归档、舆情分类等场景,推动文本分类技术在教学与产业中的快速落地。

4、核心代码



from fastapi import FastAPI, HTTPException, UploadFile
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
from sutil import cut_sent, replace_char, get_paragraphs_text
import uvicorn
import paddlehub as hub
import cv2
from paddlenlp import Taskflow
import time

print("模型加载预热!")
# OCR文本识别
ocr = hub.Module(name="chinese_ocr_db_crnn_server")
ocr_results = ocr.recognize_text (images=[cv2.imread('./test/imagetest.jpg')])

print("PaddleOCR图片识别结果:")
print(ocr_results)
# 处理识别结果
toCorrectText = []
for i in range(len(ocr_results[0]['data'])):
    toCorrectText.append(str(ocr_results[0]['data'][i]['text']))

# PaddleNLP 文本纠错
text_correction = Taskflow("text_correction")
# 纠错结果处理
print("PaddleNLP文本纠错结果:")
for idx, item in enumerate(toCorrectText):    
    res = text_correction(item)
    if (len(res[0]['errors'])) > 0:
        for i, error in enumerate(res[0]['errors']):
            if i == 0:
                item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), res[0]['errors'][i]['position'])
            else:
                # 如果句子中有多处错字,那么每替换前面一个字,后面的错字索引往后移动3位:即括号+字=3位
                p = res[0]['errors'][i]['position'] + i * 3
                item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), p)
        print(item)
    else:
        print(item)

# 创建一个 FastAPI「实例」,名字为app
app = FastAPI()

# 设置允许跨域请求,解决跨域问题
app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 定义请求体数据类型:text
class Document(BaseModel):
    text: str

# 定义路径操作装饰器:POST方法 + API接口路径

# 文本纠错接口
@app.post("/v1/textCorrect/", status_code=200)
# 定义路径操作函数,当接口被访问将调用该函数
async def TextErrorCorrection(document: Document):
    try:
        # 获取要进行纠错的文本内容
        text = document.text
        # 精细分句处理以更好处理长文本
        data = cut_sent(text)
        
        # 进行文本纠错和标记
        correctionResult = ''
        for idx, item in enumerate(data):
            if item != "":
                res = text_correction(item)
                length = len(res[0]['errors'])
                if length > 0:
                    for i, error in enumerate(res[0]['errors']):
                        if i == 0:
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), res[0]['errors'][i]['position'])
                        else:
                            # 如果句子中有多处错字,那么每替换前面一个字,后面的错字索引往后移动3位:即括号+字=3位
                            p = res[0]['errors'][i]['position'] + i * 3
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), p)
                if item is not '':
                    correctionResult += item;
                    correctionResult += '\n';

        # 接口结果返回
        results = {"message": "success", "originalText": document.text, "correctionResults": correctionResult}
        return results
    # 异常处理
    except Exception as e:
        print("异常信息:", e)
        raise HTTPException(status_code=500, detail=str("请求失败,服务器端发生异常!异常信息提示:" + str(e)))

# 文档纠错接口
@app.post("/v1/docCorrect/", status_code=200)
# 定义路径操作函数,当接口被访问将调用该函数
async def DocumentErrorCorrection(file: UploadFile):
    # 读取上传的文件
    docBytes = file.file.read()
    docName = file.filename
    # 判断上传文件类型
    docType = docName.split(".")[-1]
    if docType != "doc" and docType != "docx":
        raise HTTPException(status_code=406, detail=str("请求失败,上传文档格式不正确!请上传word文档!"))
    try:
        # 将上传文件保存到本地,添加时间标记避免重复
        now_time = int(time.mktime(time.localtime(time.time())))
        docPath = "./test/" + str(now_time) + "_" + docName
        fout = open(docPath, 'wb')
        fout.write(docBytes)
        fout.close()

        # 读取要进行文本纠错的word文档内容
        docText = get_paragraphs_text(docPath)
        # 对word文档内容进行分句处理避免句子过长
        docText = cut_sent(docText)

        # 进行文本纠错和标记
        correctionResult = ""
        for idx, item in enumerate(docText):
            if item is not '':
                res = text_correction(item)
                length = len(res[0]['errors'])
                if length > 0:
                    for i, error in enumerate(res[0]['errors']):
                        if i == 0:
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), res[0]['errors'][i]['position'])
                        else:
                            # 如果句子中有多处错字,那么每替换前面一个字,后面的错字索引往后移动3位:即括号+字=3位
                            p = res[0]['errors'][i]['position'] + i * 3
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), p)
                if item is not '':
                    correctionResult += item;
                    correctionResult += '\n';

        # 接口结果返回
        results = {"message": "success", "docText": str(docText), "correctionResults": correctionResult}
        return results
    # 异常处理
    except Exception as e:
        print("异常信息:", e)
        raise HTTPException(status_code=500, detail=str("请求失败,服务器端发生异常!异常信息提示:" + str(e)))

# 图片纠错接口
@app.post("/v1/imageCorrect/", status_code=200)
# 定义路径操作函数,当接口被访问将调用该函数
async def ImageErrorCorrection(file: UploadFile):
    # 读取上传的文件
    imgBytes = file.file.read()
    imgName = file.filename
    # 判断上传文件类型
    imgType = imgName.split(".")[-1]
    if imgType != "png" and imgType != "jpg" and imgType != "jpeg" :
        raise HTTPException(status_code=406, detail=str("请求失败,上传图片格式不正确!请上传jpg或png图片!"))
    try:
        now_time = int(time.mktime(time.localtime(time.time())))
        # 拼接生成随机文件名,注意名称不能包含中文否则后面读取出错
        imgPath = "./test/" + str(now_time) + "_image." + imgType
        print(imgPath)
        fout = open(imgPath, 'wb')
        fout.write(imgBytes)
        fout.close()
        print("文件上传成功!")

        # OCR文本识别
        ocr_image_results = ocr.recognize_text(images=[cv2.imread(imgPath)])

        # 处理图片识别文本结果
        toCorrectText = []
        for i in range(len(ocr_image_results[0]['data'])):
            toCorrectText.append(str(ocr_image_results[0]['data'][i]['text']))

        # 进行文本纠错和标记
        correctionResult = ""
        for idx, item in enumerate(toCorrectText):
            if item != "":
                res = text_correction(item)
                length = len(res[0]['errors'])
                if length > 0:
                    for i, error in enumerate(res[0]['errors']):
                        if i == 0:
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), res[0]['errors'][i]['position'])
                        else:
                            # 如果句子中有多处错字,那么每替换前面一个字,后面的错字索引往后移动3位:即括号+字=3位
                            p = res[0]['errors'][i]['position'] + i * 3
                            item = replace_char(item, (list(res[0]['errors'][i]['correction'].keys())[0] + '(' + list(res[0]['errors'][i]['correction'].values())[0] + ')'), p)
                if item is not '':
                    correctionResult += item;
                    correctionResult += '\n';

        # 接口结果返回
        results = {"message": "success", "orcResult": str(ocr_image_results[0]), "correctionResults": correctionResult}
        return results
    # 异常处理
    except Exception as e:
        print("异常信息:", e)
        raise HTTPException(status_code=500, detail=str("请求失败,服务器端发生异常!异常信息提示:" + str(e)))

# 启动创建的实例app,设置启动ip和端口号
uvicorn.run(app, host="127.0.0.1", port=8000)

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐