微信聊天记录生成词云图

微信聊天记录生成词云图

  1. 基本材料准备

电脑微信客户端、手机微信客户端、电脑mumu安卓模拟器(安装微信和RE文件管理器)、sqlcipher.exe、idea

  1. 获取微信聊天记录
  1. 电脑微信客户端备份聊天记录

微信左下角点击备份与恢复按钮出现如下弹窗

然后点击左侧备份聊天记录至电脑,需在手机确认(可以选择部分聊天记录也可以全部记录),注意手机要与电脑在同一网络中

备份完成后,点击管理备份文件出现如下弹窗

记住备份文件存储位置,以及备份的文件

2、恢复电脑备份记录到mumu安卓模拟器中微信中

先设置mumu模拟器,点击模拟器左上角进入设置中心,在基本设置中开启Root权限,在属性设置中随机一个IMEI编码,记录这个编码,后续会用到,然后点击保存并关闭。

然后登录模拟器的微信

电脑微信选择恢复聊天记录至手机,则会恢复刚才备份的记录到模拟器的微信中

3、在mumu模拟器中找到备份的聊天记录库

打开RE文件管理器找到以下路径/data/data/com.tencent.mm/MicroMsg/,在这个路径下打开对应的账号的文件夹,在文件夹中找到EnMicroMsg.db。

然后鼠标左键长点击这个文件会出现复制按钮,点击复制,复制这个db文件到 mumu模拟器与电脑的共享文件夹中(一般都是sdcard下,放在电脑的什么位置 由安装模拟器时自己设置,也可以通过模拟器最下一排功能中文件共享按钮设置)

 这样就获取了聊天记录的数据库

  1. 解密微信聊天数据库
  1. 获取加密库密码

在木木模拟器中打开/data/data/com.tencent.m/shared_prefs中auth_info_key_prefs.xml文件

打开这个文件可以看到

这个_auth_uin标签中对应的值,这个值需要记录下来,作为密码的一部分,通过 1234567890ABCDEF拼接上这个值,进行MD5加密获取小写32位字符后截取 7位作为数据库密码

2、解密数据库

点击选择数据库后会弹出要输入密码的输入框输入上边得到的密码

然后选则Browse Data,再打开message表,这张表里的数据就是聊天记录的数据,这里的数据可以通过工具导出,导出后就随便怎么使用了。

  1. 统计聊天记录
  1. 引入jar包

<dependency>

    <groupId>org.ansj</groupId>

    <artifactId>ansj_seg</artifactId>

    <version>5.1.1</version>

</dependency>

  1. 统计词频代码

import org.ansj.splitWord.analysis.NlpAnalysis;

import java.io.*;

import java.util.*;

public class statistical {

    public static void main(String[] args) throws IOException {

        wordFrequency();

    }

    public static void wordFrequency() throws IOException {

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

        String article = getString();

        String result = NlpAnalysis.parse(article).toStringWithOutNature();

        String[] words = result.split(",");

        for(String word: words){

            String str = word.trim();

            // 过滤空白字符

            if (str.equals(""))

                continue;

                // 过滤一些高频率的符号

            else if(str.matches("[||.|||+|-|“|”|||\\s]"))

                continue;

                // 此处过滤长度为1str

            else if (str.length() < 2)

                continue;

            if (!map.containsKey(word)){

                map.put(word, 1);

            } else {

                int n = map.get(word);

                map.put(word, ++n);

            }

        }

        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();

        while (iterator.hasNext()){

            Map.Entry<String, Integer> entry = iterator.next();

            System.out.println(entry.getKey() + ": " + entry.getValue());

        }

        List<Map.Entry<String, Integer>> list = new ArrayList<>();

        Map.Entry<String, Integer> entry;

        while ((entry = getMax(map)) != null){

            list.add(entry);

        }

        System.out.println(Arrays.toString(list.toArray()));

    }

    /**

     * 找出mapvalue最大的entry, 返回此entry, 并在map删除此entry

     * @param map

     * @return

     */

    public static Map.Entry<String, Integer> getMax(Map<String, Integer> map){

        if (map.size() == 0){

            return null;

        }

        Map.Entry<String, Integer> maxEntry = null;

        boolean flag = false;

        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();

        while (iterator.hasNext()){

            Map.Entry<String, Integer> entry = iterator.next();

            if (!flag){

                maxEntry = entry;

                flag = true;

            }

            if (entry.getValue() > maxEntry.getValue()){

                maxEntry = entry;

            }

        }

        map.remove(maxEntry.getKey());

        return maxEntry;

    }

