首页 > 其他分享 >离线数据统计及词云图显示

离线数据统计及词云图显示

时间:2023-08-18 11:37:50浏览次数:28  
标签:weibo string seq 离线 云图 seg 及词 import day

小时级实时数据仓库构建方法_A项目

项目描述

天亮舆情是一个简单易用的互联网舆论分析平台。通过对互联网常见的舆论信息传播媒介进行采集分析,提供了实时舆情、情感分析、地域统计及事件脉络等数据与分析能力,助力客户把握时事脉搏。用户只需设置关键词即可实现对全互联网的信息进行检测分析。通过该产品可以满足用户对网络舆情对网络舆情监测和热点事件专题追踪等需求!

项目背景

为了帮助客户全面掌握舆情动态,正确进行舆论引导,为确保我国互联网络大众媒体的舆论导向的正确性起到了一定的辅助作用,实现为政府分忧,对网络舆情进行监控和管理。用舆情系统,宣传部门可以有效的规范互联网信息,引导健康有益的舆论导向。系统对于促进加强互联网信息监管,组织力量展开信息整理和深入分析,应对网络突发的公共事件,全面掌握社情民意起决定性作用。

项目功能

  • 将热点词汇以词云图的形式显示

功能亮点

  • 通过nlp(nature language process)分词处理,将一条一条的博文拆解成一个一个的词序列(Term Sequene)。对词序列中的全部元素做词频统计,对词统统计结果做倒排输出,得到舆情热词。
  • 使用echarts,对echarts进行二次开发,以此来展示出词云图

社会价值-企业价值

  • 迅速捕捉社交网络内热词,可以作为新闻素材、视频推荐、商品推荐等依据。

梳理数据流

zip文件 (原始数据)
-> csv文件(原始数据解压后)(local本地)
-> weibo_origin 
-> weibo_product 
-> weibo_seg_result
 -> weibo_seg_wc -> download_weibo_hot_words(hdfs文件)
 -> download_weibo_hot_words(本地文件) 
 -> upload_to_mysql_table -> web可视化
 
停用词表提前建立和初始化 weibo_stopwords表

代码实现

zip原始数据批量解压

