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를 만들어 보니, 오히려 형태소 분석으로 알아 낼 수 있는 것이 별로 없다는 것을 명확히 알 수 있네요.
결론
청소년들이 오픈채팅방에서 사용하는 언어는 구어체의 특성이 매우 강하고, 표준어로 해석이 어려우며 신조어나 또래들끼리 사용하는 용어가 있다보니, 표준어를 바탕으로 분석을 하는 형태소 분석으로는 유의미한 결론을 도출하기는 어려운 것 같습니다. 청소년 구어체에 맞는 사용자 정의 사전이나, 분석하고자 하는 내용, '위로' 프로젝트의 경우, 청소년 고민 이슈를 도출 할 만한 주요 키워드의 사용자 정의 사전이 필요할 것 같습니다. 또한, 단어 수준이 아니라 연속 된 문장들 속에서 정의 되는 문맥적인 상황을 도출해야 하는 것이 아닌가 싶네요.
역시, 누군가를 진심으로 돕는 것은 심심풀이 땅콩을 먹듯 간단한 것이 아닌 것 같네요. 누군가를 돕고자 하는 마음이, 어쩌면 자기 자신의 만족이 더 우선이 아닌지 한번 생각 해 볼 필요가 있을 것 같다는 숙제를 가지고 이번 분석을 마칩니다.
'공허의 유산 > 마음의 거울' 카테고리의 다른 글
[오픈채팅의 재해석] 03. 핵심어 검출을 위한 명사 검출(2) (1) | 2023.10.03 |
---|---|
[오픈채팅의 재해석] 03. 핵심어 검출을 위한 명사 검출 (0) | 2023.09.30 |
[오픈채팅의 재해석] 02. 오픈채팅 데이터 전처리 (0) | 2023.09.29 |
[오픈채팅의 재해석] 01. 카카오톡 오픈채팅 대화 분석 배경 (1) | 2023.09.28 |
댓글