본문 바로가기
공허의 유산/마음의 거울

[오픈채팅의 재해석] 04. 형태소 분석기 비교 및 결론

by 바른생활머시마 2023. 10. 3.
728x90
반응형

komoran과 mecab의 결과를 비교해 봤더니, 빈 행은 저장이 되지 않는지, 결과 길이가 달라서 대응되는 행을 서로 비교 해 볼 수가 없겠군요.

import pandas as pd

list_komoran = pd.read_pickle('./KakaoOpenChat/nouns_komoran_with_preprocess.pkl')
list_mecab = pd.read_pickle('./KakaoOpenChat/nouns_mecab_with_preprocess.pkl')

print(len(list_komoran))
print(len(list_mecab))

그럼 내보낼 때부터, 합해서 내보내야겠네요.

from konlpy.tag import Komoran, Kkma
import pickle
import time
from eunjeon import Mecab
import re


def text_clean(text):
    pattern = '([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)' # E-mail제거
    text = re.sub(pattern, '', text)
    pattern = '(http|ftp|https)://(?:[-\w.]|(?:%[\da-fA-F]{2}))+' # URL제거
    text = re.sub(pattern, '', text)
    pattern = '[a-zA-Z0-9]'    # 숫자와 알파벳 제거
    text = re.sub(pattern, '', text)
    pattern = '([ㄱ-ㅎㅏ-ㅣ]+)'  # 한글 자음, 모음 제거
    text = re.sub(pattern, '', text)
    pattern = '<[^>]*>'         # HTML 태그 제거
    text = re.sub(pattern, '', text)
    pattern = '[^\w\s]'         # 특수기호제거
    text = re.sub(pattern, '', text)
    return text 


mecab = Mecab()
komoran = Komoran()
#kkma = Kkma()

all_nouns = []

start_time = time.time()

# 소스 파일 읽기
src_doc_path = './KakaoOpenChat/dialog_only_filtered.text'
src_doc = open(src_doc_path, 'r', encoding='utf-8')
for line in src_doc.readlines():
  line = line.strip()
  try:
    line = text_clean(line)

    komoran_nouns = komoran.nouns(line)
    #nouns = kkma.nouns(line)
    mecab_nouns = mecab.nouns(line)
    merged_row = [line, komoran_nouns, mecab_nouns]

    all_nouns.append(merged_row)
    print(merged_row)  
  except:
    print("ERROR>"+line)

src_doc.close()
end_time = time.time()

#with open('./KakaoOpenChat/nouns_kkma_with_preprocess.pkl', 'wb') as f:
#with open('./KakaoOpenChat/nouns_komoran_with_preprocess.pkl', 'wb') as f:
#with open('./KakaoOpenChat/nouns_mecab_with_preprocess.pkl', 'wb') as f:
with open('./KakaoOpenChat/nouns_mecab_with_preprocess.pkl', 'wb') as f:
    pickle.dump(all_nouns, f)

print("Elapsed time - "+str(end_time - start_time))

 

아무래도 쉽게 비교 해 보려면 엑셀에서 보는 것이 좋을 것 같아서, 합쳐진 리스트를 pandas의 DataFrame으로 만들어 엑셀로 저장합니다.(openpyxl 설치 필요)

from konlpy.tag import Komoran, Kkma
import pickle
import time
from eunjeon import Mecab
import re
import pandas as pd

def text_clean(text):
    pattern = '([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)' # E-mail제거
    text = re.sub(pattern, '', text)
    pattern = '(http|ftp|https)://(?:[-\w.]|(?:%[\da-fA-F]{2}))+' # URL제거
    text = re.sub(pattern, '', text)
    pattern = '[a-zA-Z0-9]'    # 숫자와 알파벳 제거
    text = re.sub(pattern, '', text)
    pattern = '([ㄱ-ㅎㅏ-ㅣ]+)'  # 한글 자음, 모음 제거
    text = re.sub(pattern, '', text)
    pattern = '<[^>]*>'         # HTML 태그 제거
    text = re.sub(pattern, '', text)
    pattern = '[^\w\s]'         # 특수기호제거
    text = re.sub(pattern, '', text)
    return text 


mecab = Mecab()
komoran = Komoran()
#kkma = Kkma()

all_nouns = []

start_time = time.time()

# 소스 파일 읽기
src_doc_path = './KakaoOpenChat/dialog_only_filtered.text'
src_doc = open(src_doc_path, 'r', encoding='utf-8')
for line in src_doc.readlines():
  line = line.strip()
  try:
    line = text_clean(line)

    komoran_nouns = komoran.nouns(line)
    #nouns = kkma.nouns(line)
    mecab_nouns = mecab.nouns(line)
    merged_row = [line, komoran_nouns, mecab_nouns]

    all_nouns.append(merged_row)
    print(merged_row)  
  except:
    print("ERROR>"+line)

src_doc.close()
end_time = time.time()

#with open('./KakaoOpenChat/nouns_kkma_with_preprocess.pkl', 'wb') as f:
#with open('./KakaoOpenChat/nouns_komoran_with_preprocess.pkl', 'wb') as f:
#with open('./KakaoOpenChat/nouns_mecab_with_preprocess.pkl', 'wb') as f:
#with open('./KakaoOpenChat/nouns_mecab_with_preprocess.pkl', 'wb') as f:
#    pickle.dump(all_nouns, f)

frame = pd.DataFrame(all_nouns)
frame.to_excel('./KakaoOpenChat/nouns_compare.xlsx')

print("Elapsed time - "+str(end_time - start_time))

 

엑셀로 만들어 비교를 해 보려고 했더니...아...염려했던 문제가 여기서도 보이네요. 검출 된 형태소만으로는 무슨 의미를 파악하기가 매우 힘든 것 같아요.

 

혹시 전체 빈도를 보면 뭐가 보일까 싶어 각 분석기로 분석 된 결과로 Word cloud를 만들어 보니, 오히려 형태소 분석으로 알아 낼 수 있는 것이 별로 없다는 것을 명확히 알 수 있네요.

mecab 분석 결과
komoran 분석 결과

 

결론

 청소년들이 오픈채팅방에서 사용하는 언어는 구어체의 특성이 매우 강하고, 표준어로 해석이 어려우며 신조어나 또래들끼리 사용하는 용어가 있다보니, 표준어를 바탕으로 분석을 하는 형태소 분석으로는 유의미한 결론을 도출하기는 어려운 것 같습니다. 청소년 구어체에 맞는 사용자 정의 사전이나, 분석하고자 하는 내용, '위로' 프로젝트의 경우, 청소년 고민 이슈를 도출 할 만한 주요 키워드의 사용자 정의 사전이 필요할 것 같습니다. 또한, 단어 수준이 아니라 연속 된 문장들 속에서 정의 되는 문맥적인 상황을 도출해야 하는 것이 아닌가 싶네요.

 

역시, 누군가를 진심으로 돕는 것은 심심풀이 땅콩을 먹듯 간단한 것이 아닌 것 같네요. 누군가를 돕고자 하는 마음이, 어쩌면 자기 자신의 만족이 더 우선이 아닌지 한번 생각 해 볼 필요가 있을 것 같다는 숙제를 가지고 이번 분석을 마칩니다.

 

nouns_compare.xlsx
3.11MB

728x90
반응형

댓글