組員職責分工
林燊
- 分工
- 協調組内成員編碼
- 完成原始資料的格式化處理,分類别抽取出資料特征
- 審查最終各成員代碼
- 協助優化各子產品代碼
董鈞昊
-
- 完成基于字典形式的資料庫建立
- 實作抽獎标準算法——開局選取基于名字中的英文字元個數以及極低的随機權重選取部分 “歐洲人”(運氣較好的人),同時基于樸素貝葉斯分類器以及較低的發言權重再附加上極低的随機權重完成中獎者的選取
- 完成資料處理端與後端接口以及前後端接口的實作
- 完成部落格的編寫工作
盧恺翔
-
- 完成普通過濾算法和深度過濾算法的實作,以及參與了資料預處理部分。
- 普通過濾算法能夠根據使用者發言的時間進行判斷,過濾掉隻在抽獎當天發言或者已經有兩周不發言的人;而深度過濾算法過濾掉隻在抽獎當天發言或者在3天内不發言的人。
- 将格式化化檔案按照要求,轉換成固定格式的txt檔案。
楊喜源
-
- 附加功能實作中的中獎海報生成——提供了抽獎次數、頒獎時間、中獎名單等一系列資訊,實作了資料到海報的可視化。
- 附加功能中的自動分享功能
朱志豪
-
- 附加功能實作中的資料可視化,即為将同學之間提到對方的次數呈現為可視化的圖,得到結論:聊天室的中心是柯老師。
- 同時提供了條形圖資料,将每個人被提次數呈現為條形圖,結論:排名前三的是柯老師,助教雨勤學姐和佩佩
- 抽獎文案的設計
陳柏濤
-
- 前段界面實作
- 協助前後端接口實作
蔡宇航
-
- qqbot的學習(附加功能中實作爬取指定群聊指定時刻聊天記錄)
- qqbot爬取使用者所有聊天記錄并寫入檔案
- 編寫定時結束qqbot并退出賬号的函數
- 代碼整合
劉宏岩
-
- 編寫啟動qqbot登入指定賬号的函數
- 編寫指定群聊聊天記錄指定格式寫入檔案寫入檔案的函數
- 接口封裝
陳俞辛
-
- 對爬取的聊天記錄預處理,結果提供給抽獎算法
- 測試程式功能以及算法是否公平公正
- 收內建員材料,以供鈞昊寫部落格
- readme部分撰寫
github的送出日志截圖
程式運作截圖
實作視訊
- 我們通過設定抽獎名稱、獎品名稱等多個抽獎關鍵字來完成抽獎的進行,同時隐式傳回資訊至後端,完成海報的智能生成。
- 再通過選擇關鍵詞以及過濾規則 (不過濾、淺度過濾、深度過濾) 來完成抽獎資訊的比對。
- 最後實作抽獎傳回中獎名單以及公示海報,如下圖所示。
- 在附加子產品上,我們完成了擷取指定群聊的所有聊天記錄、公示海報的智能生成以及聊天記錄的分析與挖掘,具體如下圖所示。
程式運作環境
- 算法、後端部分
- python==3.6
- matlab
- 前端
- Qt==5
- 具體運作操作參見readme.md
GUI界面
- 資訊填寫部分用于選取QQ群名,進而擷取指定群消息記錄。
基礎功能實作
基礎功能
- 部分基于樸素貝葉斯分類器的抽獎,具體分為以下幾個步驟:
- 抽獎前,針對使用者的ID選取部分幸運者,置這些人較高的權重
- 在選取過程中,會參考使用者的發言次數以及發言長度,同時篩選重複發言,以淺度過濾水軍發言
- 最後再附加上極小的随機性,得出中獎幾率
- 流程圖如下所示:
- 時間過濾,則分為以下三類:
- 不過濾:預設對全聊天記錄進行分析
- 淺度過濾:對30天内的聊天記錄進行分析
- 深度過濾:對7天内的聊天記錄分析
附加功能實作
附加功能(需要安裝qqbot庫):
- 在給定時間内擷取指定群聊的所有聊天記錄,具體如下:
- 設定用于擷取記錄的qq帳号
- 利用網頁端qq(smart qq)實作指定賬号掃碼登入;
- 基于qqbot庫實時爬取目前賬戶的所有聊天記錄;
- 将爬取的聊天記錄進行分類,并寫入到如下兩個檔案:
- input.txt:爬取并記錄下使用者登入後所有聊天記錄
- output.txt:爬取并以指定格式記錄使用者指定群聊指定時刻内的聊天記錄
- 超過使用者給定時間後自動退出目前賬戶,保證賬戶安全;
- 由于騰訊關閉擷取qq号端口,無法擷取qq号(屬于個人隐私)
- 效果展示:
- 請求使用者輸入群名和倒計時長:
- 彈出登入二維碼:
- 登入成功開始計時:
- 提示計時完畢
- 指令行中顯示爬取結果:
- input.txt内容:
- output.txt内容:
- 自動生成海報
獲獎了怎麼公布?發文字?太low了。一鍵自動生成獲獎海報才能展現逼格。
本次利用python的PIL庫,實作讀取抽獎結果的txt檔案,自動生成美觀海報
例:#我要紅包#結果如下:
- 聊天記錄的分析與挖掘
- 1. 将同學之間提到對方的次數呈現為可視化圖(如下所示)
實作方法:周遊資料,将同學名和他們所發的消息儲存成詞典,然後依次周遊消息,尋找提到别人的次數,記到清單中。
仔細觀察圖,發現2号和9号被提起的次數很多,檢視前面記錄的資料(号數加使用者名)
發現是柯老師和雨勤學姐(顯而易見)
- 2. 将每個同學被q的次數呈現為條形圖
可以看到,被que最多的是2号(柯老師),9号(雨勤學姐)和21号(佩佩),和我們預想的一樣
這個功能也有一些問題,比如有禮貌的我可能并不會提到老師的全名,這樣的que是不被計入次數的,又或者各個同學有一些奇怪的愛稱,這個也是我們不能識别的
鼓勵有想法且有用的功能
- 或許你想根據聊天記錄分析擷取發言者的情感波動,而文本量較大且無法人工進行,這時我們該怎麼辦呢?
- 對此我們可基于此結合情感分析的手段實作文本處理,遺憾工程量過大,無法在時間限定内實作,大緻結果圖如下圖所示:
遇到的困難及解決方法
-
- 困難一:很久沒有編碼,查找資料以及Debug上花費時間過長
- 解決方法一:定時的編碼練習還是需要多注意的
- 困難二:在實作樸素貝葉斯分類器時,最開始思路不清晰,導緻中期代碼重構以及接口不對稱問題
- 解決方法二:提前協調規範化接口定義,繪制出總體流程圖後,再予以解決方案。
-
- 困難一:資料格式沒有按照預期的想法實作
- 解決方法一:對預處理過的資料進行再處理
- 困難二:過濾算法時間界定判斷複雜
- 解決方法二:再次對資料進行格式化,調用python庫進行時間篩選。
-
- 困難一:不會用python繪圖
- 解決方法一:現場學習,百度python如何繪圖,平時多學習python的有用的庫
- 困難二:對自己的定位不是很清楚
- 解決方法二:靜下來冷靜思考,合理分析自己的能力和不足 打開檔案,發現有的發言居然不止一行...然後就隻好調整處理檔案的邏輯重新編碼
- 困難三:代碼能力偏弱
- 解決方法三:平時多打代碼,也可以做一些不需要特别強代碼能力的事
- 困難四:很難構思出很有創意的附加功能
- 解決方法四:從生活找素材,冷靜觀察,大膽思考
-
- 困難一:負責寫附加功能中的海報和自動分享,但是以前沒有做過類似的東西,再加上時間比較緊迫,網上沒有找到類似的發送圖檔
- 解決方法一:在設計海報方面找到了python的PIL能夠自動生成海報,同時也了解到可以發送qq資訊的qqbot,但是qqbot不支援發送圖檔,這方面還是沒能解決
-
- 困難一:作業中給出的示例聊天記錄編碼格式和我的VS上預設的編碼格式不一樣,導緻我在處理檔案的時候一直亂碼
- 解決方法一:用了隊友的 MAC 進行程式設計(MAC真好用)
- 困難二:還是示例聊天記錄的問題,現場編碼的時候看到使用者的每次發言都隻有一行,于是就按這樣的格式去處理檔案了,然而頻繁出錯
- 解決方法二:在隊友的建議下,使用 Notepad++ 打開檔案,發現有的發言居然不止一行...然後就隻好調整處理檔案的邏輯重新編碼
-
- 困難一:Qt做出來的界面單調,視覺效果不好
- 解決方法一:使用QSS樣式表,統一設定主題。使用QPropertyAnimation編寫界面之間的切換動畫,提升使用者體驗。
- 困難二:在進行前後端對接後,發現後端python代碼效率低,需要分析十幾秒才能出結果。
- 解決方法二:分析并優化後端python代碼,大幅度提升效率。對于測試資料,速度降到1秒以下。
- 困難三:Qt對于中文的支援并不好,測試時中文出現亂碼。
- 解決方法三:使用QString::fromLocal8Bit()函數實作從本地字元集GB到Unicode的轉換,進行中文顯示亂碼問題。
-
- 困難一:爬取曆史聊天記錄
- 解決方法:很遺憾并未解決這一點,因為網頁端的qqsmart沒有漫遊記錄,加上pc端的qq的聊天記錄檔案是加密的,是以無法爬取曆史聊天記錄(除了手動導出聊天記錄進行格式處理)。
- 困難二:雖然會一點爬蟲,會一點python的皮毛,但是這次要爬取的是從未爬過的qq聊天記錄,覺得實作起來難度很大
- 解決方法二:剛開始思路是利用網頁端qqsmart爬取,但是查閱了很多資料實作難度大,了解到qqbot庫(在這裡感謝張揚組給出的思路)
- 困難三:抓取下來的東西如何寫入檔案
- 解決方法三:将控制台輸出内容實時寫入檔案中
- 困難四:雖然明白了如何爬取,但是在使用者登入後,qqbot抓下來的是使用者所有的聊天記錄,包括一些qqbot的日志輸出
- 解決方法四:利用python re庫正規表達式進行關鍵資訊提取,再進行格式處理,輸出成目标格式
- 困難五:既然是抽獎系統,必定有抽獎時長,是以該系統的隻能爬取該時長内的聊天記錄并寫入檔案中(ps:作為使用者,聊天記錄應屬于個人隐私,隻擷取指定倒計時長内的聊天記錄内容才合理)
- 解決方法五:利用正規表達式比對使用者登入成功後,qqbot的日志輸出,然後開始倒計時(倒計時長為使用者指定輸入),将倒計時長内的内容寫入檔案,一旦時間到,就退出使用者的賬号(ps:保證賬号安全),另外寫了一個stop函數,通過調用指令行執行qq stop指令來結束qqbot。
- 困難六:給出的格式中應該有每個發言者的qq号,如何擷取呢
- 解決方法六:首先查閱了很多資料,因為騰訊關閉了群的接口,是以無法擷取使用者的真實qq号(屬于個人隐私),嘗試了很多的方法,還是隻能擷取到使用者的uin号(隻有登入賬号者的uin号才是自己的qq号),嘗試過qqbot擷取群成員資訊然後進行比對得到uin号(後來因為uin号作用不大是以沒有使用)
馬後炮
-
- 如果時間利用更高效的話,整合對接功能就不會那麼倉促了。
-
- 如果平時能夠多打點代碼,那麼那天早上我就能完成附加功能了。
-
- 如果時間能再多一點,這學期的課少一點,那麼就多做做軟工實踐了
-
- 如果我早點發現編碼和格式的問題,那麼就不用浪費那麼多時間做無用功了
-
- 如果時間再多一點就好了。
-
- -如果自己之前能了解多一點關于如何爬取qq聊天記錄的話,就不會在查閱資料上花費大部分時間了。
貢獻度
名 | |
---|---|
燊 | 11% |
俞辛 | 8% |
柏濤 | 13% |
志豪 | 12% |
鈞昊 | 14% |
恺翔 | |
喜源 | 10% |
宇航 | |
宏岩 |