반응형

2020/01/11 - [Python 3/Natural Language Processing] - [python/NLP]웹 크롤링(crawling) 심화 - Riss 논문 검색 데이터를 csv파일로 저장하기

 

[python/NLP]웹 크롤링(crawling) 심화 - Riss 논문 검색 데이터를 csv파일로 저장하기

[Python]자연어 처리를 위한 데이터 수집 웹 크롤링-2(crawling-2) list/str 자료형의 특징 및 re(정규화) 2020/01/05 - [Python 3/Natural Language Processing] - 크롤링(crawling) 크롤링(crawling) NLP를 위해..

leo-bb.tistory.com

여태까지 다양한 사이트의 메타 데이터 중 필요한 데이터만 얻어오는 크롤링 과정을 거쳤습니다. 앞으로는 데이터를 가지고 노는 다양한 방법들을 소개합니다.

https://okky.kr/는 개발자들을 위한 무료 사이트입니다. 각종 언어에 대한 다양한 정보부터 업계의 이야기를 알아볼 수 있습니다. 오늘은 OKKY의 QnA 게시판에서 지금 보고 있는 게시물과 가장 유사한 게시물을 찾아 추천해주는 시스템을 만들어 보도록 하겠습니다. 

 

사전에 okky QnA게시판에서 tag = label[1 : c , 2 : c++, 3 : java, 4 : javascript, 5 : python]에 해당하는 질문 데이터 약 3000개를 수집해두었습니다. 

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
from konlpy.tag import Okt
from konlpy.tag import Mecab
import pandas as pd
import tensorflow as tf
import os
import getpass
import numpy as np
from numpy import dot
from numpy.linalg import norm
import mat

#dataframe에 null값이 있는 경우 공백을 넣어 null값 제거
def avoid_null(data, header):
    data[header] = data[header].fillna('')
    return data[header]

필요한 라이브러리를 넣어줍니다. avoid_null은 dataframe이나 series에서 null값이 발생하는 현상을 막기위함입니다. 여기서는 null을 공백으로 대체합니다.

#tfidf값을 이용해 코사인유사도를 계산하기 위한 함수
def cos_sim(A, B):
    return dot(A, B)/(norm(A)*norm(B))
    
#입력받은 dataframe의 title열의 값을 가져와 tfidf를 계산해주는 함수
#입력되는 dataframe의 header에 반드시 title이 포함되어야 함!
def tfidf(dataframe, TfidfVectorizer):
    #title데이터의 내용을 null 없이 가져옴
    dataframe['title'] = avoid_null(dataframe, 'title')

    #tf-idf계산 후 출력
    tfidf_metrix_of_tit = TfidfVectorizer.fit_transform(dataframe['title'])
    return tfidf_metrix_of_tit

cos_sim함수는 코사인 유사도를 계산하기 위한 함수로 우리는 tf-idf 값을 이용하기 때문에 별도의 처리없이 바로 유사도를 계산할 수 있습니다.

tfidf 함수가 오늘의 메인입니다. 여기서 tf-idf는 Term Frequency - Inverse Document Frequency라고 하여 여러 문서로 이루어진 문서군에서 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지를 나타내는 통계적 수치입니다.(wiki백과)

여기서 Tf는 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값이고, Df는 단어가 문서군에서 자주 등장하는지를 나타낸 값으로 idf는 이 값의 역수입니다.

scikit-learn 라이브러리에서는 이러한 tf-idf값을 쉽게 계산할 수 있는 모듈을 제공하여줍니다.

#입력되는 train의 질문과 질문 데이터셋의 코사인유사도 값 중 상위 50개 질문목록을 가져오는 함수
def top10_indices(data, q_num):
    #입력된 데이터의 코사인유사도 계산
    cos_sim = linear_kernel(data, data)

    cos_sim_score = list(enumerate(cos_sim[q_num])) 
    cos_sim_score = sorted(cos_sim_score, key = lambda x : x[1], reverse = True)
    #상위 100개 항목을 가져옴
    score = cos_sim_score[1:11]
    tag_indices = [i[0] for i in score]

    return tag_indices

top 10 indices 함수는 입력된 data set(게시글 모음) 중 내가 현재 보고 있는 게시글(q_num)에 가장 유사한 10개의 게시글을 보여줍니다.

 

Main 함수는 아래와 같습니다.

with tf.device('/gpu:1'):
    okky_data = pd.read_csv(r'게시물 데이터.csv', encoding = "utf-8", low_memory = False)
    
    tfidf_gen = TfidfVectorizer() #일반적인 방식

    #ti-idf를 계산하여 title과 content 열의 값을 각각 받아옴
    data_tit = tfidf(okky_data, tfidf_gen) 

    for i in range(len(okky_data)):
        print(i, '/', len(okky_data))
        #질문 제목과 데이터셋의 유사도를 10위까지 가져옴
        tit_10_q = okky_data['title'].iloc[top100_indices(data_tit, i)]
        print(str(i),"번 질문과 유사한 제목을 가진 질문목록\n", tit_10_q) 
        

okky_Data의 5개 질문 항목의 제목입니다. 여기서 0번 'c언어 매크로 이용 2차원 배열 질문' 이라는 질문과 유사한 다른 10개의 게시물의 결과는 아래와 같습니다.

10개의 게시물 모두 c언어, 배열, 매크로 등 키워드와 관련된 질문만 존재하는 것을 볼 수 있습니다. 하지만 정확히 현재 주제에만 관련된 데이터를 얻기에는 오차가 있어보입니다. 이러한 이유로 한국어 자연어 처리, 특히 일상어/구어와 관련된 경우 stemming과 stopword pros. 같은 전처리 과정이 반드시 필요합니다.

2020/01/05 - [Python 3/Natural Language Processing] - [Python]자연어 처리를 위한 불용어 제거방법(stopword processing)

 

[Python]자연어 처리를 위한 불용어 제거방법(stopword processing)

불용어란 자주 등장하지만 데이터를 분석하는데 있어 큰 의미는 갖지 않는 단어들을 뜻합니다. 이러한 불용어가 데이터에 다수 포함되어 있으면 NLP의 효율 감소, 처리시간 증가 등 악영향이 있습니다. 자주 등장..

leo-bb.tistory.com


오늘 게시물을 응용하여 다양한 처리를 실습해보세요!

예를 들어 아래 그림과 같이 내가 쓴 게시글기존에 게시되어있는 질문이 얼마나 유사한지 판단하여 자동적으로 질문태그를 만들어주는 서비스를 만들어 볼 수 도 있습니다. 

신규 작성한 게시물과 기존 게시물의 제목과 본문을 비교하여 사용자에게 적절한 태그를 추천

 

https://github.com/Leo-bb/natural-language-processing

 

Leo-bb/natural-language-processing

Contribute to Leo-bb/natural-language-processing development by creating an account on GitHub.

github.com

 

반응형
복사했습니다!