ls weibo/*.zip | xargs -n1 unzip -d weibo_text/

在hive中创建weibo_origin和weibo_product两张同构表

CREATE external TABLE weibo_origin(
mid string,
retweeted_status_mid string,
uid string,
retweeted_uid string,
source string,
image string,
text string,
geo string,
created_at string,
deleted_last_seen string,
permission_denied string
)
comment 'weibo content table'
partitioned by (day_seq string comment 'the day sequence')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS textfile;
CREATE TABLE weibo_product(
mid string,
retweeted_status_mid string,
uid string,
retweeted_uid string,
source string,
image string,
text string,
geo string,
created_at string,
deleted_last_seen string,
permission_denied string
)
comment 'weibo content table'
partitioned by (day_seq string comment 'the day sequence')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS orcfile;

数据按天分区载入weibo_origin表,创建脚本load_to_weibo_origin.sh

#! /bin/bash

#1、定义csv文件所在的目录
csv_root_dir_local=/home/zel/corpus_dw_hive/day_csv_data/

#2、定义csv上传到hdfs空间的目录
csv_root_dir_hdfs=/user/zel/csv_root_dir/

#3、获取csv的文件名称,作为分区表的分区字段值
csv_filename_list=`ls $csv_root_dir_local | cut -d . -f1`

#4、进行遍历csv_filename_list集合,逐个处理csv文件的上传
for filename in $csv_filename_list 
do
    echo $filename
    #嵌入hdfs相关操作
    #1、将本地csv上传到hdfs指定路径当中
    hdfs dfs -copyFromLocal -f $csv_root_dir_local""$filename".csv" $csv_root_dir_hdfs  
    #2、将hdfs的csv文件加载到指定的hive表分区当中
    hive -e "
          use zel;
          load data inpath '$csv_root_dir_hdfs$filename.csv' overwrite into table weibo_origin partition(day_seq='$filename');
    "   
      #break
done
#脚本执行完成
//保证shell在断开客户端情况下,依然可以继续执行
nohup ./load_to_weibo_origin.sh &

数据检验与校正

  • 校验导入数据的正确与否
  • 样例数据查是否正常(limit m,查看数据样例数据有无明显异常)
  • 数据量级是否相同(主要是指数据当量,十成级、百万级)
  • 数据完整性是否一致(主要是指别丢数据)
  • 数据格式与字段是否对齐
  • 校正方法
  • 将数据的导入方式与数据表的解析方式保持完全一致
  • 修改weibo_origin表创建脚本
CREATE external TABLE weibo_origin(
mid string,
retweeted_status_mid string,
uid string,
retweeted_uid string,
source string,
image string,
text string,
geo string,
created_at string,
deleted_last_seen string,
permission_denied string
)
comment 'weibo content table'
partitioned by (day_seq string comment 'the day sequence')
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS textfile;

将数据表weibo_origin经过清洗规则处理,按天分区载入weibo_product表

  • 清洗逻辑
  • 将每个表中的第1行字段名称行去掉,属于多余的
//一次查询多次插入
from weibo_origin
insert overwrite table weibo_product partition(day_seq) select * where mid!='mid';

分词UDF编写

  • ansj分词器
<project xmlns="http://maven.apache.org/POM/4.0.0"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 <modelVersion>4.0.0</modelVersion>
   <!—- 我是谁-->
   <groupId>com.tianliangedu.course</groupId>
   <artifactId>TlHadoopCore</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像方式,效果雷同 -->
   <repositories>
      <repository>
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
         <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </repository>
   </repositories>
   <dependencies>
      <!-- 引入hadoop-cli-2.7.4依赖 -->
      <dependency>
         <groupId>org.apache.hadoop</groupId>
 <artifactId>hadoop-client</artifactId>
        <version>2.7.4</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.hive</groupId>
         <artifactId>hive-cli</artifactId>
        <version>1.2.1</version>
        <scope>provided</scope>
      </dependency>
      <!-- ansj依赖jar配置  ==start -->
      <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.1</version>
        </dependency>
        <!-- ansj依赖jar配置  ==end -->
   </dependencies>
  <!-—项目构建配置 -->
   <build>
      <finalName>TlHadoopCore</finalName>
      <plugins>
        <plugin>
           <artifactId>maven-assembly-plugin</artifactId>
           <configuration>
              <descriptorRefs>
                 <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
           </configuration>
           <executions>
              <execution>
                 <id>make-assembly</id>
                 <phase>package</phase>
                 <goals>
                    <goal>assembly</goal>
                 </goals>
              </execution>
           </executions>
        </plugin>
        <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>2.3.2</version>
           <configuration>
              <source>1.7</source>
              <target>1.7</target>
              <encoding>UTF-8</encoding>
           </configuration>
        </plugin>
      </plugins>
   </build>
</project>
  • 分词测试用例
import java.util.List;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;
public class TianLiangAnsjTest {
    public static void main(String[] args) {
        // 指定要进行分词的句子
        String str = "马蓉王宝强事件";
        // 采用nlp分词,具备(用户自定义词典/数字识别/人名识别/机构名识别/新词发现)功能
        Result result = NlpAnalysis.parse(str);
        // 将分词结果集合返回给变量itemList
        List<Term> termList = result.getTerms();
        //存储每次分词完成后的词序列集合,词之间以'\001'分隔
        StringBuilder stringBuilder = new StringBuilder();
        //循环记数器,当counter>0的时候,每次添加元素前先添加分隔符
        int counter = 0;
        //遍历集合,加入结果集中
        for (Term term : termList) {
            if (counter > 0) {
                stringBuilder.append('\001');
            }
            //只要分词的名字结果,不要词性部分
            stringBuilder.append(term.getName());
            counter++;
        }
        //将最后的汇总结果输出
        System.out.println(stringBuilder.toString());
    }
}

ansj分词udf编码与测试

package com.tianliangedu.hive.udf;
import java.util.List;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
 * 功能:给定任意一个字符串,输出其分词结果
 * 输入:"马蓉王宝强事件"
 * 输出:"马蓉\001王宝强\001事件"
 */
