2020년 5월 5일 화요일

유닛(분석단위) 정제 (코드: 파이썬): 동일 메시지 중복 제거하기





CraledTexts.csv 존재할 있는 중복된 메세지를 제거한다.
효과: 광고, 상업적 알바 글, 프로그램이 자동으로 작성한 글 등 불필요한 메시지 제거

아이디어: 과부하와 속도를 위해 메세지 전체를 비교하지 않고
첫 몇 글자를 비교해 특정수 이상 같다면 같은 메세지로 치부하고 제거한다.


필요 파일: 수집한 텍스트파일 CraledTexts.csv

코드: 개발자 (JLab 한석훈)

def Delete_Overlapped_Messages(Raw_Message, number_of_overlapped):     # 인수로 Raw Message와  number_of_overlapped를 받습니다.
        import pandas as pd
        from tqdm import tqdm_notebook as bar                                    # tqdm은 반복작업을 할 때 작업이 얼마나 걸릴지 bar progress로 보여주는 패키지입니다.

        df = Raw_Message                                                                        # df라는 변수에 Raw Message를 저장해줍니다.
        df_sorted = df.sort_values(by="contents").reset_index(drop=True)    # df 를 "contents" 컬럼을 기준으로 정렬하고 index를 초기화 해줍니다.
        iterations = len(df_sorted)                                                                  # iteration은 tqdm의 범위를 설정하기 위해 df_sorted의 길이를 저장한 변수입니다.
        row_num = 0                                                                                      # 중복여부는 먼저 위아래 행의 앞 number_of_overlapped 만큼 비교해서 알아낸다.
        deleted_messages = 0                                                                        # 얼마나 지웠는지 알기 위해 deleted_messages 라는 변수를 선언한다.

        total = bar(range(iterations-1), desc = "deleting")                         # 0부터 (iteration-1)만큼 반복횟수를 설정해야 한다. (맨마지막 줄은 비교당하기만 하면 되니까)
        for i in total:
            step = i+1                                                                                         # step으로 반복횟수를 나타낸다.
            standard_row = df_sorted.get_value(row_num, "contents")             # row_num을 통헤 기준row를 설정하고 그 row의 "contents" 컬럼의 내용을 가져오고 standard_row라는 변수에 저장한다.
            under_row = df_sorted.get_value(row_num+1, "contents")              # 기준row 바로 아래의 row의 "contents" 컬럼의 내용을 가져오고 under_row라는 변수에 저장한다.
            if len(str(standard_row)) < number_of_overlapped:                        # 만약 기준 row의 길이가  number_of_overlapped 보다 작다면
                standard_row_words = standard_row                                                   # 비교할 문자열을 standard_row라는 변수에 저장했던 문자열 전부를 할당시킨다.
            else :                                                                                                # 그렇지 않다면
                standard_row_words = str(standard_row)[:number_of_overlapped]     # standard_row라는 변수에 저장했던 문자열에서 number_of_overlapped만큼만을 할당시킨다.
            if len(str(under_row)) < number_of_overlapped:                             # 위 과정은 under_row도 동일하게 한다. (이 부분을 반복문으로 만들거나 다른 방식으로 해서 길이를 줄일 수 있을 것 같다.)
                under_row_words = under_row
            else :
                under_row_words = str(under_row)[:number_of_overlapped]

            if standard_row_words == under_row_words:                                  # 만약 standard_row_words와 under_row_words의 길이가 같다면,
                df_sorted = df_sorted.drop(row_num+1,0).reset_index(drop=True)     # under_row를 drop하고 인데스를 초기화한다.
                row_num = row_num                                                                            # row_num은 그대로 가져간다. (새로운 under_row와도 비교해야 하니까)
                deleted_messages = deleted_messages + 1                                          # deleted_message의 수를 하나 증가시킨다.
            else :                                                                                                # 만약 standard_row_words와 under_row_words의 길이가 같지 않다면,                                
                row_num = row_num+1                                                                        # 기준 줄을 다음 row로 넘기기 위해 row_num을 1 증가시켜준다.

        output_df = df_sorted.sort_values(by="date").reset_index(drop=True)     # 최종적으로 정제된 데이터프레임인 df_sorted를 다시 date에 맞춰 정렬하고, 인덱스를 초기화해 output_df에 저장한다.
        display(output_df.head())                                                                          # 산출물을 한번 보여주고
        print(str(deleted_messages)+" messages are deleted.")                            # 몇개가 지워졌는지 확인하도록 삭제한 메세지 수를 프린트하며

        return output_df                                                                                        # 산출물을 리턴한다.

Share this post: