먼저 저장된 txt 파일은 아래처럼 구성된다.

내보내기 된 카카오톡 오픈 채팅방.txt 내용 1
내보내기 된 카카오톡 오픈 채팅방.txt 내용 2

위 설명에 맞춘 정제 포인트는 아래와 같다.

  • 기본 헤더 제거
  • 일별 구분
  • 첫 입장 메시지 제거
  • 작성자/기준시간/작성 메시지 분리하기
  • 입장, 퇴장 확인하기

 

1. 정제 전 채팅 내용 데이터(.txt) 읽기

input_file_name = 'kakao_chat.txt'  # 텍스트 데이터 경로/이름 입력
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    for line in input_file:
        line = line.strip()
        print(line)
데이터분석 QnA&네트워킹 님과 카카오톡 대화
저장한 날짜 : 2020-11-14 14:56:45

--------------- 2020년 11월 1일 일요일 ---------------
hk님이 들어왔습니다.운영정책을 위반한 메시지로 신고 접수 시 카카오톡 이용에 제한이 있을 수 있습니다.
[팬다 Jr.] [오전 10:27] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분
포도님이 들어왔습니다.
[팬다 Jr.] [오전 11:16] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분
[포도] [오전 11:16] 안녕하세요!
모모님이 들어왔습니다.

위 블록은 코드와 결과 일부 담고 있다. 그다음에 우선적으로 해야 하는 것은 기본 헤더 제거와 일자별 내용을 묶는 것이다.

2. 기본 헤더 제외한 일자별 내용 리스트로 담기

date_sep = '일 ---------------'
context_list, tmp_context_list = [], []
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    index = 0
    for line in input_file:
        line = line.strip()
        start_index = 4
        if index == start_index:
            tmp_context_list.append(line)
        else:
            if line.endswith(date_sep):
                context_list.append(tmp_context_list)
                tmp_context_list = []
            tmp_context_list.append(line)
        index += 1
print("주어진 텍스트 파일 {}의 일자별 context는 {}건입니다.".format(input_file_name, len(context_list)))
주어진 텍스트 파일 kakao_chat.txt의 일자별 context는 11건입니다.

context_list의 내용은 아래와 같다. (일부)

[['데이터분석 QnA&네트워킹 님과 카카오톡 대화', '저장한 날짜 : 2020-11-14 14:56:45', ''],
 ['--------------- 2020년 11월 1일 일요일 ---------------',
  'hk님이 들어왔습니다.운영정책을 위반한 메시지로 신고 접수 시 카카오톡 이용에 제한이 있을 수 있습니다.',
  '[팬다 Jr.] [오전 10:27] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분',
  '포도님이 들어왔습니다.',
  '[팬다 Jr.] [오전 11:16] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분',
  '[포도] [오전 11:16] 안녕하세요!', (중략)

1번에 비해 다소 어려워진 것 같지만 때에 따라 어려워졌을 수도 있다... ㄴㅇㄱ

전반적인 코드 아래처럼 구성되어 있다.

  • 전체 내용을 담을 리스트, 일자별 내용을 담을 리스트 (각 context_list, tmp_context_list)
  • 일자별 구분을 위해 사용되는 date_sep과 .endwith()
  • 파일을 한 줄씩 읽는 for문, 그 한 줄에 대한 index

기본 헤더는 index 값이 0 ~ 3에 해당하므로 기준인을 index가 4로 시작된다. 그런데 기준일이 계속 늘어나기 때문에 기준일의 패턴인 [일 ---------------]을 활용하여 기준일 별 발생한 채팅 내용을 묶어줘야 한다. 그런데 첫 입장 메시지가 거슬리니 다음에서 첫 입장 메시지를 제거해본다. (단, 텍스트에 없는 경우가 있을 수 있다. 따라서 이 경우 다음을 넘어가도 된다.)

 3. 첫 입장 메시지 제거하기

if ~ continue를 활용하여 첫 입장 메시지, 즉 본문에 pass_msg에 해당하면 넘어가도록 한다.
(pass와는 달리 continue는 if ~ continue 이후 코드를 실행하지 않게 해 준다.)

 

date_sep = '일 ---------------'
pass_msg = '운영정책을 위반한 메시지로 신고 접수 시 카카오톡 이용에 제한이 있을 수 있습니다'
context_list, tmp_contenxt_list = [], []
with open(input_file_name, "r", encoding="utf-8-sig") as input_file:
    index = 0
    for line in input_file:
        line = line.strip()
        # 새로 추가한 부분 시작
        if pass_msg in line:
          continue 
        # 새로 추가한 부분 끝
        start_index = 4
        if index == start_index:
            tmp_contenxt_list.append(line)
        else:
            if line.endswith(date_sep):
                context_list.append(tmp_contenxt_list)
                tmp_contenxt_list = []
            tmp_contenxt_list.append(line)
        index += 1
print("주어진 텍스트 파일 {}의 일자별 context는 {}건입니다.".format(input_file_name, len(context_list)))
[['데이터분석 QnA&네트워킹 님과 카카오톡 대화', '저장한 날짜 : 2020-11-14 14:56:45', ''],
 ['--------------- 2020년 11월 1일 일요일 ---------------',
  '[팬다 Jr.] [오전 10:27] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분',
  '포도님이 들어왔습니다.',
  '[팬다 Jr.] [오전 11:16] 안녕하세요, 반갑습니다. 데분방입니다. 데분데분',
  '[포도] [오전 11:16] 안녕하세요!', (중략)

 

어느 정도 구조화 가능한 데이터를 확보했으므로 이제 본격적으로 다음 편에서 pandas를 활용해 데이터 정제 과정을 공유하고자 한다.

+ Recent posts