public class CwsUDF extends UDF {
   public String evaluate(String input) {
        //如果输入为空,则直接返回空即可
       if(input==null || input.trim().length()==0){
          return null;
       }
       // 采用nlp分词,具备(用户自定义词典/数字识别/人名识别/机构名识别/新词发现)功能
       Result result = NlpAnalysis.parse(input);
       //如果处理结果为null,则直接返回一个null即可
       if (result == null || result.getTerms() == null) {
          return null;
       }
       // 将分词结果集合返回给变量itemList
       List<Term> termList = result.getTerms();
       // 存储每次分词完成后的词序列集合,词之间以'\001'分隔
       StringBuilder stringBuilder = new StringBuilder();
       // 循环记数器,当counter>0的时候,每次添加元素前先添加分隔符
       int counter = 0;
       // 遍历集合,加入结果集中
       for (Term term : termList) {
          if (counter > 0) {
             stringBuilder.append('\001');
          }
          // 只要分词的名字结果,不要词性部分
          stringBuilder.append(term.getName());
          counter++;
       }
       return stringBuilder.toString();
   }
   public static void main(String[] args) {
       System.out.println(new CwsUDF().evaluate("河北省石家庄市高新区万达广场"));
   }
}

生成分词结果表

CREATE TABLE weibo_seg_result(
mid string,
retweeted_status_mid string,
uid string,
retweeted_uid string,
source string,
text string,
text_seg string,
geo string,
created_at string
)
comment 'weibo seg result table'
partitioned by (day_seq string comment 'the day sequence')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS orcfile;

调用分词udf生成分词结果表

#! /bin/sh
#设置所使用数据库
db_name=tianliangedu
#设置jar包位置
jar_path="hdfs:///user/zel/jars/TlHadoopCore-jar-with-dependencies.jar"
#设置udf classpath
class_path="com.tianliangedu.hive.udf.CwsUDF"
#数据的来源表
from_table=weibo_product
#要生成的数据表
to_table=weibo_seg_result
#发起执行hql脚本
hive -e "
        use $db_name;
        add jar $jar_path;
        create temporary function seg as '$class_path';
        from $from_table 
        insert overwrite table $to_table partition(day_seq)
select mid,retweeted_status_mid,uid,retweeted_uid,source,text,seg(text) as text_seg,geo,created_at,day_seq;
  • 后台执行脚本
nohup ./produce_weibo_seg_result.sh &

生成wordcount倒排表-按词频降序排列

  • 无任何过滤直接生成倒排表-V0
CREATE TABLE weibo_seg_wc(
word string,
freq int
)
comment 'weibo seg wc'
partitioned by (day_seq string comment 'the day sequence')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS orcfile;

生成wordcount倒排表-先生成一个分区做测试

insert overwrite table weibo_seg_wc partition(day_seq)
select word,count(1) as freq,day_seq from weibo_seg_result lateral view explode(split(text_seg,'\001')) word_table as word where day_seq='20120102' and text_seg is not null group by day_seq,word order by freq desc;

优化生成倒排表-加入按word长度做过滤-V1

insert overwrite table weibo_seg_wc partition(day_seq)
select word,count(1) as freq,day_seq from weibo_seg_result lateral view explode(split(text_seg,'\001')) word_table as word where day_seq='20120102' and text_seg is not null and length(word)>1 group by day_seq,word order by freq desc;

优化生成倒排表-加入按词性过滤-V2

package com.tianliangedu.hive.udf;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
* 功能:给定任意一个字符串,输出其分词结果
* 输入:"马蓉王宝强事件"
* 输出:"马蓉\001王宝强\001\事件"
*/
public class CwsV2UDF extends UDF {
    // 用于标记用于去重的natureSet是否已经初始化的标志位
    public boolean natureSetHaveInitFlag = false;
    // 用于词性过滤的set集合初始化
    public Set<String> natureSet = new HashSet<String>();
    public String evaluate(String input, String natureStr) {
        // 如果输入为空,则直接返回空即可
        if (input == null || input.trim().length() == 0) {
            return null;
        }
      //白名单的Set集合初始化,只需要初始化一次即可反复使用
        if (!natureSetHaveInitFlag && natureStr != null) {
            String[] natureArray = natureStr.split(",");
            for (String nature : natureArray) {
                natureSet.add(nature);
            }
            natureSetHaveInitFlag = true;
        }
        // 采用nlp分词,具备(用户自定义词典/数字识别/人名识别/机构名识别/新词发现)功能
        Result result = NlpAnalysis.parse(input);
        // 如果处理结果为null,则直接返回一个null即可
        if (result == null || result.getTerms() == null) {
            return null;
        }
        // 将分词结果集合返回给变量itemList
        List<Term> termList = result.getTerms();
        // 存储每次分词完成后的词序列集合,词之间以'\001'分隔
        StringBuilder stringBuilder = new StringBuilder();
        // 循环记数器,当counter>0的时候,每次添加元素前先添加分隔符
        int counter = 0;
        // 遍历集合,加入结果集中
        for (Term term : termList) {
           // 判断分词的Term的词性是否包含在词性的白名单中,如果在则加入,否则忽略掉
         if (natureSet.contains(term.getNatureStr())) {
           if (counter > 0) {
              stringBuilder.append('\001');
           }
           stringBuilder.append(term.getName());
           counter++;
         }
        }
        return stringBuilder.toString();
    }
    public static void main(String[] args) {
        String natureList = "n,nr,nr1,nr2,nrj,nrf,ns,nsf,nt,nz,nl,ng,nw,v,vd,vn,vf,vx,vi,vl,vg,a,ad,an,ag,al";
        System.out.println(new CwsV2UDF()
                .evaluate("河北省石家庄市高新区万达广场,好美啊", natureList));
    }
}

更新脚本

#! /bin/sh
#设置所使用数据库
db_name=tianliangedu
#设置jar包位置
jar_path=hdfs:///user/zel/jars/TlHadoopCore-jar-with-dependencies.jar
#设置udf classpath
class_path="com.tianliangedu.hive.udf.CwsV2UDF"
#数据的来源表
from_table=weibo_product
#要生成的数据表
to_table=weibo_seg_result
#初始化nature白名单
 nature_list='n,nr,nr1,nr2,nrj,nrf,ns,nsf,nt,nz,nl,ng,nw,v,vd,vn,vf,vx,vi,vl,vg,a,ad,an,ag,al'
#发起执行hql脚本
hive -e "
        use $db_name;
        add jar $jar_path;
        create temporary function seg as '$class_path';
        from (select * from $from_table where day_seq='20120102') temp
        insert overwrite table $to_table partition(day_seq)
select mid,retweeted_status_mid,uid,retweeted_uid,source,text,seg(text,'$nature_list') as text_seg,geo,created_at,day_seq;
insert overwrite table weibo_seg_wc partition(day_seq)
select word,count(1) as freq,day_seq from weibo_seg_result lateral view explode(split(text_seg,'\001')) word_table as word where day_seq='20120102' and text_seg is not null and length(word)>1 group by day_seq,word order by freq desc;

优化生成倒排表-优化加入按词性过滤-V3

  • 更新词性白名单列表
#! /bin/sh
#设置所使用数据库
db_name=tianliangedu
#设置jar包位置
jar_path=hdfs:///user/zel/jars/TlHadoopCore-jar-with-dependencies.jar
#设置udf classpath
class_path="com.tianliangedu.hive.udf.CwsV2UDF"
#数据的来源表
from_table=weibo_product
#要生成的数据表
to_table=weibo_seg_result
#初始化nature白名单
 nature_list='n,nr,nr1,nr2,nrj,nrf,ns,nsf,nt,nz,nl,ng,nw'
