微信聊天记录生成词云图
- 基本材料准备
电脑微信客户端、手机微信客户端、电脑mumu安卓模拟器(安装微信和RE文件管理器)、sqlcipher.exe、idea
- 获取微信聊天记录
- 电脑微信客户端备份聊天记录
微信左下角点击备份与恢复按钮出现如下弹窗
然后点击左侧备份聊天记录至电脑,需在手机确认(可以选择部分聊天记录也可以全部记录),注意手机要与电脑在同一网络中
备份完成后,点击管理备份文件出现如下弹窗
记住备份文件存储位置,以及备份的文件
2、恢复电脑备份记录到mumu安卓模拟器中微信中
先设置mumu模拟器,点击模拟器左上角进入设置中心,在基本设置中开启Root权限,在属性设置中随机一个IMEI编码,记录这个编码,后续会用到,然后点击保存并关闭。
然后登录模拟器的微信
电脑微信选择恢复聊天记录至手机,则会恢复刚才备份的记录到模拟器的微信中
3、在mumu模拟器中找到备份的聊天记录库
打开RE文件管理器找到以下路径/data/data/com.tencent.mm/MicroMsg/,在这个路径下打开对应的账号的文件夹,在文件夹中找到EnMicroMsg.db。
然后鼠标左键长点击这个文件会出现复制按钮,点击复制,复制这个db文件到 mumu模拟器与电脑的共享文件夹中(一般都是sdcard下,放在电脑的什么位置 由安装模拟器时自己设置,也可以通过模拟器最下一排功能中文件共享按钮设置)
这样就获取了聊天记录的数据库
- 解密微信聊天数据库
- 获取加密库密码
在木木模拟器中打开/data/data/com.tencent.m/shared_prefs中auth_info_key_prefs.xml文件
打开这个文件可以看到
这个_auth_uin标签中对应的值,这个值需要记录下来,作为密码的一部分,通过 1234567890ABCDEF拼接上这个值,进行MD5加密获取小写32位字符后截取 前 7位作为数据库密码。
2、解密数据库
点击选择数据库后会弹出要输入密码的输入框输入上边得到的密码
然后选则Browse Data,再打开message表,这张表里的数据就是聊天记录的数据,这里的数据可以通过工具导出,导出后就随便怎么使用了。
- 统计聊天记录
- 引入jar包
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.1</version>
</dependency>
- 统计词频代码
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()));
}
/**
* 找出map中value最大的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();
}
}
- 生成词云图
- 引入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>
- 生成词云图代码
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下载