目录
一、成果概述
这段时间利用大模型寻找某个用户一周的博客,并利用大模型进行概括,同时为每个词语附上重要性的权值,最后利用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.接口测试
进行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();
});
})
四、前端展示