用python做些有意思的事——分析QQ聊天記錄——私人訂制


    之前,寫了這篇文章,用python提取全部群成員的發言時間,並簡單做了下分析。先補充一下,針對特定單個群成員(這里以  小小白   為例)消息記錄的獲取。

代碼比較簡單,主要是正則表達式的書寫。(附:聊天文件記錄的導出請參考上面提到的文章)

    代碼如下:

#2016/9/14
#從QQ聊天數據導出特定人發言的日期時間和發言內容

import re
import xlsxwriter

# 小小白   這里代指你要獲取數據的對象的昵稱
# 方便起見,見數據導出的文件名也明明為此
workbook = xlsxwriter.Workbook('小小白.xlsx')
worksheet = workbook.add_worksheet()
worksheet.set_column('A:A', 5)
worksheet.set_column('B:B', 10)
worksheet.set_column('C:C', 200)

with open('高等數學.txt',encoding='utf-8') as f:
    s = f.read()
    # 正則,跨行匹配
    pa = re.compile(r'^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) 小小白\(小小白的QQ號\)\n(.*?)\n$',re.DOTALL+re.MULTILINE)
    ma = re.findall(pa,s)
    # print(len(ma))
    for i in range(len(ma)):
        # print(ma[i][0])
        date = ma[i][0]
        time = ma[i][1]
        word = ma[i][2]

        worksheet.write(int(i),0,date)
        worksheet.write(int(i),1,time)
        worksheet.write(int(i),2,word)

    workbook.close()
    print("處理完畢,快去看看文件夾下面新建的.xlsx文件吧")

   ###########2016/10/18補更###############

  小島台風,待在宿舍無聊,就優化了之前分析QQ聊天記錄的代碼,綜合上文和之前寫的那篇文章,做了個私人訂制。實現從聊天記錄對特定人的發言信息進行提取,並用matplotlib作圖,終於不想用excel...

  代碼比較簡單,核心的提取都和之前的一樣,這里直接貼出來:

import re
import matplotlib.pyplot as plt


# 解決matplotlib顯示中文的問題
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
mpl.rcParams['axes.unicode_minus'] = False


# 獲取24個時間段----->periods
# 用於之后時間的分段
def get_periods():
    periods = []
    for i in range(0,24):
        # 這里的判斷用於將類似的‘8’ 轉化為 ‘08’ 便於和導出數據匹配
        if i < 10:
            i = '0'+str(i)
        else:
            i = str(i)
        periods.append(i)
    return periods

'''
對QQ群而言的時間提取

# 獲取聊天文件的“小時”數據
def get_times(filename):
    with open(filename, encoding='utf-8') as f:
        data = f.read()
        # 例如20:50:52,要匹配其中的20
        pa = re.compile(r"(\d\d):\d\d:\d\d")
        times = re.findall(pa, data)

    return times
'''


# 對每一個時間段進行計數
def classification(times,period):
    num = 0
    for time in times:
        if time == period:
            num += 1
    period_time.append([period,num])
    # print(period, '--->', num)


# 作圖

def plot_time(period_time,name):
    time = []
    num  = []
    for i in period_time:
        time.append(i[0])
        num.append(i[1])
    time = time[6:24]+time[0:6]
    num = num[6:24]+num[0:6]
    # print(time,'\n',num)
    labels = time
    x = [i for i in range(0,24)]
    plt.plot(num, 'g')
    num_max = max(num)
    plt.xticks(x,labels)
    plt.axis([00, 24, 0, num_max*(1.2)])
    plt.grid(True)
    plt.title(name)
    plt.ylabel('發言量')
    plt.xlabel('時間')
    plt.show()

def get_person_data(filename,name,qqnumber):
    person_data = {'date':[],'time':[],'word':[]}
    with open(filename,encoding='utf-8') as f:
        s = f.read()
        # 正則,跨行匹配
        pa = re.compile(r'^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) '+name+r'\('+qqnumber+'\)\n(.*?)\n$',re.DOTALL+re.MULTILINE)
        ma = re.findall(pa,s)
        # print(len(ma))
        for i in range(len(ma)):
            # print(ma[i][0])
            date = ma[i][0]
            time = ma[i][1]
            word = ma[i][2]
            person_data['date'].append(date)
            person_data['time'].append(time[0:2])
            person_data['word'].append(word)
    return person_data


if __name__=="__main__":
    filename = input('請輸入聊天記錄文件名:')
    name = input('准備提取個人信息就緒,請輸入要提取人的群名片:')
    qqnumber = input('請輸入要提取人的QQ號:')
    period_time = []
    person_data = get_person_data(filename,name,qqnumber)
    times = person_data['time']

    periods = get_periods()
    for period in periods:
        classification(times,period)
    plot_time(period_time,name)
    # print(person_data['word'])

  關於matplotlib作圖指定坐標標簽的,看這里

  運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM