vue 精选评论词云 集成echarts-wordcloud TF-IDF算法

news2024/11/14 3:17:19

这一期在我们的系统里集成词云组件,开发的功能是景区精选评论的词云展示功能。

这个界面的逻辑是这样的:

在数据框里输入城市,可以是模糊搜索的,选择城市;

选择城市后,发往后台去查询该城市的精选评论,由于一个城市会有很多景点,所以精选评论也有很多,采用TF-IDF算法,计算关键词,返回给前端,使用echarts词云组件进行可视化;

再次输入城市,可以切换城市,同时词云会重新渲染。

1 词云页面开发

首先前端安装词云,(注意这边的echarts必须是v5+,如果是4就要使用echarts-wordcloud 1.0版本)

npm install echarts-wordcloud@2

然后在main.js中引入

Vue.component('v-chart', ECharts);
import "echarts-wordcloud"

创建一个WordCloud.vue组件,组件的高度和数据从外部传入

<template>
  <v-chart
    style="width:100%; "
    :option="chartOption"
    :style="{ height: height }"
    autoresize
  />
</template>

<script>

export default {
  name: 'WordCloud',
  props: {
    words: {
      type: Array,
      required: true
    },
    height: {
      type: String,
      required: true
    },
  },
  watch: {
    words: {
      immediate: true,
      handler() {
        this.initChart();
      }
    }
  },
  data() {
    return {
      chartOption: {},
      maskImage: new Image(),
      data: [],
    };
  },

  async mounted() {
    // this.initChart()
  },
  methods: {
    initChart() {
      // this.maskImage.src = require('@/assets/rensen.png')
      console.log('init wordcloud...')
      console.log(this.words)
      setTimeout(() => {
            this.chartOption = this.buildChartOption();
            // console.log(this.chartOption)
          }, 1000)

    },

    buildChartOption() {
      // console.log(this.maskImage)
      const option = {
        // background: '#FFFFFF',
        tooltip: {
          formatter: '{b}<br/> 出现频次:{c}  '
        },
        series: [ {
          // maskImage: this.maskImage,
          type: 'wordCloud',
          gridSize: 2,
          sizeRange: [20, 80],
          // shape: 'heart',
          layoutAnimation: true,
          textStyle:{
            textBorderColor: 'rgba(255,255,255,0.3)',
            textBorderWidth: 1,
            color: ()=>{
              return 'rgb(' + [
                Math.round(Math.random() * 160),
                Math.round(Math.random() * 160),
                Math.round(Math.random() * 160)
              ].join(',') + ')';
            },
            emphasis: {
              fontSize: 20,
              shadowBlur: 10,
              shadowColor: 'rgba(255,255,255,.1)'
            }
          },
          data: this.words
        } ]
      };

      return option;
    },
  }
};
</script>

创建Word.vue 词云组件页面,这个组件集成了el-autocomplete组件,可以远程搜索城市,这个在上一篇博文里有说过怎么开发了,这边主要是集成WordCloud.vue组件,通过get_wordcloud 方法来从后端加载精选评论词频分析数据。

<template>
  <div>
    <el-row :gutter="20">
      <!-- 输入框放在图表上方 -->
      <el-autocomplete
          v-model="city"
          :fetch-suggestions="querySearch"
          placeholder="请输入城市名称"
          @select="handleSelect"
          style="width: 300px; margin-left: 10px;"
          clearable
      >
      </el-autocomplete>
      <!-- Top chart -->
      <el-col :span="24">
        <div class="chart" :style="{ height: parentHeight }">
          <word-cloud :height="childHeight" :words="words"/>
        </div>
      </el-col>
    </el-row>
  </div>
</template>

<script>
import {getCities, get_wordcloud} from "@/api/tour";
import WordCloud from "@/components/WordCloud.vue";

export default {
  name: 'Dashboard',
  data(){
    return{
      city: '',
      words: [],
    }
  },
  components: {
    WordCloud
  },
  mounted() {
    get_wordcloud(this.city).then(res=>{
      this.words = res.data.data
    })
  },
  computed: {
    parentHeight() {
      return `calc(100vh - 140px)`; // 父组件高度
    },
    childHeight() {
      return `calc(100vh - 140px)`; // 子组件高度
    }
  },
  methods: {
    // el-autocomplete组件的cb 为回调函数需要把后端返回的值传给它
    querySearch(queryString, cb) {
      // 发送请求到Flask后端获取模糊搜索结果
      getCities(queryString).then(res=>{
        // console.log(res.data.data.map(i=>{return i.value}))
        cb(res.data.data)
      })
    },
    // el-autocomplete组件选择
    handleSelect(item) {
      this.city = item.value; // 选择后将城市名存储在city变量中
      console.log('选择了:', this.city);
      this.$message('加载'+this.city+'数据成功', 'success', 3000)
      get_wordcloud(this.city).then(res=>{
        this.words = res.data.data
      })
    },
  },
};
</script>

