山大软院创新项目实训(九)

 

目录

 

一、成果概述

二、后端代码实现

1.python询问

2.获得一周博客

3.Java调用

4.接口测试

三、echarts

1.echarts介绍

2.json文件引入

3.data属性处理

4.echarts具体配置

四、前端展示


 

一、成果概述

这段时间利用大模型寻找某个用户一周的博客,并利用大模型进行概括,同时为每个词语附上重要性的权值,最后利用echarts按照“词云”进行展示。

二、后端代码实现

1.python询问

    elif mode == 7:
        content = "以给定模板:“关键词:\n评分:”,对下列日志内容进行3个词语的概括,将不同词语用“、”隔开;并对每个词语的重要程度打分,按“、”隔开,只能打1-9分。不需要解析。" + query
    response = client.chat.completions.create(
        model="glm-4",  # 填写需要调用的模型名称
        messages=[
            {"role": "user", "content": content},
        ],
    )

    answer = response.choices[0].message.content
    print(answer)
    return answer

将想让大模型做的事情写成固定的模板,放到content中。这里是:以给定模板:“关键词:\n评分:”,对下列日志内容进行3个词语的概括,将不同词语用“、”隔开;并对每个词语的重要程度打分,按“、”隔开,只能打1-9分。不需要解析。

2.获得一周博客

@Override
    public List<Blog> getThisWeekBlogs() {
        LocalDate today = LocalDate.now();
        LocalDate startOfWeek = today.minusDays(today.getDayOfWeek().getValue() - 1); // Monday
        String start = startOfWeek.atStartOfDay().format(formatter);
        String end = today.atTime(23, 59, 59).format(formatter);
        return blogMapper.findByTimeBetween(start, end);
    }

通过设置开始start和结束时间end从数据库中查找最近一周的博客并返回。

3.Java调用

    //词云
    @GetMapping("/mood-data/word")
    public Result getMoodWord() {

        // Step 1: 获取当日所有的日志内容
        List<Blog> weekBlogs=blogServiceImpl.getThisWeekBlogs();

        // Step 2: 组装日志内容,并调用外部模型
        StringBuilder combinedContent = new StringBuilder();

        Map<String, Integer> labelCount = new HashMap<>();

        for (Blog blog : weekBlogs) {
            String content = blog.getContent();
            String url = "http://localhost:5000/connectToAPI?content=" + content+"&mode=7";
            String mark = HttpUtil.get(url);
            Pattern pattern = Pattern.compile("关键词:(.*?)\\s");
            Matcher matcher = pattern.matcher(mark);

            Pattern pattern1 = Pattern.compile("评分:(\\d)、(\\d)、(\\d)");
            Matcher matcher1 = pattern1.matcher(mark);

            while (matcher.find() && matcher1.find()) {   //必须先find才能.group(),且每次find后都会往后移
                String matchedText = matcher.group(1);
                String[] parts = matchedText.split("、");
                int[] scores = {Integer.parseInt(matcher1.group(1)),Integer.parseInt(matcher1.group(2)),Integer.parseInt(matcher1.group(3))};
                int i = 0;
                for (String part : parts) {
                    part = part.trim();
                    int j=0;
                    for(int sc : scores) {
                        if(i==j){
                            labelCount.put(part, sc);
                            break;
                        }
                        j++;
                    }
                    i++;
                }
            }

        }
        // Step 4: 返回分析结果给 Vue.js 前端
        return Result.success(labelCount);
    }

将后端接口API封装成:@GetMapping("/mood-data/word"),由于大模型返回的数据有固定的模板,所以这里使用正则表达式匹配到想要的信息。通过for循环遍历,将关键词和评分分别放到parts[]和scores[]数组中,放到lableCount中并返回。

4.接口测试

75f63ece53ae49a0ba5b8c6b824bef3a.png

进行http接口测试,观察响应码及返回的json数据是否正确。

测试返回:

{
  "code": "200",
  "msg": "",
  "data": {
    "目标确定": 9,
    "处理能力": 7,
    "坚强": 9,
    "磨砺": 9,
    "才华": 7,
    "勤奋": 8,
    "积极心态": 8,
    "泪眼": 8
  }
}

发现正常响应码200,其中data是我们后续需要处理的数据。

三、echarts

1.echarts介绍

echarts是一个基于 JavaScript 的开源可视化图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。它具备:

  • 丰富的图表类型
  • 强劲的渲染引擎
  • 专业的数据分析
  • 优雅的可视化设计

2.json文件引入

首先需引入ecahrts-wordcloud.min.js文件,由于npm报错,这里直接从官网copy文件到@/utils目录下:

3.data属性处理

由于json文件的数据并不能直接满足echarts格式,所以需要先处理成[name:' ';value:' ']的格式:

request.get('/log-results/mood-data/word').then(res => {
        let i = 0
        for(i in res.data){
          words.push({
            name:i,
            value:res.data[i]
          })
        }
        console.log(words)

4.echarts具体配置

const chartDom = document.getElementById('wordCloud');
        const myChart = echarts.init(chartDom);
        const option = {
          title: {
            text: '博客词云',
            left: 'center'
          },
          tooltip: {
            show: true
          },
          series: [{
            type: 'wordCloud',
            gridSize: 2,
            sizeRange: [12, 50],
            rotationRange: [-90, 90],
            shape: 'circle',
            width: 600,
            height: 400,
            drawOutOfBound: false,
            textStyle: {
              normal: {
                color: function () {
                  return 'rgb(' + [
                    Math.round(Math.random() * 160),
                    Math.round(Math.random() * 160),
                    Math.round(Math.random() * 160)
                  ].join(',') + ')';
                }
              },
              emphasis: {
                shadowBlur: 10,
                shadowColor: '#333'
              }
            },
            data: words
          }]
        };
        myChart.setOption(option);
        //随着屏幕大小调节图表
        window.addEventListener("resize", () => {
          myChart.resize();
        });
      })

四、前端展示

13f48f6a51464de2898b5d1cd408d154.png

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值