기능: 수집된 메시지 중 동일한 메시지들 제거
방식: *Delete_Overlapped_Messages 메세지 첫 글자 부터 20개 글자가 동일한 메시지들은 모두 삭제
효과: 중복 문자를 제거하는 이유
동일 메시지가 반복되어 여러곳에 게시되는 경우, 대부분 이 메시지드은 다음 3가지일 가능성이 매우 높다.
유형 1: 기업의 상업용 광고 유형 2: 소비자의 순수한 댓글이 아닌 다른 목적에 의해 만들어진 댓글 (알바생의 댓글 작업 등)
유형 3: 트위터 리트윗 처럼 처음 작성자의 글을 다른 사람들이 다른 곳에 재게재하는 경우
위 3가지 유형의 경우, 중복 메시지를 제거하지 않을 경우 다수의 의견이 아닌 소수의 의견 또는 순수하지 않은 상업적 의견일 가능성이 높기에 JLab Miner의 경우 제거를 하고 있다.
과부하를 줄이고, 처리 속도 향상을 위해 메세지 전체를 비교하지 않고, 대신 메시지 처음부터 지정한 글자수 (default: 10)만큼을 비교해 이 부분이 같다면 같은 메세지로 판정하고 더이상 비교 없이 해당 메시지를 제거한다.
주의: 비교 글자수를 너무 적게 하면 다른 메시지를 동일 메시지로 처리, 삭제할 가능성이 높아지므로 적정 비교 글자수를 정할 필요가 있다.
#석훈아 이 부분 작성 바란다.
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 # 산출물을 리턴한다.