[로그] 카카오톡 대화내용 txt → csv 변환 후 분석해보기! (1)

(데이터분석 끝까지 진행해보고자 하였으나ㅜㅜ 너무 시간을 많이 쓰고 있어서 여기까지만 업로드하고.. 추후에 또 갖고 놀아보겠습니다.. 2탄으로 돌아올게요ㅜ)


(추가) 하면서 느낀점/궁금한점 기록

  • 유저명이 ‘다혜/95/의정부’ 일 때 지피티가 알아서 구조파악 후 '다혜‘만 user_id로 뽑아줬는데, 이러다보니 이름을 동일형식으로 기재하지 않은 유저데이터는 모두 날아갔음.

  • → 그냥 유저명을 통째로 데이터로 저장하고 싶은데 이렇게 지피티가 과하게 해줘서 생기는 어려움들을 만나지 않으려면, 더더욱 명확하게 명령해줘야겠다는 생각.

  • → Ex) '유저명은 날짜정보 바로 뒤에 쉼표 다음에 오는 문자열이고, 바로 다음에 나오는 콜론기호 직전까지 전체야‘

  • → 자연어로 소통하니 알아서 맥락파악 해주는 것은 좋으나 ..


  • 해당데이터로 성격추측 진행하려고 하는데 윤리문제와 개인정보 문제를 언급하며 진행해주지 않았음. 그래서 유저별 고유아이디를 생성하고 진행을 시도해보고자 했음. 끝까지 마무리는 못했지만 유저별 고유값까지 잘 새로운 열로 추가해줬음.

  • → 사람 이름을 지피티가 파악하는건지, 내가 유저명이라고 지칭했기에 파악한건지 궁금. 만약 유저명 열의 이름을 '문자열A‘ 같은 유저임을 인식하지 못하게 하면 되려나


  • 지금까지 내가 txt→csv 진행한 내용을 지피티가 잘 알아들을 수 있는 프롬프트로 적어달라고 요청했음. 이때 'ㅇㅇㅇ님이 나갔습니다’와 같은 시스템메시지는 제외해주세요. 라는 프롬프트를 주더군요

  • 시스템 메세지 라고 하면 알아서 이해하냐고 물어봤더니 카카오 채팅 내역이기 때문에 유저의 입퇴장 같은 알림은 시스템 메세지로 처리해 준다고 하더라구요.

  • 제가 그러면 시스템 메세지로 작성된 문장들을 하나씩 나열해서 ‘이 구조는 제외해줘’ 라고 명령 하지 않아도 (날짜 정보라던가 입 퇴장 알림 공지 알림 등) 시스템 메세지로 파악하고 각각을 처리할 수 있는 코드를 짜서 실행 하는 것 같습니다. 알잘딱깔센 지피티..



스터터는 끝났지만..! 열정은 식지 않죠! (사실 다른 일 하기 싫어서 이거 하는거 아님..)

가끔씩 지피티와 노코드로 끄적이는 내용들을 아카이빙 해보고자 합니다!


배경

  • 지난 스터디에서 mbti 유형 별 작성한 포스트 내용을 토대로 연애유형 파악해보기를 진행했음

  • 지피티 ADA를 통해 비정형데이터(텍스트)로 분석해 볼 수 있는 접근이 굉장히 많다는 걸 배움 (감정분석, 어휘다양성 등)

  • 카카오톡 대화내용을 기반으로 감정분석, 어휘다양성 등의 데이터분석을 해볼 수 있지 않을까?

  • 더 나아가 이 프로세스를 한 번 만들어두면 진짜 남자친구와의 대화 내용도 분석해 볼 수 있지 않을까?!

  • 데이터 : 운영 중인 오픈카톡방(동네 소모임) 대화내용 txt 파일로 시작!