<style scoped>
.chart {
  /*display: flex;*/
  align-items: center;
  justify-content: center;
  margin-top: 10px;
  color: white;
  font-size: 20px;
  border-radius: 10px;
  background-color: #f4eeee;
}
</style>

添加一个方法:

// 词云
export function  get_wordcloud(keyword){
    return request({
        url: `/tour/wordcloud`,
        method: 'get',
        params:{ keyword: keyword }
    });
}

2 后端接口开发

后端接口根据前端传递过来关键词去查询该城市下的所有精选评论数据,然后使用jieba分词进行中文分析,过滤2个字以下的内容,然后创建TF-IDF向量化器计算每个词的TF-IDF词,排序之后,获取前100的重要词返回给前端。

# 词云接口
@main.route('/tour/wordcloud', methods=['GET'])
def get_wordcloud():
    keyword = request.args.get('keyword', '')
    if keyword=='':
        keyword = '东京'
    try:
        # 查询符合条件的 Tour
        comments = db.session.query(Tour.select_comment).filter(Tour.city == keyword).all()
        # 提取评论文本
        comments_text = [comment[0] for comment in comments if comment[0] is not None]

        # 使用 jieba 分词
        def jieba_tokenizer(text):
            return [word for word in jieba.cut(text) if len(word) >= 2]

        # 创建 TF-IDF 向量化器
        vectorizer = TfidfVectorizer(tokenizer=jieba_tokenizer, stop_words=None)  # 可以根据需要添加停用词
        tfidf_matrix = vectorizer.fit_transform(comments_text)

        # 获取词汇表
        feature_names = vectorizer.get_feature_names_out()

        # 计算每个词的 TF-IDF 值
        tfidf_sum = tfidf_matrix.sum(axis=0).A1  # 将稀疏矩阵转换为数组
        tfidf_dict = dict(zip(feature_names, tfidf_sum))

        # 按 TF-IDF 值排序,提取前 100 个重要词
        sorted_tfidf = sorted(tfidf_dict.items(), key=lambda x: x[1], reverse=True)[:100]
        # TF-IDF 值 取整了
        top_100_words = [{"name": word, "value": int(score)} for word, score in sorted_tfidf]
        # print(top_100_words)
        return make_response(code=0, data=top_100_words)
    except Exception as e:
        return make_response(code=1, message=str(e))

3 效果

3.1 东京景区评论词云

在这里插入图片描述

3.2 可以搜索选择其他城市

在这里插入图片描述

3.3 切换城市,例如名古屋

在这里插入图片描述

4 补充TF-IDF介绍

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的权重计算方法。 它旨在评估一个词在一篇文档中的重要性,具体而言:

1. **词频(Term Frequency, TF)**:表示一个词在文档中出现的频率。频率越高,表示该词对文档的贡献越大。

2. **逆文档频率(Inverse Document Frequency, IDF)**:表示一个词在所有文档中的稀有程度。IDF 值通过总文档数除以包含该词的文档数,然后取对数来计算。# - 公式为 IDF(w) = log(总文档数 / (包含词 w 的文档数 + 1))# - 一个常见的词(如“的”、“是”)在许多文档中出现,IDF 值较低,表示它的区分能力弱。#

3. **TF-IDF 值**:通过将词频和逆文档频率相乘得到。TF-IDF 值高的词在特定文档中重要性较高,且在其他文档中较少出现。## 在文本分析中,TF-IDF 常用于特征提取,以帮助识别关键词和主题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python,json数据格式,pyecharts模块,pycharm中安装pyecharts

json数据格式 JSON是一种轻量级的数据交互格式 可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a; json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互. 类似于&#xff1a; 国…

P39-数据存储2

编程题 编程题 编程题

2024 年顶级 Flutter UI 框架和库

根据 2022 年 StackOverflow 调查显示&#xff0c;Flutter 是最受欢迎的跨平台工具之一。自发布以来的 16 个月内&#xff0c;已有超过 200 万开发者采用了 Flutter。在本博客中&#xff0c;我们将浏览 GitHub 上可用的顶级 Flutter 存储库。除了每个存储库之外&#xff0c;还提…

MySQL 系统学习系列 - 事务、视图与存储过程的使用《MySQL系列篇-06》

数据库事务、视图、存储过程 事务 1. 事务简介 事务&#xff08;transaction&#xff09;是指访问并更新数据库中各种数据的一个程序执行单元&#xff08;unit&#xff09; [最小执行单元] MySQL事务主要用于处理操作量大。复杂度高的数据 1.MySQL数据库只有InnoDB引擎支持事…

App应用冷启动耗时排查

1 查看冷启动耗时 adb shell am start -S -W com.gerry.lifecycle/com.gerry.lifecycle.MainActivity发现冷启动耗时居然要6s多&#xff0c;下面开始排查 2 生成trace文件 // Application中开始trace记录 override fun attachBaseContext(base: Context?) {super.attachBas…

虚幻5|简单的设置角色受到伤害,远程攻击机关设置,制作UI,低血量UI

