본문 바로가기
잡담

카카오톡 채팅 수 분석

by 꾸욱꾸우욱 2021. 4. 23.

제목엔 거창하게 써놨지만 사실 별 내용은 아니다. 그냥 코드를 작성하고 보니 생각보다 길어져서 글로 남겨두려 한다. 

코드를 작성하게 된 계기는 현재 들어간 채팅방에서 말이 없었던 날을 찾고자 함이었다. 

카카오톡의 기능 중 채팅 내용 내려받기가 있다. 해당 기능을 이용해 전체 채팅 내용을 txt 파일로 저장하였다. 파일을 열어보면 대화의 형식이 다음처럼 "2021년 4월 23일 오전 2:28, 이름 : 채팅 내용" 으로 표시된다. 특정 날짜의 대화량을 파악하기 위한 것이므로 row는 month, column은 day로 하는 2중 리스트를 선언하여 전체 내용을 순회하며 해당 날짜에 대화가 있을 경우 리스트의 숫자를 증가시키는 것으로 구상하였다. 


코드는 이러하다.

r = open('KakaoTalkChats-6.txt', mode = 'rt', encoding = 'utf-8')
text = r.readlines()

eight = [[0] * 32 for _ in range(13)]
nine = [[0] * 32 for _ in range(13)]
ten = [[0] * 32 for _ in range(13)]
one = [[0] * 32 for _ in range(13)]


def check_null(texts):
    year, month, day = 0, 0, 0
    for text in texts:
        if len(text) > 5 and text[0].isdecimal() and text[4] == '년' and text[6].isdecimal():
            try:
                index = text.find('년')
                year = int(text[:index])
                index = text.find('월')
                month = int(text[index - 2:index])
                index = text.find('일')
                day = int(text[index - 2:index])
                if year == 2018:
                    eight[month][day] += 1  
                elif year == 2019:
                    nine[month][day] += 1
                elif year == 2020:
                    ten[month][day] += 1
                elif year == 2021:
                    one[month][day] += 1
            except:
                pass

def under_ten(year):
    for month in range(2, 13):
        for day in range(1, 32):
            if year[month][day] <= 10:
                if month == 2 and day > 28:
                    continue
                if (month == 2 or month == 4 or month == 6 or month == 9 or month == 11) and day > 30:
                    continue
                print(month, day)

check_null(text)

print("2018 year")
under_ten(eight)

print("2019 year")
under_ten(nine)

print("2020 year")
under_ten(ten)

우선 파일을 열어 전체 내역을 저장해준다. 채팅의 기록이 18년도 부터 21년도 까지 있으므로 저장을 위한 리스트 4개를 선언해준다.

 

다음으로 check_null 함수를 선언한다. 해당 함수는 전체 파일을 저장한 리스트를 받아 해당하는 일자에 맞게 앞서 선언한 리스트에 넣어주는 함수이다. 이를 위해 한 줄씩 texts에서 불러와야 한다. 반복문을 이용해 해당 코드를 실행하는데 데이터의 양식이 맞는지 확인해야 한다. 개행을 하여 전송하였거나 연도를 복사해서 전송한 경우 오류가 발생하기 때문이다. 이를 위해 앞서 파악한 저장 양식을 바탕으로 해당 줄의 길이가 6 이상이고 첫자리가 숫자로 시작하며 '년'으로 끝나고 month의 자리가 숫자인지 확인하기로 했다. 사실 조건문이 굉장히 난잡한데 중간에 디버깅 과정에서 자꾸 에러가 발생하길래 나오는 것들을 대충 처리하려다 보니 그렇게 됐다. 다음으로 find와 리스트 슬라이싱을 이용하여 year, month, day를 확인하였다. 이를 이용해 year가 일치하는 리스트의 month와 day에 대화가 하나 추가되었다는 의미로 1을 더해주었다. 이 과정에서 예외처리를 이용하였는데 앞서 말한 양식의 오류가 자주 발생했기 때문에 이를 처리하기 위함이었다(적당히 있으면 대충 txt를 수정하려 했으나 정말 끝이 없었다...).

 

다음으로 under_ten함수를 선언하여 대화 횟수가 저장된 리스트들에서 하루 대화량이 10 이하인 날을 확인하여 출력해주었다. 다만 이때 당월의 날짜가 31일까지 있지 않는 경우를 따로 처리해주어야 했다.

 

결과적으로 check_null함수를 실행하여 대화 횟수를 저장한 뒤 under_ten함수를 각각 돌려 대화량이 10이하인 날을 출력해주도록 했다.


크게 의미있는 글은 아니지만 그냥 심심해서 작성하였다. 의미부여를 하자면 그냥 생각했던 내용을 구현해보았다 정도 일 듯하다. 나중에 여유가 생기면 다른 것도 구현해봐야지.

'잡담' 카테고리의 다른 글

컴공 1학년 1학기 중간고사 대비문제  (1) 2022.04.01
화면 클릭 매크로  (0) 2022.03.09
추첨기  (0) 2021.06.17
꾸욱꾸우욱의 이야기  (0) 2019.06.17