#发起执行hql脚本
hive -e "
        use $db_name;
        add jar $jar_path;
        create temporary function seg as '$class_path';
        from (select * from $from_table where day_seq='20120102') temp
        insert overwrite table $to_table partition(day_seq)
select mid,retweeted_status_mid,uid,retweeted_uid,source,text,seg(text,'$nature_list') as text_seg,geo,created_at,day_seq;
insert overwrite table weibo_seg_wc partition(day_seq)
select word,count(1) as freq,day_seq from weibo_seg_result lateral view explode(split(text_seg,'\001')) word_table as word where day_seq='20120102' and text_seg is not null and length(word)>1 group by day_seq,word order by freq desc;

优化生成倒排表-加入热词黑名单-V4

  • 创建停用词表
CREATE external TABLE weibo_stopwords(
word string
)
comment 'weibo stopwords'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS textfile;
  • 将停用词集合加入到停用词表
LOAD DATA LOCAL INPATH '/home/hive/corpus/stopwords/*' OVERWRITE INTO TABLE weibo_stopwords;
  • 在生成词频倒排表时,过滤停用词表
insert overwrite table weibo_seg_wc partition(day_seq)
select main.word,freq,day_seq from
(select word,count(1) as freq,day_seq from weibo_seg_result lateral view explode(split(text_seg,'\001')) word_table as word where day_seq='20120102' and text_seg is not null and length(word)>1 group by day_seq,word order by freq desc) main
left join (select word from weibo_stopwords) filter
on main.word=filter.word
where filter.word is null

将hive表推送到mysql表中

将hive表数据生成到文件中
insert overwrite directory "/user/zel/corpus/hot_words"
row format delimited fields terminated by '\t'
select * from weibo_seg_wc where day_seq='20120102' order by freq desc limit 100;
拥有一个mysql库,以及相应的读写权限(经典的多用户共享使用关系型数据库操作方法)

通过root帐户创建相应用户,并赋于相应的权限(一般是针对每个用户分配一个数据库,与之相对应,使用户之间互相不影响)

  1. mysql -uroot -p登陆进去。
  2. 创建新用户:CREATE USER 'name' IDENTIFIED BY 'password';
  3. create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  4. 为数据库操作赋权-可以从本地访问mysql: GRANT ALL ON database.*TO'username'@'localhost' IDENTIFIED BY 'password';
  5. 为数据库操作赋权-可以从任意远程访问mysql: GRANT ALL ON database.* TO'username'@'%' IDENTIFIED BY 'password';
  6. flush privileges ( 重启mysqld服务也可以 );
在mysql中创建词频表weibo_hot_words
CREATE TABLE `weibo_hot_words` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `word` varchar(255) DEFAULT NULL,
  `freq` int DEFAULT NULL,
  `day_seq` int DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
执行mysql命令将weibo_hot_result.txt导入到weibo_hot_result表中(synchronized_data_to_mysql.sh)
#! /bin/sh
mysql –h host -uroot -p******** -e "
   use yuqing_oncourse;
   LOAD DATA LOCAL INFILE './hot_words/000000_0' INTO TABLE weibo_hot_words FIELDS TERMINATED BY '\t' (word,freq,day_seq);

web展示

  • entity层
package com.tledu.springboot.springboot01.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WeiboHotWord {
    private int id;
    private String word;
    private int freq;
    private int daySeq;
}
  • mapper层
package com.tledu.springboot.springboot01.mapper;