虚幻5|制作玩家血量&#xff0c;体力&#xff08;还未编辑&#xff0c;只用于引用&#xff09;-CSDN博客 需完成制作玩家血量及体力部分 一.给角色添加死亡动画 1.为了保证角色在播放死亡蒙太奇的时候&#xff0c;不会重新播放&#xff0c;而是保持原来倒地的姿势&#xff0…

Renesa Version Board开发RT-Thread 之WIFI创建Client

概述 本文主要介绍使用Renesa Version Board中WIFI功能&#xff0c;该模块基于RW007模块设计&#xff0c;RT-Thread软件架构已经实现该硬件相关的驱动接口。笔者基于该模块的相关接口在LWIP软件框架的基础上实现Client功能。实现数据的发送和接收。 1 WLAN 框架简介 参考文档…

【Java】—— Java面向对象基础:使用Java创建和打印员工对象信息

在Java中&#xff0c;类的定义和使用是面向对象编程的核心。本文将通过一个简单的例子来展示如何定义一个员工类&#xff08;Employee&#xff09;&#xff0c;并在测试类中创建员工对象&#xff0c;为这些对象的属性赋值&#xff0c;并打印出它们的信息。 定义员工类&#xff…

大模型微调

文章目录 前言一、使用的库二、数据预处理1.引入库2.读入数据3.对数据进行预处理4.转换为json格式文件 三&#xff0c;使用算子分析数据并进行数据处理四&#xff0c;划分训练集和测试集五&#xff0c;编写训练脚本开始训练六&#xff0c;进行模型推理人工评估总结 前言 这是使…

网络优化|单源最短路|Dijkstra|Floyd|Matlab

图和网络可以用来描述集合元素和元素之间关系。大量的最优化问题都可以抽象为网络模型加以解释&#xff0c;描述和求解。 图与网络模型在建模时具有直观、易理解、适应性强等&#xff0c;广泛应用在管理科学、物理学、化学、计算机科学、信息论、控制论、社会科学以及军事科学等…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

嵌入式开发技术进步带来新机遇

嵌入式开发作为信息技术领域的重要分支&#xff0c;随着科技的不断进步&#xff0c;正迎来新的机遇。本文将从人工智能、物联网、边缘计算等方面探讨嵌入式开发技术的进步如何带来新的发展机遇&#xff0c;并展望未来的发展趋势。 一、引言 嵌入式系统是一种特殊的计算机系统&…

unreal engine5中character角色和怪物交互时发生穿模

UE5系列文章目录 文章目录 UE5系列文章目录前言一、原因定位二、解决方法 前言 在 Unreal Engine 5 中&#xff0c;角色“穿模”通常指的是角色模型与其他物体&#xff08;如墙壁、地面或其他对象&#xff09;发生不正确的穿透或重叠现象。这可能是由多种原因造成的&#xff0…

C++ | Leetcode C++题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {const int MOD 1337;int pow(int x, int n) {int res 1;while (n) {if (n % 2) {res (long) res * x % MOD;}x (long) x * x % MOD;n / 2;}return res;}public:int superPow(int a, vector<int> &b) {int an…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

NetSuite 2024.2 学习笔记

NetSuite一年两次的发版&#xff0c;每次都会带来一些新的东西。这对于顾问来说&#xff0c;应该成为必修课。 每个版本发版内容的学习时长&#xff0c;大约在20小时左右。包括&#xff1a; •Release Notes通读 •Release Preview环境申请 •热点功能验证 •New Release学习笔…

vue中video视频路径改变,dom不更新问题

效果展示 视频切换前 视频切换后 完整代码 <template><!-- 设置v-if只在路径有值时&#xff0c;标签才存在 --><video v-if"state.videoSrc ! null" controls><source :src"state.videoSrc" type"video/mp4"></…

Java | Leetcode Java题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {static final int MOD 1337;public int superPow(int a, int[] b) {int ans 1;for (int e : b) {ans (int) ((long) pow(ans, 10) * pow(a, e) % MOD);}return ans;}public int pow(int x, int n) {int res 1;while (n…

Pytorch实现CIFAR10训练模型

文章目录 简述模型结构模型参数、优化器、损失函数参数初始化优化器损失函数 模型训练、测试集预测、模型保存、日志记录训练测试集测试模型保存模型训练完整代码 tensorboard训练可视化结果train_loss测试准确率测试集loss 模型应用模型独立应用代码api.py预测结果 简述 使用…

leetcode1232一点小问题

解法 a x 2 − x 1 y 2 − y 1 &#xff0c; b y 1 − a x 1 a\frac{x_{2}-x_{1}}{y_{2}-y_{1}} &#xff0c;by_{1}-ax_{1} ay2​−y1​x2​−x1​​&#xff0c;by1​−ax1​ d y n − y n − 1 x n − x n − 1 d\frac{y_{n}-y_{n-1}}{x_{n}-x_{n-1}} dxn​−xn−1​yn​…