    /**

     * 从文件中读取待分割的文章素材.

     * 文件内容来自简书热门文章: https://www.jianshu.com/p/5b37403f6ba6

     * @return

     * @throws IOException

     */

    public static String getString() throws IOException {

        FileInputStream inputStream = new FileInputStream(new File("E://ciyuntu/android/db/2.txt"));

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder strBuilder = new StringBuilder();

        String line;

        while((line = reader.readLine()) != null){

            String s = "";

            int n = 0;

            for(int i = 0; i < line.length(); i++) {

                n = (int)line.charAt(i);

                if(19968 <= n && n <40869) {

                    s+=line.charAt(i);

                }

            }

            strBuilder.append(s);

        }

        reader.close();

        inputStream.close();

        return strBuilder.toString();

    }

}

  1. 生成词云图
  1. 引入jar包

<dependency>

    <groupId>com.kennycason</groupId>

    <artifactId>kumo-core</artifactId>

    <version>1.27</version>

</dependency>

<dependency>

    <groupId>com.kennycason</groupId>

    <artifactId>kumo-tokenizers</artifactId>

    <version>1.27</version>

</dependency>

  1. 生成词云图代码

package com.java.code.citu;

import com.kennycason.kumo.CollisionMode;

import com.kennycason.kumo.WordCloud;

import com.kennycason.kumo.WordFrequency;

import com.kennycason.kumo.bg.CircleBackground;

import com.kennycason.kumo.bg.PixelBoundryBackground;

import com.kennycason.kumo.font.KumoFont;

import com.kennycason.kumo.font.scale.SqrtFontScalar;

import com.kennycason.kumo.nlp.FrequencyAnalyzer;

import com.kennycason.kumo.nlp.tokenizers.ChineseWordTokenizer;

import com.kennycason.kumo.palette.LinearGradientColorPalette;

import java.awt.*;

import java.io.IOException;

import java.util.*;

import java.util.List;

public class citu {

    public static void main(String[] args) throws IOException {

        createWordCountPic();

    }

    private static void createWordCountPic() throws IOException {

        FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();

        frequencyAnalyzer.setWordFrequenciesToReturn(600);

        frequencyAnalyzer.setMinWordLength(2);

        frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());

        // 可以直接从文件中读取

        //List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("E://ciyuntu/android/db/1.txt"));

        List<WordFrequency> wordFrequencies = new ArrayList<>();

        String strValue = "嗯嗯=3060, 破涕为笑=2417, 今天=1831";

        String[] split = strValue.split(", ");

        String word = "";

        int count = 0;

        for (int i = 0; i < split.length; i++) {

            String[] wordInfo = split[i].split("=");

            word = wordInfo[0];

            count = Integer.valueOf(wordInfo[1]);

            wordFrequencies.add(new WordFrequency(word, count));

        }

        //加入分词并随机生成权重,每次生成得图片都不一样

        //test.stream().forEach(e-> wordFrequencies.add(new WordFrequency(e,new Random().nextInt(test.size()))));

        //此处不设置会出现中文乱码

        java.awt.Font font = new java.awt.Font("STSong-Light", 2, 18);

        //设置图片分辨率

        Dimension dimension = new Dimension(1360, 1020);

        //此处的设置采用内置常量即可,生成词云对象

        WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);

        //设置背景图片

        wordCloud.setBackground(new PixelBoundryBackground("E://1.png"));

        //设置边界及字体

        wordCloud.setPadding(5);

        //因为我这边是生成一个圆形,这边设置圆的半径

        //wordCloud.setBackground(new CircleBackground(255));

        wordCloud.setFontScalar(new SqrtFontScalar(12, 42));

        //设置词云显示的三种颜色,越靠前设置表示词频越高的词语的颜色

        wordCloud.setColorPalette(new LinearGradientColorPalette(Color.RED, Color.BLUE, Color.GREEN, 30, 30));

        wordCloud.setKumoFont(new KumoFont(font));

        wordCloud.setBackgroundColor(new Color(255, 255, 255));

        wordCloud.build(wordFrequencies);

        //生成词云图路径

        wordCloud.writeToFile("E:\\wordCount.png");

    }

}

资源:

木木模拟器下载地址:MuMu模拟器官网_安卓模拟器_网易MuMu手游模拟器

下载地址:sqlcipher.exe,简易的数据库客户端-Android文档类资源-CSDN下载

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值