import com.tledu.springboot.springboot01.model.WeiboHotWord;
import com.tledu.springboot.springboot01.model.sourceo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface WeiboHotWordMapper {
    List<WeiboHotWord> sel();
    List<WeiboHotWord> sel1(String yearNum);
    List<WeiboHotWord> sele();

    List<String> selo();
    List<sourceo> sel5();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace 是用于调用的时候的映射
-->
<mapper namespace="com.tledu.springboot.springboot01.mapper.WeiboHotWordMapper">
    <!--
    id : 表示调用的SQL的名字,相当于方法名
    parameterType : 表示传入参数的类型,写类全名,但是由于设置的别名,所以可以写User
    resultType : 结果集类型
    -->
    <select id="sel" resultType="com.tledu.springboot.springboot01.model.WeiboHotWord" >
        select * from cc_weibo_hot_words order by freq desc limit 100;
    </select>

    <select id="sel1" parameterType="string" resultType="com.tledu.springboot.springboot01.model.WeiboHotWord" >
        select * from cc_weibo_hot_words where day_seq=#{yearNum};
    </select>

    <select id="sele" resultType="com.tledu.springboot.springboot01.model.WeiboHotWord">
        select day_seq from cc_weibo_hot_words group by day_seq;
    </select>

    <select id="selo" resultType="String">
        select sum(sum) from cc_weibo_source;
    </select>

    <select id="sel5" resultType="com.tledu.springboot.springboot01.model.sourceo">
        select * from cc_weibo_source limit 5;
    </select>

</mapper>
  • dao层
package com.tledu.springboot.springboot01.dao;

import com.tledu.springboot.springboot01.model.WeiboHotWord;
import com.tledu.springboot.springboot01.model.sourceo;
import org.springframework.stereotype.Repository;

import javax.xml.transform.Source;
import java.util.List;

@Repository
public interface WeiboHotWordDao {
    public List<WeiboHotWord> sel();
    public List<WeiboHotWord> sel1(String yearNum);
    public List<WeiboHotWord> sele();

    public List<sourceo> sel5();
}
package com.tledu.springboot.springboot01.dao.impl;

import com.tledu.springboot.springboot01.dao.WeiboHotWordDao;
import com.tledu.springboot.springboot01.mapper.WeiboHotWordMapper;
import com.tledu.springboot.springboot01.model.*;
import lombok.AllArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@AllArgsConstructor
public class WeiboHotWordDaoImpl implements WeiboHotWordDao {

    private WeiboHotWordMapper weiboHotWordMapper;

    @Override
    public List<WeiboHotWord> sel() {
//        String sql="select * from cc_weibo_hot_words";
        List<WeiboHotWord> wordList= weiboHotWordMapper.sel();
        return wordList;
    }

    @Override
    public List<WeiboHotWord> sel1(String yearNum) {
//        String sql="select * from cc_weibo_hot_words";
        List<WeiboHotWord> wordList= weiboHotWordMapper.sel1(yearNum);
        return wordList;
    }

    @Override
    public List<WeiboHotWord> sele() {
        List<WeiboHotWord> list= weiboHotWordMapper.sele();
        return list;
    }

    @Override
    public List<sourceo> sel5() {
        List<String> list1 = weiboHotWordMapper.selo();
        List<sourceo> list2 = weiboHotWordMapper.sel5();
        int num1=0;
        int num2=0;
        num2=Integer.valueOf(list1.get(0));
        for (sourceo so:list2) {
            num1+=Integer.valueOf(so.getSum());
        }
        num1=num2-num1;
        sourceo s=new sourceo();
        s.setSource("其他");
        s.setSum(String.valueOf(num1));
        list2.add(s);
        return list2;
    }

}
  • controller层
package com.tledu.springboot.springboot01.controller;
import com.tledu.springboot.springboot01.dao.WeiboHotWordDao;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@AllArgsConstructor
@RequestMapping("/words")
public class WeiboHotWordController {

    @Autowired
    private WeiboHotWordDao weiboHotWordDao;


    @GetMapping("/hot")
    public String index(ModelMap modelMap,String daySeq) {
        System.out.println("1");
        modelMap.put("yearlist",weiboHotWordDao.sele());
        if (daySeq=="" || daySeq==null){
            modelMap.put("list", weiboHotWordDao.sel());
        }else {
            modelMap.put("list", weiboHotWordDao.sel1(daySeq));
        }
        return "words";
    }
    @GetMapping("/pie")
    public String index1(ModelMap modelMap) {
        System.out.println("1");
        modelMap.put("list",weiboHotWordDao.sel5());
        return "pie";
    }

}
  • web前端页面
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>微博2012热词云图</title>
  <script src="js/echarts.min.js"></script>
  <script src="js/jquery-3.5.1.js"></script>
  <script src="js/echarts-wordcloud.js"></script>
</head>
<body>
<input type="hidden" id="yearid" name="yearid" value="">
<select id="yearnum" name="yearnum">
  <option value="20120102">2012-01-02</option>
  <option value="20120103">2012-01-03</option>
  <option value="20120103">2012-01-04</option>
</select>
<div id="main" style="width: 800px;height: 800px; "></div>

<script type="text/javascript">

  var mycharts = echarts.init(document.getElementById("main"));
  var jsonlist = [];

  $(function (){
    $.ajax({
      type:"GET",
      url:"/sysUser/roles",
      data:"",
      dataType:"json",
      success:function(vo){
        let list=vo.list;
        for(let i=0;i<list.length;i++){
          let id=list[i].id;
          let roleName = list[i].roleName;
          $("#yearnum").append('option value="'+ id +'">'+roleName+'</option>');
        }
      }
    });
    $("#yearnum").change(function(){
      var roleId=$("#yearnum option:selected").val();
      $("#yearid").val(yearid);
    })
  })


  //用来存储数据
  $.ajax({
    type:"post",
    url:"/word",
    dataType:"json",
    async:false,
    success:function (result) {

      for (var i = 0; i < result.length; i++){
        jsonlist.push(
                {
                  "name": result[i].word,
                  "value": result[i].freq,
                },
        );

      }
    },
    error :function(errorMsg) {
      alert("获取后台数据失败!");
    }
  });

  // 人像的base64编码
  // image1= "data:image/png;base64,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"
  image1= "data:image/jpeg;base64,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"

  var maskResource = new Image()
  maskResource.src=image1;
  var option ={
    //设置标题,居中显示
    title:{
      text: '微博2012热词云图',
      left:'center',
    },
    //数据可以点击
    tooltip:{

    },

    series:[
      {
        maskImage:maskResource,
        //词的类型
        type: 'wordCloud',
        //设置字符大小范围
        sizeRange:[6,78],
        rotationRange:[-45,90],
        textStyle: {
          normal:{
            //生成随机的字体颜色
            color:function () {
              return 'rgb(' + [
                Math.round(Math.random() * 160),
                Math.round(Math.random() * 160),
                Math.round(Math.random() * 160)
              ].join(',')+')';

            }
          }

        },
        //不要忘记调用数据
        data:jsonlist

      }
    ]

  };
  //加载图像,将数据放在图像中
  maskResource.onload = function(){
    mycharts.setOption(option)

  };
</script>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>词云图</title>
  <script th:src="@{/js/echarts.min.js}"></script>
  <script th:src="@{/js/echarts-wordcloud.min.js}"></script>
  <style>
    #main {
      height: 500px;
    }
  </style>
