AI 25

[4] 포털 댓글 감성 분석_1. 순환신경망_2. 모델링 및 예측

앞 단에 이어 모델링을 진행한다. 긍정, 중립, 부정의 3 class로 각각의 텍스트를 분류하는 작업을 수행한다. RNN과 LSTM의 성능 차이를 보기 위해 초기에 RNN, LSTM 모델을 설계했으며, 시행착오를 통해 여러 층으로 구성된 LSTM, GRU 모델을 구성했다. 본격적으로 파라미터, 층을 조정한 것은 여러 층으로 구성된 LSTM, GRU 모델에 한정하였다. 그리고 20200418 현재, 가장 좋은 정확도를 보인 모델은 양방향 LSTM 층을 적용한 모델이다. 테스트 셋에 대한 정확도는 0.9056이다. 이 모델을 통해 포털 댓글에 대한 감성 분석 분류 작업을 수행한다. # 공통 사항 임베딩 : Keras의 Embedding 레이어 사용. 100차원 임베딩. 옵티마이저 : adam. loss 측정..

[4] 포털 댓글 감성 분석_1. 순환신경망_1. 사전 작업

앞 단에서 감성어 사전(0417 현재 기준 ver3), 긍/부정 라벨링된 커뮤니티 게시글 및 댓글 데이터셋을 구축했다. 감성분석 모델링을 수행할 준비를 마쳤다. 이제 네이버, 다음, 유튜브 등 포털에서 수집한 180만 건의 댓글 데이터를 대상으로 감성분석을 수행한다. 우선 자연어 처리에 많이 활용되는 딥러닝의 순환신경망 알고리즘을 사용한다. 그 중에서도 RNN 알고리즘을 개선/변형한 LSTM, GRU 알고리즘을 적용한다. (각 모델에 대한 공부는 StudyLog에서...) 본격적으로 모델을 설계하고 적용하기에 앞서, 문장 토큰화, 불용어 처리 등의 작업을 진행한다. 참고 : 「케라스 창시자에게 배우는 딥러닝」, 「딥러닝을 이용한 자연어 처리 입문」 # 사전 작업 # install KoNLPy ! pip3..

[3] 커뮤니티 글 데이터셋 라벨링

감성분석을 모델링을 진행하기에 앞서 긍정, 부정이 라벨링된 Train Set을 만들기로 했다. 감성어 사전을 바탕으로 형태소 분석을 진행한 뒤, 문장 내 형태소가 긍정어 사전에 있으면 점수에 +1을, 부정어 사전에 있으면 -1을 했고, 각 문장별로 점수가 0보다 작으면 부정(-1), 0보다 크면 긍정(1), 0이면 중립/unknown(0)으로 라벨링했다. 이번 단계의 작업을 통해 얻고자 하는 결과물은, 커뮤니티 게시글, 댓글을 문장 단위로 나누어 긍/부정 라벨링을 진행한 데이터셋이다. # 사용한 라이브러리 KoNLPy Pandas, Numpy Matplotlib.pyplot, Seaborn 더보기 Jupyter Notebook 및 윈도우 환경에서는 KoNLPy를 사용하기에 제약이 많다. 따라서 Googl..

[2] 감성어 사전 구축

팀원 간 역할 분담을 통해 포털 사이트 뉴스 플랫폼(네이버, 다음), 유튜브, 커뮤니티(MLBPARK, 루리웹닷컴, 보배드림, 클리앙)에서 약 180만 건의 댓글 데이터를 확보했다. 0408 회의 이후, 데이터 취합 및 전처리, 감성어 사전 구축으로 인원을 분배하여 최대 3일 간 작업을 진행하기로 하였다. 나는 후자의 작업을 맡았다. 해당 단계의 작업을 통해 얻고자 하는 결과물은, 문장별로 긍정/부정을 라벨링하기 위한 근거로서의, 형태소별로 구분된 긍정어/부정어 사전이다. # 데이터 인터넷 게시물, 댓글 데이터는 맞춤법이 제대로 지켜지지 않고, 신조어와 비속어가 많다. 우리 데이터의 특성을 고려한 감성어 사전을 구축해야 한다. 그러나 180만 건의 데이터를 모두 형태소 단위로 분석하고 확인하는 것은 불가..

[1] 네이버 뉴스 댓글 크롤러_ver2

네이버 뉴스 기사량이 많아 팀원과 작업을 분배하여 2019년 기사를 수집했다. ver1.5의 크롤러를 수정했다. 작업을 통해 얻고자 하는 결과물은 네이버에서 '주52시간'으로 검색했을 때 나오는 2019년의 모든 기사들 중 네이버 뉴스 플랫폼에 등록된 기사들의 기사 제목, 언론사, 기사 작성 시간, 댓글 수, 댓글 작성자, 댓글 내용, 댓글 공감/비공감 수이다. # 변수 설정 1년치 기사량이 많아 한 번에 크롤링할 수 없다. 한 달씩 나누어 작업을 진행했다. 월별로 기간을 지정해 기사를 검색하고, 기사 양에 맞게 최대 페이지를 지정해 준다. 다행히 한 페이지당 10개씩 기사가 보여지기 때문에, 페이지를 지정하는 일이 쉬웠다. URL이 조금 달라졌는데, 시작 날짜를 나타내는 ds, 종료 날짜를 나타내는 d..

