무엇을 할 수 있나요?
WeChat 채팅 기록을 시각화하는 데 사용됩니다.
다음 그림이 자동으로 생성될 수 있습니다.
하지 말아야 할 것
Liuhen 소프트웨어를 사용하여 Github에는 22.8k 개의 별이 있으며 소프트웨어는 버전 1.1.1로 반복되었습니다. 매우 성숙한 소프트웨어이며 신뢰할 수 있습니다.
GitHub 주소: LC044/WeChatMsg: WeChat 채팅 기록을 추출하고, 영구 저장을 위해 HTML, Word 및 CSV 문서로 내보내고, 채팅 기록을 분석하고, 연간 채팅 보고서를 생성합니다(github.com).
소프트웨어 웹사이트: https://memotrace.lc044.love/
exe를 다운받아서 설치하시면 됩니다.
나는 대부분의 사람들의 채팅 기록이 휴대폰에 있고 컴퓨터의 채팅 기록이 불완전하다고 생각합니다. 따라서 먼저 휴대폰의 채팅 기록을 컴퓨터에 동기화하십시오. 휴대폰을 변경할 때 WeChat - 설정 - 채팅 - 채팅 기록 마이그레이션 및 백업 - 마이그레이션을 경험했을 수 있습니다. 채팅 기록의 크기에 따라 몇 분 정도 기다립니다.
복호화 2 : 개인정보를 입력하고 정보를 획득합니다. 그런 다음 암호를 해독합니다. 부팅을 시작하세요!
그런 다음 친구들 사이의 채팅 기록을 내보낼 수 있습니다. 글자 깨짐을 줄이기 위해 사진, 동영상, 이모티콘을 확인하지 마세요. 내보내기에는 사진/동영상/파일이 포함되지 않습니다 .
내보내기가 완료되면 Trace를 종료합니다. 소프트웨어의 동일한 디렉터리에 데이터 디렉터리가 있습니다. 해당 디렉터리를 클릭하면 data/聊天记录/
아래에 csv 파일이 있습니다. 아마도 다음과 같을 것입니다:
이 csv 파일을 WechatVisualization의 input_data/
디렉터리에 복사하세요.
참고: Trace를 사용하면 연례 보고서 내보내기의 분석 + 시각화 기능도 통합되어 있음을 알 수 있습니다. 그러나 그것이 생성하는 연례 보고서를 자세히 살펴보면 단어가 너무 거칠다는 것을 알 수 있습니다. 워드 클라우드 다이어그램은 지저분하고 데이터 정리가 완료되지 않았습니다. 이것이 제가 직접 개발하고 싶은 이유입니다. 하지만 Trace Production에 대한 보고서가 이미 매우 훌륭하다고 생각된다면 아래 내용을 읽을 필요는 없습니다.
사용자는 기본적인 Python 지식 (코드 실행 방법)이 필요하며 Anaconda 또는 Python(버전 >= 3.7)이 컴퓨터에 설치되어 있습니다. Anaconda를 사용하는 경우 새로운 환경을 만드는 것이 가장 좋습니다.
필요한 타사 라이브러리를 순서대로 설치합니다 .
타사 라이브러리 | 기능 |
---|---|
팬더 | 양식 처리 |
matplotlib | 막대 차트 그리기 |
피얌 | 구성 파일 읽기 |
지에바 | 중국어 단어 분할 |
tqd | 인쇄 진행률 표시줄 |
pycharts | 워드 클라우드 그리기 |
원클릭 설치 방법:
pip install -r requirements.txt
설치 방법은 기본적으로 pip install
입니다. 문제가 발생하면 여기에서 자세히 설명하지 않겠습니다.
구성 파일은 config.yml
이며 메모장으로 열 수 있습니다. 물론 구문 강조가 가능하므로 코드 편집기를 사용하는 것이 좋습니다.
스스로 설정할 수 있는 내용은 다음과 같습니다.
# 输入数据
# 下面这些文件都放在input_data目录下
# 聊天记录
msg_file : msg.csv
# 微信表情中英文对照表
emoji_file : emoji.txt
# 停用词表,一般是没有实际意义的词,不想让被分析到的词都放在这里
stopword_file : stopwords_hit_modified.txt
# 词语转换表,用于合并意义相近的词,比如把“看到”、“看见”、“看看”都转换为“看”
transform_file : transformDict.txt
# 用户自定义词典,用于添加大部分字典没有的、但自己觉得不能分开的词,如i人、e人、腾讯会议
user_dict_file : userDict.txt
# 名字
# name1是自己的名字
name1 : person 1
# name2是对方的名字
name2 : person 2
# name_both是双方共同的名字
name_both : both
# 局部参数
# top_k是绘制前多少个词
# 如果词或表情的出现频次低于word_min_count或emoji_min_count,就不会被分析
# figsize是绘图图窗尺寸,第一个是宽度,第二个是高度
word_specificity :
top_k : 25
word_min_count : 2
figsize :
- 10
- 12
emoji_specificity :
emoji_min_count : 1
top_k : 5
figsize :
- 10
- 12
word_commonality :
top_k : 25
figsize :
- 10
- 12
emoji_commonality :
top_k : 5
figsize :
- 12
- 12
time_analysis :
figsize :
- 12
- 8
코드 편집기에서 직접 main.py
실행하거나 명령줄에서 python main.py
실행할 수 있습니다(이전에 생성된 환경을 먼저 활성화).
성공적으로 실행되면 다음 정보가 표시됩니다.
생성된 이미지는 현재 디렉터리의 figs
폴더에서 찾을 수 있습니다.
생성된 이미지를 확인하세요. 일부 단어가 원하는 내용이 아니거나 원하는 일부 단어가 분할되어 있는 것을 확인할 수 있습니다. 이 경우 input_data/
디렉터리로 이동하여 각 파일을 수정하세요. 이는 지속적으로 반복되는 프로세스, 즉 데이터 정리이므로 상대적으로 시간이 많이 걸립니다. 하지만 상대적으로 높은 품질의 결과를 원한다면 인내심을 갖고 신중하게 데이터를 정리하면 됩니다.
emoji.txt
WeChat 이모티콘의 중국어 및 영어 버전입니다. 위챗 이모티콘은 채팅 기록에 [facepalm], [Facepalm] 형태로 표시됩니다. 내 채팅기록에 중국어와 영어 모두 [xxx]가 있어서 비교표를 만들고 영어 단어를 모두 중국어로 바꿨습니다. 일부 이모티콘이 여전히 영어로 되어 있는 경우 중국어를 추가하여 병합할 수 있습니다.stopwords_hit_modified.txt
는 중지 단어 목록입니다. "지금", "계속 진행 중", "마치"(제 생각에는)와 같은 단어는 실제 의미가 없으므로 계산되어서는 안 되며 직접 삭제해야 합니다. 생성된 결과에 표시하고 싶지 않은 단어가 있다고 생각되면 여기에 추가할 수 있습니다.transformDict.txt
일부 단어를 다른 단어로 변환합니다. "see", "see", "look" 및 "look"과 같은 동의어는 별도로 계산될 수 있지만 반드시 하나의 단어인 "look"으로 병합할 수는 없습니다. 이렇게 하려면 두 열에 원래 단어와 변환된 단어를 입력하면 됩니다. 두 열은 탭 문자로 구분됩니다 .usreDict
"e人", "i人", "Tencent Conference" 등과 같이 기존 사전에 없는 단어를 추가할 수 있습니다. 이러한 단어를 직접 추가하지 않으면 "e", "i", "people", "Tencent", "meeting"과 같은 단어로 분할될 수 있으며 이는 우리가 보고 싶은 내용이 아닙니다. . ValueError: 모양 불일치: 개체를 단일 모양으로 브로드캐스트할 수 없습니다.
ValueError: 일반적으로 set_ticks 호출에서 발생하는 FixLocator 위치 수(5)가 눈금 라벨 수(1)와 일치하지 않습니다.
가능한 원인 : 위 두 가지 오류가 발생하는 경우 해당 위치의 top_k 또는 min_count가 너무 크게 설정되어 있고, 채팅 기록의 양이 너무 적어서 그릴 단어가 많지 않기 때문일 수 있습니다.
해결책 : 이를 염두에 두고 프로그램의 각 작은 부분이 실행될 때 설정할 수 있는 최대 매개변수 값을 인쇄했습니다. 이중 가로선이 인쇄되면 이 섹션의 매개변수가 올바르게 설정되어 프로그램이 성공적으로 실행된다는 의미입니다. 해당 위치의 파라미터가 너무 크게 설정되어 있는지 확인한 후 적절히 줄여주시면 됩니다.
parse.py
input_data/
에 있는 파일을 읽고 단어 분할을 수행합니다. keywords.csv
생성하여 temp_files/
에 넣으면 원본 데이터를 기반으로 두 개의 열이 추가됩니다. 한 열은 분할된 단어이고 다른 열은 추출된 WeChat 이모티콘입니다.word_cloud.py
단어 빈도를 계산하고, keyword_count.pkl
피클 파일을 생성하여 temp_files/
에 저장하고, 또한 단어 구름을 생성하여 figs/
에 저장합니다.figs/
에 배치됩니다.emoji_count.pkl
생성하여 temp_files/
에 넣고 이모티콘 특이성을 계산합니다. 그림은 figs/
에 배치됩니다.figs/
에 배치됩니다.figs/
에 배치됩니다.figs/
에 배치됩니다. 당신이 특정 단어를 보냈다는 것을 기억하십시오
배타성이란 자신은 자주 말하지만 상대방은 자주 말하지 않는다는 의미입니다(그 반대의 경우도 마찬가지). 독점성에 대한 나의 고려 사항은 A, B, C 세 단어가 있다고 가정합니다.
단어 | 자신의 주파수 x | 상대방의 빈도 y |
---|---|---|
에이 | 4 | 0 |
비 | 100 | 96 |
기음 | 1 | 0 |
나로서는 A의 독점성이 가장 높아야 하는 것은 당연하다. B라는 단어의 경우 두 사람의 차이가 4번이나 있지만 상대적으로 4번의 대조가 뚜렷하지 않습니다. C의 경우 베이스 수가 너무 적습니다. C가 고유한 어휘라고 말하는 것은 그다지 신뢰할 수 없습니다.
특이성 측정을 다음과 같이 하자.
밑수를 곱하면 어떻게 되나요? 기본은 총 횟수입니다
따라서 내 구현에서는 용어 빈도의 합을 곱하는 대신 용어 빈도의 최대값, 즉 $$ alpha_i=dfrac{x_i-y_i}{x_i+y_i}cdotmathrm{max}를 곱합니다. (x_i ,y_i) $$ 이는 단어 A의 특이도가 가장 높다는 것을 보장할 수 있습니다.
공유한다는 것은 두 사람이 종종 한 마디를 한다는 것을 의미합니다. 그러니 먼저 한쪽이 한 번도 말한 적이 없는 말을 삭제하세요 . 이렇게하려면 먼저 양측이 말하는 단어의 교차점을 취하십시오 .
이제 우리는 여전히 세 단어 A, B, C가 있다고 가정합니다.
단어 | 자신의 주파수 x | 상대방의 빈도 y |
---|---|---|
에이 | 50 | 50 |
비 | 1000 | 1 |
기음 | 1 | 1 |
B라는 단어는 다른 사람이 말한 것보다 내가 훨씬 더 많이 말한 것이므로 공통성은 분명히 매우 낮습니다. 양측 모두 C라는 단어를 거의 같은 횟수로 말했지만, 그 기준수가 너무 작아서 신뢰할 만한 결론을 도출할 수 없습니다. 따라서 A라는 단어의 공통성이 가장 높습니다. 어떻게 계산하나요?
공동체성은 배타성의 반대인데, 배타성의 역수를 사용할 수 있을까요? 기분이 나빠요. 부분적으로는 분모가
이를 위해 저는 조화 평균을 사용했습니다: $$ beta=dfrac{2}{1/x+1/y} $$ 여기서 다른 수단 대신 조화 평균을 사용하는 이유는 조화 평균이 다음과 같기 때문입니다. 4가지 평균 중 가장 작은 숫자인 '공통성'은 두 사람 모두 자주 말해야 한다는 점을 강조하며, 한쪽이 말만 하고 다른 쪽은 말하지 않는다는 점을 강조한다. 즉, 한쪽이 아무리 말을 많이 해도 공통점에 미치는 영향은 크다. 또한 단어 B(1000,1)와 같이 매우 작습니다.
조화 평균을 사용하면 단어 A가 가장 큰 공통성을 갖도록 보장할 수 있습니다.
끝내기 싫으시면 소스코드를 봐주세요.
본 프로젝트에는 흔적을 남기는 기능이 통합되어 있지 않습니다. 흔적에서 데이터를 추출하는 기능을 추가하면 보다 간단한 처리 작업을 달성할 수 있습니다. 그러나 저자의 능력과 시간적 제약으로 인해 현재 이 아이디어는 구현될 수 없습니다. 그 외 미흡한 기능이나 개선이 필요한 부분에 대해서는 GitHub나 공식 계정 배경화면에 남겨주시면 감사하겠습니다. 같은 생각을 가진 사람들이 개발자 팀에 합류하는 것을 환영하며 함께 더 나은 WechatVisualization을 개발합시다!