福大軟工1816 · 團隊現場編程實戰(抽獎系統)

組員職責分工

林燊

  • 分工
    • 協調組內成員編碼
    • 完成原始數據的格式化處理,分類別抽取出數據特徵
    • 審查最終各成員代碼
    • 協助優化各模塊代碼

董鈞昊

  • 分工
    • 完成基於字典形式的數據庫創建
    • 實現抽獎標準算法——開局選取基於名字中的英文字符個數以及極低的隨機權重選取部分 「歐洲人」(運氣較好的人),同時基於樸素貝葉斯分類器以及較低的發言權重再附加上極低的隨機權重完成中獎者的選取
    • 完成數據處理端與後端接口以及先後端接口的實現
    • 完成博客的編寫工做

盧愷翔

  • 分工
    • 完成普經過濾算法和深度過濾算法的實現,以及參與了數據預處理部分。
    • 普經過濾算法可以根據用戶發言的時間進行判斷,過濾掉只在抽獎當天發言或者已經有兩週不發言的人;而深度過濾算法過濾掉只在抽獎當天發言或者在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文件,自動生成美觀海報python

例:#我要紅包#結果以下:git

  • 聊天記錄的分析與挖掘
  • 1. 將同窗之間提到對方的次數呈現爲可視化圖(以下所示)

實現方法:遍歷數據,將同窗名和他們所發的消息保存成詞典,而後依次遍歷消息,尋找提到別人的次數,記到列表中。github

仔細觀察圖,發現2號和9號被提起的次數不少,查看前面記錄的數據(號數加用戶名
算法

發現是柯老師和雨勤學姐(顯而易見)數據庫

  • 2. 將每一個同窗被q的次數呈現爲條形圖

能夠看到,被que最多的是2號(柯老師),9號(雨勤學姐)和21號(佩佩),和咱們預想的同樣編程

這個功能也有一些問題,好比有禮貌的我可能並不會提到老師的全名,這樣的que是不被計入次數的,又或者各個同窗有一些奇怪的愛稱,這個也是咱們不能識別的後端

鼓勵有想法且有用的功能

  • 或許你想根據聊天記錄分析獲取發言者的情感波動,而文本量較大且沒法人工進行,這時咱們該怎麼辦呢?
  • 對此咱們可基於此結合情感分析的手段實現文本處理,遺憾工程量過大,沒法在時間限定內實現,大體結果圖以下圖所示:

遇到的困難及解決方法

  • 董鈞昊
    • 困難一:好久沒有編碼,查找資料以及Debug上花費時間過長
    • 解決方法一:定時的編碼練習仍是須要多注意的
    • 困難二:在實現樸素貝葉斯分類器時,最開始思路不清晰,致使中期代碼重構以及接口不對稱問題
    • 解決方法二:提早協調規範化接口定義,繪製出整體流程圖後,再予以解決方案。
  • 盧愷翔
    • 困難一:數據格式沒有按照預期的想法實現
    • 解決方法一:對預處理過的數據進行再處理
    • 困難二:過濾算法時間界定判斷複雜
    • 解決方法二:再次對數據進行格式化,調用python庫進行時間篩選。
  • 朱志豪
    • 困難一:不會用python繪圖
    • 解決方法一:現場學習,百度python如何繪圖,平時多學習python的有用的庫
    • 困難二:對本身的定位不是很清楚
    • 解決方法二:靜下來冷靜思考,合理分析本身的能力和不足 打開文件,發現有的發言竟然不止一行...而後就只好調整處理文件的邏輯從新編碼
    • 困難三:代碼能力偏弱
    • 解決方法三:平時多打代碼,也能夠作一些不須要特別強代碼能力的事
    • 困難四:很難構思出頗有創意的附加功能
    • 解決方法四:從生活找素材,冷靜觀察,大膽思考
  • 楊喜源
    • 困難一:負責寫附加功能中的海報和自動分享,可是之前沒有作過相似的東西,再加上時間比較緊迫,網上沒有找到相似的發送圖片
    • 解決方法一:在設計海報方面找到了python的PIL可以自動生成海報,同時也瞭解到能夠發送qq信息的qqbot,可是qqbot不支持發送圖片,這方面仍是沒能解決
  • 陳俞辛
    • 困難一:做業中給出的示例聊天記錄編碼格式和個人VS上默認的編碼格式不同,致使我在處理文件的時候一直亂碼
    • 解決方法一:用了隊友的 MAC 進行編程(MAC真好用)
    • 困難二:仍是示例聊天記錄的問題,現場編碼的時候看到用戶的每次發言都只有一行,因而就按這樣的格式去處理文件了,然而頻繁出錯
    • 解決方法二:在隊友的建議下,使用 Notepad++ 打開文件,發現有的發言竟然不止一行...而後就只好調整處理文件的邏輯從新編碼

馬後炮

  • 董鈞昊
    • 若是時間利用更高效的話,整合對接功能就不會那麼倉促了。
  • 朱志豪
    • 若是平時可以多打點代碼,那麼那天早上我就能完成附加功能了。
  • 楊喜源
    • 若是時間能再多一點,這學期的課少一點,那麼就多作作軟工實踐了
  • 陳俞辛
    • 若是我早點發現編碼和格式的問題,那麼就不用浪費那麼多時間作無用功了

貢獻度

貢獻度
11%
俞辛 8%
柏濤 13%
志豪 12%
鈞昊 14%
愷翔 12%
喜源 10%
宇航 12%
宏巖 8%
相關文章
相關標籤/搜索