1. 程式人生 > >qq群聊記錄統計

qq群聊記錄統計

最近,算是做了個小東西吧,就是統計群裡面的人說了什麼,誰最愛說什麼話,口頭禪什麼的。最終結果還是比較差,不過仍然把全過程記錄下,說下遇到的困難與解決方式。

起因

前一陣子在群裡面水,大家在打賭,誰肯定說過最多的xx,誰說過最多的xx,後來我想了想就說用程式跑一邊看看。

準備要素

  1. 聊天記錄
  2. 分詞工具
  3. 有趣的統計

聊天記錄

騰訊QQ群聊天記錄匯出只有3種格式,bak加密(破解不了),mht 相當於html,打都打不開,也懶得轉,最後一個txt,我選擇了txt。

其實現在寫文件的時候想了想,如果我要是用mht方式處理的話,好像就不用寫這麼多正則了。。。不過處理html基本是要上js的,然而js怎麼與java互動呢?或者說直接用js來實現呢?反正麻煩無窮無盡吧。

分詞工具

分詞工具什麼語言的都有,最後還是優先java了,初選 NLPChina。因為對這個不懂,不清楚,不瞭解,查了查。

NLP 是 自然語言處理的簡稱。(可以說一個裝逼了

我根據網上資料,產生了以下理解,一種NLP是使用字典的方式,通過統計上的方法,把句子拆分成詞彙。
另一種是,近年來比較火的,機器學習?這種方式是不斷的給機器喂資料,然後讓程式自動去處理分詞。

有趣的統計資料

這部分內容,我在前期和後期都做了記錄,在實現專案前,我找了一個朋友,隨便想了想。後來等到有了匯出的txt資料,又增加了一點東西。主要是以下幾點

  • 統計群裡面的朋友常說哪些詞,不常說哪些詞。
  • 統計群裡面的成員誰最愛說話,
  • 統計哪個時間最愛說話
  • 統計誰最受歡迎(被at次數最多
  • 統計那些話題討論最熱
  • 做個情感分析?
  • 改過多少暱稱?

需要的東西都準備好了,現在準備開始做了。

資料處理

我目前只想統計過去2017年的聊天資料,看了看匯出的txt檔案,大概只能選擇正則的方式了。訊息的格式基本上就是很標準,如下圖所示,正則其實就是按照順序寫,匹配的東西大概是什麼樣子,或者是什麼格式,找到絕對正確的思路實現一下就行。

聊天截圖

其實正則寫了一段時間,一方面是java自帶的方法不會用,另一方面是正則不會寫。

自帶方法不會用的原因是,不理解這個是幹嘛的,後來瞭解正則裡面group的概念之後,才知道怎麼回事。這裡簡單說說java正則相關的內容。

Java正則相關的內容一共有兩個Class,一個是Pattern、一個是Matcher,前面的意思是初始化正則表示式相關的內容,後面的相當於一個匹配器。

Pattern初始化的方式就是傳入正則和正則初始化引數。Pattern提供的幾個Method 不太合適,最後只能選擇Matcher進行處理。

Matcher就和正則的關係比較大了,懂正則的話,看一眼基本上就都懂,Matcher裡面的方法 簡單說就是,從哪開始,到哪結束,開始找,找到了啥,有沒有這個,等。會的話本身就簡單,不會也看不懂,還要去補正則。。。

    String txt2strArr = "\\r\\n\\r\\n2017-\\d\\d-\\d\\d [\\d]+:[\\d]+:[\\d]+ [^<(\\r\\n]+[<(][^>)\\r\\n]+[>)]\\r\\n[\\r\\n\\S\\s]*?(?=\\r\\n\\r\\n)";
    Matcher m = Pattern.compile(txt2strArr).matcher(str);
    List<String> s = new ArrayList<String>();
    while (m.find()) {
        s.add(m.group(0));
    }

自己手裡面大約是4w條對話,後來找朋友要了一份,大約是10w,其實資料都不全,應該捏一起看看有多少。

然後就是對資料進行細分,把資料都整理成Bean物件,具體的做法依舊是正則,一個迴圈,把所有的內容生成為物件,同時根據txt的實際情況處理了部分內容,如[圖片][表情]計數啊等等。

    String regexDate = "(2017-\\d\\d-\\d\\d [\\d]+:[\\d]+:\\d\\d)";
    String regexNickname = "(?<=:\\d\\d )([^<(\\r\\n]+)(?=[<(])";//使用group的方式,獲得括號
    String regexUid = "(?<=[<(])([\\S]+)(?=[>)])";
    String regexContext = "(?<=[>)]\\r\\n)([\\s\\S]*)";

    String regexStrAt = "(?<[email protected])([\\S]+(?=\\s)|[\\S]+)";
    String regexStrEmoji = "\\[表情\\]";
    String regexStrPic = "\\[圖片\\]";
    String regexStrHttp = "(http[\\S]+(?=[\\s])|http[\\S]+)";//http with blank end or http simple end

資料整理完了後,需要把資料按照人頭區分開來,手寫了個map,把實際的人和相關的id關聯起來了。當然這段程式碼公開並不好,所以就從github上面刪了。

人頭map

資料初步統計

以上資料有了之後,開始進行統計,

首先是一共說過多少話,誰說的最多,前三名佔了多少什麼的,這些都沒什麼可說的,隨便一寫就有了。這裡就不貼程式碼了。

初步統計

接下來是對時間緯度進行統計,使用了Data 物件,個人認為比較有價值的資訊是,周幾說話人多,周幾說話人少,24h內,什麼時候說話人最多,什麼時候說話人最少。

在這裡,處理了一下Date相關的內容,仔細看了下API 文件,總結下:Date 相關的方法基本都被遺棄掉了,不推薦使用,如果想獲得日期相關的具體細節,要麼使用format的方式格式化出來,要麼使用Calender這個類來進行處理。由於一直使用的Date物件,就繼續使用format的方式來處理了。

當然時間的統計不僅僅能在整體的資料上面使用,還可以在每個人身上使用,所以單獨抽出來寫成一個方法。

分詞統計

接下來就是分詞的處理了,其實分詞這個東西看了好久,在issue裡面才找到wiki這回事。

最開始的時候看首頁的README.md

其中說很多東西沒有寫上來,需要自己看,然後我就開始看test。

後來看 test包 越看越不對,這tm都是單元測試的內容啊,用ide重新建了個專案才知道怎麼回事,因為剛用idea,不太清楚怎麼回事。

再後來感覺範例不是那麼回事,就開始只看demo了,但是看demo並不能讓我做出選擇用哪部分內容。然後就開始亂翻,,從issue中找到一個wiki的事情,然後去看了wiki,才把這東西梳理清楚。

弄清楚怎麼回事之後(差了一部分資料),選擇使用最基礎的部分也就是ToAnalysis 精準分詞 店長推薦。改下配置不輸出詞性

        for (Meta me : list) {
        if (me.getStr() != null && !me.getStr().equals("")) {
            Result parse = ToAnalysis.parse(me.getStr());
            for (Term t : parse) {
                if (t.getRealName().length() == 1) {
                    continue;
                }
                if (sortedWords.containsKey(t.getRealName())) {
                    sortedWords.put(t.getRealName(), sortedWords.get(t.getRealName()) + 1);
                } else {
                    sortedWords.put(t.getRealName(), 1);
                }
            }
        }
    }

等我迫不及待的看下分詞統計結果的時候,當然是非常讓人失望的,而且也非常現實。使用最多的當然是標點符號啊,還有被分成單字的。直接把長度是1的字元過濾掉了,然後又跑了一邊,結果emmmm….

這裡寫圖片描述

這裡寫圖片描述

大概就是這個效果。很無奈,我又沒有更高階的演算法來進行處理,也沒有更牛逼的字典。

其他的雜項

情感分析的內容在NLPChina的 issue中看到了,仔細看了下demo,需要一個情感字典。沒有,放棄。

分析熱點話題,基本上相當於理解語意了,不知道怎麼處理,放棄。

誰被at次數最多?會實現,懶,而且at的內容並不一定有規律,做法就是把所有人的id、所有用過的暱稱、都扔到一個map中,key是暱稱,value是真實的id,然後再新建一個map,key 是真實的id,value計數,比較一下基本就能得出結果。但是這個並不好玩,而且還面對著這樣的一個問題,at後面顯示的是使用者真實的暱稱,而聊天的暱稱顯示的是群的暱稱,兩個暱稱對不上是很容易出現的。截圖就不放了,還需要打碼。

總結

功能要麼做不出來,做出來又無法優化,又無聊,又無用。心灰意冷,大概就是這樣了。

學會使用了正則。
學會了查詢開源內容
因為這個東西完全是在IDEA上面實踐的,學會了部分IDEA的用法
瞭解了部分NLP的東西(知道了幾個牛逼的名詞)
知道了自己幾斤幾兩

比較失敗的地方:

  1. 使用遠高於自身水品的東西,不自量力
  2. 同時學習好幾件事情,吃力不討好。
  3. 期望過高
  4. 沒有儘快把事情做完,拖了好多天–這個簡單的東西拖了近20天
  5. 沒有對內容進行重構,基本上是按照思路順序寫的,好多重複冗餘的東西,簡單改改就能大幅提升效率
  6. 命名還是不太行

東西提交到github了,願意用的自取:
github

最後放個比較有意思的
這裡寫圖片描述

這裡寫圖片描述

真tmd,上班摸魚群

相關推薦

qq記錄統計

最近,算是做了個小東西吧,就是統計群裡面的人說了什麼,誰最愛說什麼話,口頭禪什麼的。最終結果還是比較差,不過仍然把全過程記錄下,說下遇到的困難與解決方式。 起因 前一陣子在群裡面水,大家在打賭,誰肯定說過最多的xx,誰說過最多的xx,後來我想了想就說用程

QQ聊天記錄分析器

前幾天閒來無聊,想清理一下自己建的一個QQ群。有些人長期不發言,著實無奈。突然想起來QQ匯出的聊天記錄有一定的格式,就試著用JAVA寫了個小程式去分析。沒想到幾行程式碼就搞定了。 分析出來的效果和設想的差不多,可以顯示每QQ號發言的次數。這下那些潛水的就無可遁形了 :D 下載地址 注意:安裝 JAVA

TCP協議實現qq

一、注意的問題 客戶端的0號檔案描述要設定成非阻塞,這樣才能接受其他客戶端發的訊息。 客戶端的讀寫操作也必須設定成非阻塞。 對服務端使用setsockopt函式,允許建立多個埠號相同的套接字(解決伺服器先關閉而引發TIME_WAIT狀態的一系列問題)

博客園 閃存尬 附微信QQ

微信 公眾號 博客園 博客 技術分享 個人 idt -- http ---恢復內容開始--- 微信群二維碼 關註個人微信公眾號 gangganghsuo 發微信號到私信 我一個一個拉,或者直接掃描下面微信群二維碼 QQ群二維碼:658530518 ---恢復內容

第四講 smart qq 獲取聯系人信息 ,分組 好友

個人 callback llb bsp client channel name 群聊 _id 首先從post一下 http://s.web2.qq.com/api/get_user_friends2 這個鏈接獲取分組categories ,好友信息 friends,inf

SignalR快速入門 ~ 仿QQ即時聊天,訊息推送,單,多(基礎=》提升)

 SignalR快速入門 ~ 仿QQ即時聊天,訊息推送,單聊,群聊,多群公聊(基礎=》提升,5個Demo貫徹全篇,感興趣的玩才是真的學) 應用情景之一:   沒太多連續的時間來研究SignalR,所以我把這篇文章分了三個階段: 第一個階段,簡單使用,熟悉並認識SignalR 第二個階段,實現

Android開啟QQ臨時會話和開啟

1、 開啟QQ臨時會話: String url3521 = "mqqwpa://im/chat?chat_type=wpa&uin=1257683526"; startActivity(new Intent(Intent.ACTION_VIEW, Uri.pars

python統計話癆、活躍日期和活躍時段

寫了個指令碼統計群裡每個人發言的次數,最活躍的日期,以及每天每個時段發言的次數: 1.首先匯出qq群聊天記錄,更名為qq.txt 2.執行指令碼 指令碼程式碼如下: #coding:utf-8 import re from collections import Count

歡迎各位技術牛人增加Swift QQ:343549891

san mod p s strong dot -a 100% rac 動畫 急招:五年以上Swift開發經驗,24個月工資。30天年假。配司機專車。歡迎各位技術牛人增加Swift 敏捷大拇指 官方QQ群1:343549891 官方QQ群2:245285613報上“來自

我的QQ,歡迎入坑!

程序員 項目管理 uml Q群1(項目管理):128704420Q群2(UML):95749085Q群3(程序員):154614721入群請寫有意義附加信息噢!本文出自 “張傳波” 博客,謝絕轉載!我的QQ群,歡迎入坑!

基於itchat的微信小助手基礎開發(一)

log 表達式 數據包 gin 找到 ont 基本 時間 msg 前段時間由於要管理微信群,基於itchat開發了一個簡單的微信機器人 主要功能有: 圖靈機器人功能 群聊昵稱格式修改提示 消息防撤回功能 鬥圖功能 要開發一個基於itchat的最基本的聊天機器人,

吐血分享:QQ霸屏技術教程(接單篇)

系列文章 豬八戒 hellip 小號 沒有 精準 3.4 擁有 邏輯   在文章《QQ群霸屏技術教程(利潤篇)》中,阿力推推提及到QQ群霸屏技術變現的方式,稍顯粗略,這裏詳盡介紹下(老鳥漂過)。   資本   資本之上,才談得上接單,沒技能,接個毛線。   1擅長點。

吐血分享:QQ霸屏技術教程(利潤篇)

難度 排名 淘寶 用戶數據 解決 管理員 增加 引流 還在   QQ群技術,不論日進幾百,空隙時間多的可以嘗試,日進100問題不大。   QQ群技術,如何賺錢,能賺多少錢?不同行業,不同關鍵詞,不同力度,不一樣的產出。   群費   群費,這個和付費群是有區別的,群費

吐血分享:QQ霸屏技術教程之霸屏實施細則

搬家 出現問題 系統 實力 教育 提高 .com 關鍵詞搜索 怎麽辦   小號,再不養,成本抗不住了;QQ群,再不玩,真的就玩不動啦。   霸屏系列,堅持下來差不多10來篇,最近更新的幾篇,算是霸屏系列的更新版,畢竟相當的規則變動了。   經營自己,是一種前瞻能力,霸屏

吐血分享:QQ霸屏技術教程2017(問題篇)

情況 恢復 繼續 排名 時間間隔 批量 其他 亦或 後置   霸屏技術,問題篇後,暫時擱置,爾望後續。   這裏針對操作中,經常遇到的問題,做個簡單整理。   回憶下,排名流程。   1、建群,品牌產品群,做任何關鍵詞都是品牌產品群,皆因其有獨特的優勢。   2、拉

方別《QQ霸屏技術》,又見《QQ細則》

idt order 關註 4.5 手機 rip 審核 核心 後置  規則,時刻變動;QQ群系列,咱們再來一輪。      QQ群霸屏技術,你說建群貌似很菜,大家仿佛都知道,其實只知其一不知其二。   QQ群類別   群分類,常規的就以下幾種。   普通群

吐血分享:QQ霸屏技術教程2017(活躍篇)

實現 需要 強調 查詢 但是 表情 單位 內容 至少   熱門詞的群排名,在前期優化準備充分的情況下,活躍度不失為必殺技。   在《吐血分享:QQ群霸屏技術(初級篇)》中,我們提及到熱門詞的群排名,有了前面的基礎,我們就可以進入深度優化,實現絕對的霸屏。   前期優化,

吐血分享:QQ霸屏技術教程2017(維護篇)

失敗 重要 文件 細節 流程 問題 鏈接 灰色 會有   排名上去,並不是終極穩定,日常維護相當重要。   群排名做上去了,如果不去維護,排名很可能會下去,尤其是咱們做了很多群的時候,完全不會留意到。   為什麽不穩定?   1、活躍度下去了,排名當然不穩定,這個需要

CentOS7下Elasticsearch集部署記錄

基本 文件 one option 三臺 停止 並且 是否 ons Elasticsearch是一個分布式搜索服務,提供Restful API,底層基於Lucene,采用多shard的方式保證數據安全,並且提供自動resharding的功能,github等大型的站點也都采

C/S模型之TCP

cpp etl word client inet_addr accep 應用程序 with value 說明:利用TCP協議和多線程實現群聊功能。一個服務器,多個客戶端(同一個程序多次啟動)。客戶端向服務端發送數據,由服務端進行轉發到其他客戶端。 /服務端 // WSAS