标签画像项目开发记录

本文最后更新于:2024年3月7日 下午

写在前面

现在是7/17/2022,实际上是这个项目已经接近完成了,目前就剩下导师们的评审了。
我的项目主体是由c++的后端部分以及python的前端部分,c++的部分打包成来exe供python进行使用,之间的交互以及数据的暂存均通过文件方式。
c++的后端部分主要是写具体的业务逻辑,由于中途需求改动了一次,导致部分业务逻辑并没有用上,不过在本文中回阐明所有的逻辑
python的前端部分经历了三次主要改动,第一次是初学tkinter时搭建的简易框架,由于需要美化在csdn上找到了前人写的exbutton相关的以及ttk相关的内容,这是第二次对整体页面框架的修改。由于exbutton部分前人断更了,但是离需求需要的美化还有着不小的距离,因此在搜索进一步美化的时候找到并学习了ttkbootstrap,第三次修改主要的是页面上的具体内容。
单人,从mysql开始学习然后到项目结束大概是三周的时间,中间由于休息,考试,培训的时间除外(也除外mysql的学习时间的话),单论从设计到项目实施,实际的打代码时间(包括后续的一次需求变动),大概实际所用时间是是十一二天左右(3天设计,两天半后端,半天到一天后端测试,四五天前端)
c++部分大约是近1.4k行的代码,python的话大概是有2.3k左右行的代码,大概是课程作业量级的项目?
学习了很多的东西,比如项目需求的分析,项目框架以及具体的设计,mysql的初步学习使用,以及python的一大堆相关的库,等等。

大概就是这样,接下来就是项目的具体情况

项目简介

项目需求

基于用户数据进行数据分析,需求分析,功能设计,数据库设计,代码开发,实现用户标签和画像系统。

项目要求

考虑角色分工以及项目工作量,建议以团队协作模式开展,建议3~6人协作完成,充分体验项目分工和项目协作。确实,感觉想要实现多种功能的话还是人多一点好,起码来一个人帮忙写前端就能多一半开发时间取做额外修饰
按照需求分析、设计、编码和联调、运行等过程展开项目。
实现用户标签和画像功能,要求满足以下功能:
1) 标签
a) 支持分多层设计,不少于 2 层;
b) 支持自定义标签阈值,调整阈值后,能重新生成标签;
c) 标签总数,不少于 10 个。

2) 画像支持 2 类:
a) 单客户画像,不少于 10 个字段,不少于 3 个标签;
b) 客户群体画像,不少于 3 个图表(或数据指标)。

技术要求

1) 使用 Java 语言进行程序设计和开发;坏了,我用的是c++和py
2) 使用 MySQL 数据库;
3) 前端实现技术,依据自身的掌握能力选择。如果能够实现前端页面展示,适当加分。

项目介绍大致就是这样,提供有30W条数据进行查询。

程序设计框架图

项目主体架构
业务逻辑层
数据交换层
细碎模块部分

这几个模块设计也是第二版的,由于中途需求改动,改动了一些模块的实现方式,可能会有一些细节没有更新到,导致最终程序可能和本项目规划图可能有一些细微差别。

c++后端部分

c++模块的主要文件结构

c++模块实际上没什么好说的,就是 把设计框架呢堆东西使用程序语言实现即可,小项目,逻辑简单,也没什么卡住的地方。唯一卡的地方可能就是前期设计时思考的不全面的问题导致中期开发时得额外加东西,比如信息流部分实际上是在写代码时才逐渐完善的,这样子搞在团队协作时可能会造成一定的冲突,因此还是主要在前期规划时要规划好。
大概是每完成一个小模块就测试一下,然后最后也没什么大bug,这是个好习惯。

python前端部分

py的部分比较繁杂,最开始确定使用EXbutton实际上是嫖了csdn上这位的框架,觉得蛮不错的就开始学tkinter,(最终实现的效果实际上就能看出这个框架的影子)。
python阶段的开发实际上是比较艰难的时刻,因为在学新的东西,并且py本来就不怎么适合写界面(本来是想学QT的但是被pass了)。因此写的比较混乱并且也没怎么好好规划(字体,ico,其他图片都放在一个文件夹里)。
所用到的库有:

PIL
random
pathlib
os
tkinter
ttkbootstrap
mysql
matplotlib
wordcloud
jieba
imageio

可能还会有些边边角角的没有统计上,具体的可以在我的源码里看。

项目结果

我将c++后端的部分编译成了可执行文件供python调用
直接点击main.py即可打开主界面
主界面
主界面就链接了整个数据库,可以直接查询数据库中的信息
主界面查询
当然,也支持多种方式查询,比如范围查询,时间日期类型数据查询等。
多种方式查询
标签选择界面,一共是三个大标签类,每个标签类下有数个小标签类,每一个小标签类都有多个选项,可多选,使用标签选取数据的原则是:各个 小标签类里选择的并集 的交集部分
比如这些数据就是来源地为(内蒙古或台湾或山东)同时用户等级为(VIP用户或普通用户或粉丝),用户年龄在(青年用户或中年用户)这一阶段的人。
以上标签中的标签具体值是可以修改的,比如说少年标签设定的是0~18岁,我现在想要修改他的值为0~22岁。需要进入标签修改页面
标签值修改页面
具体值输入框
修改成功提示
在右边小框内显示的用户编号双击后可以来道用户画像构建页面并自动建立用户画像
用词云图的方式呈现。
词云图,我其实想尽力构建一个人像的形式,但是做的效果可能还是不太星(
群体画像的话主要是选取了一些标签用图表的方式表现了出来
其中一些图表如下
用户种类
用户来源
点击具体标签会在旁边一栏显示该标签所属人群
(他这数据好平均啊)

结尾

改进点

首先是词云图,应该是可以使用算法来使得构建更加智能
或者是完善构建方式,添加补全未知信息预测的功能
(对于不全的信息目前只是提示无法构建词云图,理想状态下应该是用一些分类模型来能根据原本的数据来预测的。)
还有就是图表的效果,由于tkinter并没有现成的图表样式,因此是自己用矩阵三角等形状元素构建的图表库,目前是只实现了样式,并没有相应的交互,理想状态应该是鼠标晃到上去可以显示相应的信息,一些逻辑处理以及显示信息的位置还做起来比较麻烦,因此目前还没有实现。

还有的是效率问题,目前每次调用数据均需要从数据库中读入,总信息量300w条,假如选取的标签所涉及的数据过多会产生较严重的延时问题。修改代码的时候也是找了一些解决方法但是用处不大。当然,也有可能是我刚学mysql,不是很熟悉其中的优化。
问了一下,实际工程中一般都会将数据直接预读入到内存里,数据量加大时一半加内存就行了,我应该是用不了这种方法了。

学习到的东西

项目开发经验,自学能力
完整的项目周期:做需求分析-构建xml图、类图、思维导图-程序代码实现-测试-交付
瀑布式开发流程-敏捷式开发流程
开发的具体知识:mysql python GUI工具 c++面向对象开发 一些语法糖
大概就是这样