qq群聊記錄統計
最近,算是做了個小東西吧,就是統計群裡面的人說了什麼,誰最愛說什麼話,口頭禪什麼的。最終結果還是比較差,不過仍然把全過程記錄下,說下遇到的困難與解決方式。
起因
前一陣子在群裡面水,大家在打賭,誰肯定說過最多的xx,誰說過最多的xx,後來我想了想就說用程式跑一邊看看。
準備要素
- 聊天記錄
- 分詞工具
- 有趣的統計
聊天記錄
騰訊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上面刪了。
資料初步統計
以上資料有了之後,開始進行統計,
首先是一共說過多少話,誰說的最多,前三名佔了多少什麼的,這些都沒什麼可說的,隨便一寫就有了。這裡就不貼程式碼了。
接下來是對時間緯度進行統計,使用了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的東西(知道了幾個牛逼的名詞)
知道了自己幾斤幾兩
比較失敗的地方:
- 使用遠高於自身水品的東西,不自量力
- 同時學習好幾件事情,吃力不討好。
- 期望過高
- 沒有儘快把事情做完,拖了好多天–這個簡單的東西拖了近20天
- 沒有對內容進行重構,基本上是按照思路順序寫的,好多重複冗餘的東西,簡單改改就能大幅提升效率
- 命名還是不太行
東西提交到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