transforming, for example, *      verb forms into the base form

plural nouns into the singular form

It reduces to the same lemma "speak" inflected forms such as "speaks" and "speaking"

Untitled

Lemmatize한 후, 분해된 token을 다시 한 문장으로 만들어주는 코드 _ 1안 (21-05-30)

import pandas as pd username = "" prname = "" import os from tqdm import tqdm from utils import Read_Arg_, Read_Sheet_, import_dataframe, export_dataframe tqdm.pandas() #input_directory = "/".join([username, prname])  # Non-창민버전 ref, input_, output_ = Read_Arg_(username,prname,"Replace_Texts_in_Messages")  # Read_Arg를 통해 참조파일, input파일, output파일을 불러옵니다. # 이 때 ref는 "JDic_Lemmatization(일반lemma사전)"시트를, # input파일은 메세지 csv파일의 이름, # output은 처리 후 내보낼 메세지 csv파일의 이름입니다. # lemma라는 변수에 reference 시트를 불러오기 lemma = Read_Sheet_(username,prname,ref)  # lemma라는 변수에 Read_Sheet를 통해 # "JDic_Lemmatization(일반lemma사전)"시트를 불러옵니다. lemma = lemma.fillna("").to_numpy(dtype=list) all_V = list(map(lambda x: [i for i in x if i != ""], lemma))  # all_V라는 변수에 lemma에 있는 데이터들을 전부 가져옵니다. # 이 때 all_V의 형태는 다음과 같습니다. # [[기준단어 a, 변형단어 a-1, 변형단어 a-2,... ], #  [기준단어 b, 변형단어 b-1, 변형단어 b-2,... ], #  ... ] # lemee에는 lemmatize될 token을, lemer에서는 기준 token을 추가해준다. # lemee와 lemerfmf 열로 갖는 DataFrame을 lemm이라는 변수에 담아둔다. lemee = [] lemer = [] for case in all_V:     standardised = case[0]     for keyword in case[1:]:         lemee.append(keyword)         lemer.append(standardised) lemm = pd.DataFrame({"raw":lemee, "lem":lemer}) # 원문데이터를 불러와 DataFrame형식으로 input_Message리는 변수에 담는다. input_name = os.path.join(input_) input_Message = import_dataframe(input_name) # 원문 데이터로부터  line넘버, token넘버, token을 추출해 # line_no, token_no, token 을 열로 갖는 DataFrame을 text_decomposition이라는 의미의 text_decomp 변수에 저장한다. line_no = [] token_no = [] token = [] for lines in enumerate(input_Message["contents"]):     for tokens in enumerate(lines[1].split()):         line_no.append(lines[0])         token_no.append(tokens[0])         token.append(tokens[1]) text_decomp = pd.DataFrame({"line_no":line_no, "token_no":token_no, "token":token}) # text_decomp 테이블 기준테이블로 설정하고  text_decomp의 "token"열과  lemm테이블의 "raw" 열을 "left join" 하고, #  중복열인 "raw"열을 제거한 후, "lem"열에 빈 부분을 같은 행의 "token"열의 값들로 채워준다. res = pd.merge(text_decomp,lemm, left_on = ["token"], right_on = ["raw"], how = "left").drop(["raw"], axis = 1) res["lem"] = res["lem"].fillna(res["token"]) # 중간에 res가 어떻게 나오는지, 바뀐 부분이 어떻게 바뀌었는지 확인하는 코드 두 줄 print(res.head(30)) print(res[res["token"]!=res["lem"]].head(30)) # lemmatize된 문장으로 뭉쳐주는 코드 # new_lines라는 빈 리스트를 생성한다. new_lines = [] # res의 line_no열에 있는 값들을 unique하게 불러온 후, 이들을 기준으로 순서대로 다음과 같은 실행을 거친다. #     res의 "line_no"가  i번째인 부분을 가져온 후, "token_no"를 기준으로 오름차순으로 정렬한 후 그 순서대로 "lem"열에 있는 token들을 정렬한다. #     정렬된 token 사이를 띄어쓰기로 채워 넣어 한 문장으로 만들어 new_line이라는 변수에 저장한다. #     new_lines리스트에 new_line을 추가한다. for i in res["line_no"].unique():     new_line = " ".join(res[res["line_no"]==i].sort_values(by="token_no", ascending = True)["lem"])     new_lines.append(new_line) # 최종적으로 누적된 new_lines를 input_Message의 "contents"열에 넣어 갱신해준다. input_Message["contents"] = new_lines # 잘 됐는지 확인해보자. print(input_Message)

#qq 이 코드 최종버전인가 수정을 아직 못한 상태인가 이 때의 심각한 문제. 토큰화된 아이들을 다시 뭉치는 작업시 시간이 너어엉어어어어어어어어어엉어어어어무 오래걸린다.

(증거자료 첨부드립니다.)

코드

표준화 표제어작업 Replace_Texts_in_Messages (Lemmatization)

테스트 데이터 셋 실행 결과