+ 영심님께서 ㅎㅎ 제 지난 게시글(https://www.gpters.org/data-science/post/figure-out-your-dating-64U3bqao3RfYyJ9)에 달아주신 댓글내용 보고 ㅎㅎ 한 번 시도해보기로 했습니다!


STEP 1. 카카오톡 대화내용 txt → csv


1. 카카오톡 txt 파일 추출

  • pc에서 대화 내보내기 하면 csv 파일로 저장됨

  • 모바일에서 대화 내보내기 하면 txt 파일로 저장됨

  • 최근에 맥북을 바꾸면서… pc에는 이전 대화들이 남아있지 않아서 부득이하게 txt 파일로 진행

  • 겸사겸사 txt 파일을 csv로 변환하는 것부터 해보기로 함!

  • (참고) 카톡대화방 > 설정 > 대화 내용 내보내기 > 텍스트 메시지만 보내기 → 이메일로 txt 파일이 옴



2. txt 파일 구조 분석 후 csv 열 구분해달라고 하기

  • Date / User / Message로 구분해서 넣어달라고 했음

  • 위 이미지와 같이 날짜 구분 텍스트, 입퇴장 알림 텍스트 등의 문구는 제외해달라고 했음

  • 아래 이미지와 같이 메시지가 줄바꿈 되어있는 경우 \n 으로 구분해서 이어달라고 했음



3. 결과물 확인하고 잘 안된 부분 재요청하기

결과물을 확인했더니 줄바꿈 부분이 맨 첫줄만 들어오고 나머지는 다 잘라버렸더군요

그래서 다시 명확하게 요청했습니다.

한 번에 제발 알아듣고 알잘딱깔센으로 해주길 바랐지만.. 지피티가 못알아들은 건 제가 잘못 명령했기 때문이니 다시금 침착해져봅니다. 다시 예시를 들어주며 요청!


드디어 원하는 대로 해주었습니다!



4. 아닛? 입퇴장 알림 텍스트에는 User가 없다보니 그냥 메시지로 처리해버렸더군요?

  • 2023. 6. 2. 오후 11:46: OOO님이 들어왔습니다.

  • 2023. 6. 15. 오전 6:08: OOO님이 나갔습니다.


한 번에 요청할걸.. 미안해 지피티야!! 번거롭더라도 지금처럼 반복작업 잘 해주길 바라!

만족스러운 결과물!


+) 시간도 별도의 열로 구분하면 가장 활발한 시간대를 파악해볼 수 있지 않을까 하여 Date를 Date / Time으로 나눠달라고 했습니다.


+ ) 그러나 이렇게 파싱이 제대로 안되는 게 또 생기고.. 시간데이터를 제대로 파싱을 못하거나.. 오후/오전 값을 날렸다거나.. 한 2시간을 씨름해서 .. 겨우 해낸 아래의 코드..



5. 처음 txt 파일을 지금의 완벽한 csv 파일이 될 수 있도록 모든 과정을 코드로 달라고 했습니다

  • 그러면 코랩에 카톡 대화추출 txt 파일만 넣으면 딱 깔끔하게 대화내용만 csv로 추출되겠죠?!

import re
import csv

# 채팅 텍스트를 CSV 형식으로 변환하는 함수
def process_final_chat_to_csv(chat_lines):
    # 새 메시지의 시작을 인식하기 위한 정규 표현식
    new_message_pattern = re.compile(r'(\d{4}\.\s\d{1,2}\.\s\d{1,2})\.\s(오전|오후)\s(\d{1,2}:\d{2}),\s([^:]+)\s:')
    # 시스템 메시지를 인식하기 위한 정규 표현식 (예: 사용자가 채팅방에 들어오거나 나갔을 때의 메시지)
    system_message_pattern = re.compile(r'\d{4}년\s\d{1,2}월\s\d{1,2}일\s[월화수목금토일]요일|님이 (들어왔습니다|나갔습니다)\.')
    
    # 처리된 메시지를 저장할 리스트
    processed_chat_data = []
    
    # 현재 처리중인 메시지를 저장할 임시 변수들
    current_date, current_time, current_user, current_message = None, None, None, ""
    
    # 각 줄에 대해 반복 처리
    for line in chat_lines:
        # 시스템 메시지는 건너뛰기
        if system_message_pattern.search(line):
            continue
        
        # 새 메시지 시작을 확인
        new_message_match = new_message_pattern.match(line)
        if new_message_match:
            # 현재 처리중인 메시지가 있으면 저장
            if current_user:
                # 오전/오후를 시간 필드에 포함하여 저장
                processed_chat_data.append([
                    current_date, 
                    f"{new_message_match.group(2)} {current_time}",  # 오전/오후 포함 시간
                    current_user, 
                    current_message.strip().replace('\n', ' ')
                ])
            # 새 메시지 처리 시작
            current_date, current_time, current_user = new_message_match.groups()[0], new_message_match.groups()[2], new_message_match.groups()[3]
            current_message = line[new_message_match.end():].strip()  # 메시지의 나머지 부분
        elif line.strip():  # 빈 줄이 아닌 경우, 현재 메시지의 연속으로 처리
            current_message += ' ' + line.strip()
    
    # 마지막 메시지 처리
    if current_user:
        # 마지막 메시지에 대해서도 오전/오후를 시간 필드에 포함하여 저장
        processed_chat_data.append([
            current_date, 
            f"{new_message_match.group(2)} {current_time}",  # 오전/오후 포함 시간
            current_user, 
            current_message.strip().replace('\n', ' ')
        ])
    
    return processed_chat_data

