微信聊天记录生成词云图

  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;

// 此处过滤长度为1的str

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下载

微信聊天记录生成词云图相关推荐

  1. 微信聊天记录的词云制作

    微信聊天记录的词云制作 需求 导出微信聊天记录 提取文字聊天记录 生成词云 需求 想把跟朋友的微信聊天记录做个词云 导出微信聊天记录 我的手机是iphone,用旧版的itunes备份手机全部信息 it ...

  2. 微信聊天记录制作词云图

    1 使用iTunes 备份iphone: 2在C:\Users\xxxx\AppData\Roaming\Apple Computer\MobileSync\Backup路径中找到备份文件夹 3打开备 ...

  3. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  4. 基于DataFrame结构的词频表生成词云图

    说明:基于DataFrame结构的词频表生成词云图 代码 from wordcloud import WordCloud import matplotlib.pyplot as pltfrequenc ...

  5. python爬虫学习:爬虫QQ说说并生成词云图,回忆满满

    自学过一段时间的python,用django自己做了个 网站,也用requests+BeautifulSoup爬虫过些简单的网站,周末研究学习了一波,准备爬取QQ空间的说说,并把内容存在txt中,读取 ...

  6. NLP之WordCloud:基于jieba+matplotlib库对一段文本生成词云图~~情人节最好的礼物(给你一张过去的词云图,看看那时我们的爱情)

    NLP之WordCloud:基于jieba+matplotlib库对一段文本生成词云图~~情人节最好的礼物(给你一张过去的词云图,看看那时我们的爱情) 目录 输出词云图结果 输出文本统计 设计思路 实 ...

  7. Python实现Wordcloud生成词云图的示例

    wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概. 首先贴出一张词云图(以哈利波特小说为例): 在生成词云图之前 ...

  8. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  9. python生成词云图个人技术报告_【Python成长之路】词云图制作

    [写在前面] 以前看到过一些大神制作的词云图 ,觉得效果很有意思.如果有朋友不了解词云图的效果,可以看下面的几张图(图片都是网上找到的): 网上找了找相关的软件,有些软件制作 还要付费.结果前几天在大 ...

  10. python 引入同一路径的类_Python实现Wordcloud生成词云图的示例

    wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概. 首先贴出一张词云图(以哈利波特小说为例): 在生成词云图之前 ...

最新文章

  1. ISME:微生物网络构建与分析面临的挑战
  2. CCF 202104 Python
  3. git pull 是到工作区还是暂存区_每天一Git之简单理解工作区和暂存区
  4. 弱事件 WeakEvent
  5. P5644-[PKUWC2018]猎人杀【NTT,分治】
  6. 【重磅综述】长序列数据分析相关资源哪里找?一文读懂长序列测序数据分析的机遇与挑战!...
  7. NIUDAY 七牛美图 AI 共享日 | 大咖云集 邀您共同探索各场景下的 AI 应用与落地...
  8. Gephi实战教程:从零开始
  9. 并发编程之高并发编程的意义、好处和注意事项
  10. 最新版本Aid LearningV0.86安装注意事项
  11. 使用NSIS脚本制作一个安装包
  12. 部署harbor服务器(https/http)
  13. 埃拉托色尼筛选法c语言求最大公约数,用埃拉托色尼筛算法求两个数最大公约数C++的实现...
  14. 科研实习 | 北京大学万小军老师课题组招收NLP方向实习生和访问学生
  15. STM32F429i disco 体验
  16. Raft 实现日志复制同步
  17. 【高项】一次过 信息系统项目管理师 心得
  18. 「 SLAM lesson-2.3 」SLAM数学描述、运动方程、观测方程
  19. 什么是企业微信scrm系统?企业微信SCRM系统有什么功能?企业微信SCRM系统推荐。
  20. magento打印订单里面添加运输方式

热门文章

  1. lg android tv 手机助手,LG电视安装第三方APP教程 仅针对安卓电视
  2. Cannot access a disposed object. A common cause of this error is disposing a context that ...问题解决
  3. win7系统服务器无法局域网访问,Win7局域网无法访问如何解决?
  4. 运放放大倍数计算公式_运放选型速记指南
  5. 车载芯片分类、用途、供应商
  6. 51单片机学习:串口通信实验
  7. oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER
  8. matlab 行 读取文件 跳过_matlab-Textscan在行首跳过所需的空白
  9. MATLAB去除多余点的命令,如何清除matlab命令窗口中已有的内容
  10. windows系统下更改itunes默认备份地址(小白实操)