본문 바로가기
기타

카카오톡 대화 내용 빈도 분석2

by 볼록티 2019. 12. 26.
728x90
반응형

지난번에 카톡 대화 내용에서 명사랑 술어만 뽑아서 빈도분석해서 나열했는데, 이번에는 그러한 단어들을 임베딩해서 단어간의 유사도를 측정해보도록 한다.

 

사용할 기법은 워드투벡이고 2차원 그래프로 도식화하는 것 까지만 할 예정이다. word2vec같은 경우는 파라메타 값을 달리주면 결과도 살짝씩 다르게 나오기 때문에 원하는(?) 보기좋은 결과를 얻기 위해 몇번 반복할 것을 추천한다. 

 

함수가 아닌 코드로 해도 오래 안걸려서 그냥 생코드로 올렸다.

 

 

먼저 지난번과 같은 데이터를 쓸거기 때문에 지난번 함수에서 전처리하고 2자리 이상되는 단어를 추출한 그 시점부터 시작했다.

아래의 코드를 실행하면 데이터를 얻을 수 있다.

def conversation(path, file):
    
    # 모듈
    import os
    import re
    from ckonlpy.tag import Twitter

    
    # 현재 경로 설정
    os.chdir(path) 


    # 파일 불러오기
    kakao=[]
    with open(file, "r", encoding='utf-8') as f:
        for i in f.readlines():
            kakao.append(i)

            
    # 추가하고 싶은 단어를 추가하는 곳.

	twitter=Twitter() # Twitter 생성자 호출
	twitter.add_dictionary('학식', 'Noun') #예시
	twitter.add_dictionary(['학식','학생식당'], 'Noun') #예시




    # 형태소 추출 및 전처리

	kakao_morphs=[]
	for i in kakao:
	    i = re.sub("[0-9]"," ",i)
	    i = re.sub("[\n:~]"," ",i)
	    i = re.sub("[년{1}월{1}일{1}]"," ",i)
	    i = re.sub("[^가-힣]"," ",i)
	    i = re.sub("[ㄱ-ㅎ]"," ",i)
	    i = re.sub("[오전]"," ",i)
	    i = re.sub("[이모티콘]"," ",i)
	    tmp = [list(w)[0] for w in twitter.pos(i) if ((list(w)[1] in ['Noun','Verb'])&(len(list(w)[0])>1))]
    	if len(tmp)==0:
        	continue
    	kakao_morphs.append(tmp)
	return kakao_morphs

 

 

모듈불러오기

from sklearn.decomposition import PCA
from gensim.models import Word2Vec
import matplotlib.pyplot as plt

 

위의 함수를 통해 분석용 데이터를 받는다.

 kakao_morphs = conversation(path, file)

 

임베딩 차원은 300으로 주고, 미니멈 카운트를 110으로 했는데, 이는 나중에 그래프에 띄울 때 너무 많이 나오면 가시성이 떨어지기 때문이다. worker는 코어 개수다. 필자는 110이 가장 가시성이 좋아서 110으로 한다.

추후에 그래프 가시성 확보를 위해서 min_count를 뭐 적당히 바꿔줘가면서 봐도 된다.

model=Word2Vec(kakao_morphs, size=300, window=3, min_count=110, workers=2)

word_vectors = model.wv



vocabs = word_vectors.vocab.keys()
word_vectors_list = [word_vectors[v] for v in vocabs]

 

특정 두 단어 간의 유사도 보기. 

단 기법 특성상 없는 단어에 대해서는 유사도를 측정할 수 없으니 단어장에 있는 단어들로 해야한다.

print(word_vectors.similarity(w1='미안', w2='사랑'))

 

 

차원 축소를 위한 PCA 작업을 진행한다.

pca = PCA(n_components=2)
xys = pca.fit_transform(word_vectors_list)
xs = xys[:,0]
ys = xys[:,1]


 

이제 2차원 그래프에 띄우기 위한 옵션 함수를 만들고, 그래프에 띄워준다.

def plot_2d_graph(vocabs, xs,ys):
    plt.figure(figsize=(8,6))
    plt.scatter(xs, ys, marker = 'o')
    for i, v in enumerate(vocabs):
        plt.annotate(v, xy=(xs[i], ys[i]))
        
plot_2d_graph(vocabs, xs,ys)

 

만약 한글 깨짐 현상이 일어나면 아래의 코드를 참조한다.

from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)

 

 

아래와 같은 결과를 얻었다. 연인과의 대화창이라는 것을 대강 알 수 있다. 

 

 

연말에 즐거운 시간 보냅시다 !

 

 

 

reference: https://m.blog.naver.com/Recommendation.nhn

728x90
반응형

'기타' 카테고리의 다른 글

줌인터넷 투자 콘텐츠 서비스  (0) 2022.05.24
텐서플로우 설치  (0) 2020.04.20
카카오톡 대화 내용 빈도 추출  (0) 2019.12.26

댓글