# 파일 경로 지정
file_path = '/mnt/data/더스패 1109 추출 전제.txt'

# 파일을 읽고 내용을 저장
with open(file_path, 'r', encoding='utf-8') as file:
    chat_lines = file.readlines()

# 채팅 내용을 처리하고 오전/오후를 포함한 시간 정보를 포함한 데이터를 얻음
chat_data_final = process_final_chat_to_csv(chat_lines)

# 처리된 채팅 데이터를 오전/오후를 포함한 시간 정보와 함께 CSV 파일로 저장
csv_file_path_final_updated_including_ampm = '/mnt/data/your_converted_file_updated_including_ampm.csv'
with open(csv_file_path_final_updated_including_ampm, 'w', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile)
    # CSV 파일 헤더 작성
    csvwriter.writerow(['Date', 'Time', 'User', 'Message'])
    # CSV 데이터 작성
    csvwriter.writerows(chat_data_final)


지피티의 좋은 점 :

  • input과 원하는 output만 정확히 내가 알고 있으면 그 가운데 블랙박스를 알아서 짜준다 + 그 블랙박스를 역으로 공부할 수 있다!

  • 끄적이며 배웠던 파이썬.. 이거 코드를 쓱 훑으면서 아주 깔끔한 코딩에 감탄하며.. 한 번 학습해줍니다! 정규식 처리 기가막히네요 ㄷㄷ



STEP 2. 이 데이터로 데이터 분석하기

지난 데이터분석 때 얄팍하게 배운 지식으로… 다음의 것들을 해보려고 합니다.

유저별 첫 메시지 날짜, 마지막 메시지 날짜를 표로 정리해주고, 가장 오랜 기간 참여하고 있는 유저 top 10을 그래프로 보여줘


신기했던 점

  • 유저명이 모두 ‘다혜/95/의정부’ 이렇게 되어있는데, 알아서 user 이름을 ‘다혜’ 만 빼주네요?

  • 어떤 유저가 ‘이름89/의정부’ 이렇게 기입해두었는데, 이 유저는 아예 누락되었습니다. 지피티가 알아서 유저명 구조를 분석 파악하고 파싱을 해서 앞부분만 이름으로 기입한 것 같아요.


이전 csv에 가장 말이 많은 사람 순서 랭킹을 새로운 열로 추가해줘 말이 많은 사람을 구분하는 기준은 '채팅 갯수'가 아니라, 'messege' 내용의 총 길이의 합산이야. 그리고 메시지 내용 총 길이의 합산 숫자도 새로운 열로 추가해줘. 표로 정리해주고, top 5명을 도넛차트로 그려줘. 메시지 글자수도 함께 표시해줘

제가.. 말이 많아보이죠? 많아요.. ㅋㅋㅋㅋㅋㅋ 왜냐면.. 모임장이라.. 살려야하거든요… ㅋㅋㅋ


이 파일을 보고 월별 가장 활발한 시간대를 시각화해줘

누가봐도 8월부터 대화가 급격히 줄었죠? 하하하 이전 모임장이 저에게 던져놓고 나간 시점과 맞물리네요 ㅋㅋㅋ 한 번 멤버가 다 바뀌면서 갑자기 조용해졌었던 기억이 납니다.

이걸 시각화해서 보니까 재밌었어요 ㅋㅋ


다혜, 강승우, 준석, 병옥 의 message_Total 열 값을 보고 문장이나 어휘다양성, 감정 등을 분석해줘


나머지는… 시간을 너무 많이 쓰고있어서…. 다음에 동일 데이터로 성격분석 감정분석 등을 진행해볼게요ㅜㅜ




8
4개의 답글

(채용) 유튜브 PD, 마케터, AI엔지니어, 디자이너

지피터스의 콘텐츠 플라이휠로 고속 성장할 팀원을 찾습니다!

👉 이 게시글도 읽어보세요