[1] 커뮤니티 게시물 크롤러_2. 루리웹닷컴

# 사전 작업 루리웹닷컴의 경우, 검색어를 통합검색 창에 검색했을 때 뉴스, 게시글, 댓글, 마이피, 구글 통합검색 결과가 모두 검색되어 한 화면에 결과로 나온다. 뉴스와 구글 통합검색 결과는 애초에 팀의 크롤링 대상이 아니기 때문에 제외한다. 마이피는 루리웹닷컴만의 게시판인 것 같은데, 루리웹 회원들만의 공간으로 판단된다. 회원 아이디가 없으면 접근할 수 없는 경우도 있고, 공론장에 게시된 글이나 댓글으로 판단하기에는 무리가 있기 때문에 크롤링하지 않는다. 따라서 검색 결과 창에서 게시글과 댓글만을 크롤링하기로 한다. 그러나 의사결정이 필요한 부분에 부딪혔다. 문제는 다음과 같았다. 첫째, 댓글로 검색된 결과 중 게시글 검색 결과에 포함된 글이 있을 수 있다. 둘째, 댓글로 검색된 결과 중, 실제 클릭..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_2. 코드 수정 및 마무리

이번 단계의 작업에서는 이전 단계의 작업에서 찾아낸 문제점을 위주로 코드를 수정한다. 작업을 통해 얻고자 하는 결과물은 크롤러가 직접 MLBPARK 불펜에서 '주52시간'을 검색하여 찾아낸 마지막 페이지 범위까지의 게시물들 중, 커뮤니티 이름(MLBPARK), 글 제목, 글 작성 시간, 글 작성자, 추천 수, 조회 수, 댓글 수, 댓글 내용이다. # 사용한 라이브러리 Requests Selenium time BeautifulSoup urllib.parse csv # 데이터 추출 코드 수정 첫 번째로, 조회 수와 추천 수가 똑같다는 문제를 해결했다. 기존에 내 코드가 선택한 부분은 파란 음영이 칠해진 부분(..!)이었다. 선택해야 하는 부분은 빨간색 상자 부분이다. 조회수 정보를 담은 태그를 찾기 위해, ..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_1. 데이터 적재

이번 단계의 작업에서는 크롤러를 통해 MLBPARK 글과 댓글을 스크레이핑하고, 그것을 저장하는 함수를 만든다. 작업을 통해 얻고자 하는 결과물은 크롤러가 직접 MLBPARK 불펜에서 '주52시간'을 검색하여 찾아낸 마지막 페이지 범위까지의 게시물들 중, 커뮤니티 이름(MLBPARK), 글 제목, 글 작성 시간, 글 작성자, 추천 수, 조회 수, 댓글 수, 댓글 내용이다. # 사용한 라이브러리 Requests Selenium time BeautifulSoup urllib.parse csv # 검색 결과 마지막 페이지 얻기 네이버 크롤러에서와 달리, Selenium을 이용해 마지막 페이지에 갈 때까지 클릭한다. 마지막 페이지에 가면 '다음' 버튼이 나오지 않는다는 것을 활용했다. '다음' 버튼은 class..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_0. 사전 작업

0401 회의 이후, 나는 MLBPARK와 루리웹닷컴에서 주52시간 관련 게시물들을 크롤링하는 역할을 맡았다. 아직 네이버 뉴스 댓글 크롤러를 업그레이드하지는 못했지만, 일단 이를 활용해 필요한 데이터를 쌓는다. 사전 작업으로, 어떤 데이터를, 어디에서 얻어야 하는지 파악한다. 이후, 필요한 정보를 얻기 위해 내가 만들 크롤러가 어떤 링크들을 타고 돌아다녀야 하는지, 그 링크들의 URL 구조가 어떻게 되는지 파악한다. # 어떤 데이터를 얻어야 하는가? 우선 MLBPARK 사이트에서 야구 관련 게시물이 아닌 글들은 전부 BULLPEN 게시판에 올라와 있다. 따라서 MLBPARK BULLPEN 게시판이 정보를 얻을 곳이다. 첫째, MLBPARK BULLPEN 게시판에서, 둘째, '주52시간'을 검색하면 나오..

[1] 네이버 뉴스 댓글 크롤러_ver1.5_검색페이지 확대

ver1의 크롤러를 조금 수정하여 최대 검색 페이지 숫자를 지정하여 크롤링하도록 함수를 수정했다. 작업을 통해 얻고자 하는 결과물은 '주52시간'으로 검색했을 때 나오는 모둔 기사들에서 스크레이핑한 필요한 정보들이다. # 검색 페이지 지정 ver1의 함수에서 크게 달라진 것은 없다. 다만, 어차피 네이버는 최대로 제공하는 검색 결과 페이지가 400페이지 까지이기 때문에, 마지막 페이지를 얻는 함수를 없애고, 검색 페이지를 변수로 지정하여 해당하는 페이지까지 루프를 돌면서 네이버 뉴스 링크를 모아 오는 방식으로 함수를 수정했다. 실행할 main 함수에서 검색 페이지는 전역 변수로 설정했다. # 변수 설정 QUERY = "주52시간" search_QUERY = urllib.parse.urlencode({'q..