</head>
<body>
<h1>热点词云图</h1>

<form>
  <select name="daySeq">
    <option  th:each="item:${yearlist}" th:value="${item.daySeq}" th:text="${item.daySeq}"></option>
    </select>
      <button onclick="sou()" >搜索</button>
</form>

<!--<form>-->
<!--  <select>-->
<!--<!–    <option value="" selected="selected">全部</option>–>-->
<!--    <option th:each="item:${yearlist}" th:value="${item.daySeq}" th:text="${item.daySeq}"></option>-->
<!--  </select>-->
<!--  <button onclick="sou()">搜索</button>-->
<!--</form>-->


<div id="main"></div>


<script th:inline="javascript">
  var list = [[${list}]]
  // 学过map这个api吗?基于当前的数组生成一个新的数组
  // console.log(list.map(function (item) {
  //     return {name: item.word, value: item.freq}
  // }))
  // 学过箭头函数吗
  // console.log(list.map((item) => {
  //     return {name: item.word, value: item.freq}
  // }))
  // 箭头函数的简写
  // console.log(list.map(item => ({name:item.word,value:item.freq})))

  var chartDom = document.getElementById('main');
  var myChart = echarts.init(chartDom);
  var option = {
    tooltip: {},
    series: [{
      type: 'wordCloud',
      gridSize: 2,
      sizeRange: [12, 50],
      rotationRange: [-90, 90],
      shape: 'pentagon',
      width: 600,
      height: 400,
      drawOutOfBound: true,
      textStyle: {
        color: function () {
          return 'rgb(' + [
            Math.round(Math.random() * 160),
            Math.round(Math.random() * 160),
            Math.round(Math.random() * 160)
          ].join(',') + ')';
        }
      },
      emphasis: {
        textStyle: {
          shadowBlur: 10,
          shadowColor: '#333'
        }
      },
      data: list.map(item => ({name:item.word,value:item.freq}))
    }]
  };

  myChart.setOption(option);

