2020년 5월 5일 화요일

유닛(분석단위) 표준화 (코드: 파이썬): 표현 바꾸기




목적: 단어 표준화 (Normalization: Lemmatization의 상위 개념)

같은 단어를 다른 형태로 쓰기 때문에, 이를 가능한한 단일 표현으로 통일(표준화) 해야 한다. 이를 normalization라고 일컫는다. 이미 koNLPY의 여러 메소드(Okt, Mecab 등)에서 형태소 바탕으로 어근을 추출하여, 사용하는 경우가 많은데, 우리는 가급적 독자적인 Dicitionary를 구축하여 단어 표준화에 사용한다. 

자체 표준화 방법을 구축하는 이유는, 
첫번째 이유는, 비즈니스 관점에 맞는 표준화 작업을 위해서이며,
둘째로는, 기존 형태소 분석만을 기반으로 표제화를 하는 경우, 동사, 형용사의 경우에는 어근이 아니라 어간을 추출하는 것이 더 효과적이고 효율적이다. 
또한, 해외 다양한 언어를 처리할 경우각국 문법이나 함수를 이용한 다른 형태소 분석을 적용하게 됨으로, 국가간 비교에 많은 어려움이 발생한다. 

Replace_Texts_in_Messages 
텍스트 중 정규화되지 않은 단어들을 자체적으로 정한 기준 단어(Standard word)로 대체해주는 작업

필요한 파일: ProjectLibrary.csv (JLab miner library 파일)
               텍스트파일 (파일명은 위 JLab miner library, Replace_Texts_in_Messages에 명시)
             
코드: (개발

import pandas as pd
import os

try:
    Lib = pd.read_csv("ProjectLibrary.csv")
    Dic = pd.read_csv("(R)Project Dictionary(표준형).csv")
except UnicodeDecodeError:
    Lib = pd.read_csv("ProjectLibrary.csv", encoding = "cp949")
    Dic = pd.read_csv("(R)Project Dictionary(표준형).csv", encoding = "cp949").fillna("")
           
files_in_folder = list(os.listdir(str(os.getcwd())))
DOM_Message_pickle = list(filter(lambda x : "DOM.pickle" in x, files_in_folder))
with open(DOM_Message_pickle[0],"rb") as fr:
    DOM_Message = pickle.load(fr)       #텍스트파일 불러오기
   
Dic_tag_list = list(Dic.tag)
replaced_messages_DataFrame = pd.DataFrame(columns = DOM_Message.columns)

def replace_texts_by_row(item):
    replaced_message_row = " ".join(list(map(
                                    lambda x: x if x not in Dic_tag_list else (
                                        lambda x: list(Dic.loc[Dic["tag"]==x, "Replace_Texts"])[0] if list(Dic.loc[Dic["tag"]==x, "Replace_Texts"])[0] != "" else x )(x), item.split(" "))))
    replaced_messages_DataFrame.loc[len(replaced_messages_DataFrame)] = list(DOM_Message.loc[DOM_Message["contents"]==item, "date"])[0], replaced_message_row
DOM_Message.contents.apply(replace_texts_by_row)

subject = list(Lib.loc[Lib["*함수명/ parameter이름"] == "*Replace_Texts_in_Messages", "Output file"])[0].split("_")[1].split("(")[0]
with open(subject+"_RM.pickle", "wb") as fw:
    pickle.dump(replaced_messages_DataFrame, fw)
replaced_messages_DataFrame.to_csv(list(Lib.loc[Lib["*함수명/ parameter이름"] == "*Replace_Texts_in_Messages", "Output file"])[0],
                                   encoding = "cp949", index = False)


Share this post: