(데이터분석 끝까지 진행해보고자 하였으나ㅜㅜ 너무 시간을 많이 쓰고 있어서 여기까지만 업로드하고.. 추후에 또 갖고 놀아보겠습니다.. 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 열 값을 보고 문장이나 어휘다양성, 감정 등을 분석해줘
나머지는… 시간을 너무 많이 쓰고있어서…. 다음에 동일 데이터로 성격분석 감정분석 등을 진행해볼게요ㅜㅜ