</script>
</body>
</html>

标签:weibo,string,seq,离线,云图,seg,及词,import,day
From: https://blog.51cto.com/u_15806490/7132985

相关文章

  • 内网服务器离线编译安装mysql5
    目录一.前言二.关于MySQL三.MySQL安装篇3.1部署环境3.2前期准备工具3.3挂载系统ISO镜像,配置yum源3.4安装mysql编译所需的依赖包3.5源码编译安装mysql5.73.6配置mysql四.MySQL调优篇4.1对MySQL进行安全设置4.2设置MySQL超时时间4.3MySQL配置文件优化参......
  • Linux centos7.6 在线及离线安装postgresql12 详细教程
    一、在线安装官网找到对应的版本PostgreSQL: https://www.postgresql.org/     1.配置yum源sudoyuminstall-yhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 2.在线安装PostgreSQLsudoyuminsta......
  • ​离线数仓数据源变更及应对方案
    离线数仓数据源的变化对数仓的影响是巨大的,所以我们不但要做好事后监控,也要做好事前的各种流程制度规范,比如所有业务的升库语句需要DBA对其进行管控,只能由DBA进行升库处理,并且做好处理记录,同时把相关变更通知到数据部门。为了防止有导致异常的致命性错误,最好能把binlog监控的就监......
  • 视频集中存储/云存储/磁盘阵列EasyCVR平台接入RTSP设备出现离线情况的排查
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • centos7离线安装postgres
    官网下载源码包https://www.postgresql.org/ftp/source/v12.10/postgresql-12.10.tar.gz 上传到/usr/local目录tar-zxvfpostgresql-12.10.tar.gz 解压文件cdpostgresql-12.10依次执行如下命令 ./configure makesudomakeinstall如果执行中报如下错误则需要安装......
  • centos7离线安装docker
    1.下载docker安装包: https://download.docker.com/linux/static/stable/x86_64/2.解压文件docker-20.10.9.tgz 3.复制到/usr/bin文件夹下cpwork/docker/*/usr/bin/4.注册Docker为服务,进入 /etc/systemd/system/ 目录,并创建 docker.service 文件。vi/etc/sys......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • Centos-国内常用源和离线环境的下载安装方法
    开始之前简单讲下源和包管理器的概念,个人理解如下:源就是平时我们win电脑上的360软件管家、腾讯软件管家、微软商店这个意思,提供下载各类软件包、安装包的平台;包管理器就是win电脑上各类软件的安装包,例如qq.exe、360.msi等,需要下载后用指定的命令可以进行安装、协助等操作,跟源配......
  • 离线安装Python第三方库及依赖包
    1、问题在工作中经常需要在内网环境中安装python第三方库,使用从pypi上下载的whl文件来安装又经常遇到该库也需要依赖包,以至于并不能成功安装。2、解决办法(1)查看所需第三方库安装是否需要依赖库(以requests为例)pipshowrequests(2)使用命令将库及依赖包下载到本地(以requests为......