1.1 기사 가져오기
url <- "https://news.naver.com/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=003&aid=0008737816&date=20180802&type=1&rankingSeq=8&rankingSectionId=100"
page <- read_html(url)
partMain <- page %>% html_nodes("#articleBodyContents") %>% html_text()
Encoding(partMain) <- "UTF-8"
partMain
## [1] "\n\t\n\t\n\n\n\n// flash 오류를 우회하기 위한 함수 추가\nfunction _flash_removeCallback() {}\n 【창원=뉴시스】강경국 기자 = '드루킹 사건' 김동원(49·구속중)씨의 댓글조작 사건을 수사 중인 허익범 특별검사팀이 2일 오전 김경수 경남도지사 집무실에 대한 압수수색에 나선 가운데 도청 관계자가 집무실 밖에 대기하고 있다. 2018.08.02.kgkang@newsis.com【서울=뉴시스】 이재은 기자 = 더불어민주당은 2일 허익범 특검팀이 김경수 경남도지사를 피의자 신분으로 전환하고, 집무실 및 관사 등을 압수수색한 데 대해 \"성실한 수사보다는 지나친 언론플레이를 하고 있다\"고 비판했다.김현 대변인은 이날 논평을 통해 \"특검팀이 김 지사에 대한 직접적인 소환조사와 압수수색도 하기 전에 '김경수 지사를 드루킹과의 공범으로 보고 피의자 신분으로 전환했다'는 예고를 언론에 흘리는 식의 행태는 그야말로 구태\"라고 지적했다.김 대변인은 \"당사자에게 통보도 하기 전에 '소환 임박'이라는 등의 정보를 언론에 흘리며 흠집내기 식 여론몰이를 하는 것은 온당하지 않다\"면서 \"특히 지난 경찰 조사에서 충분히 소명되었던 내용을 가지고 마치 새롭게 밝혀낸 것처럼 반복해서 공개하며 '드루킹과의 공범'을 운운하는 것은 악의적인 여론몰이며 마녀사냥에 다름 아니다\"라고 일갈했다.이어 \"정의당 노회찬 의원의 경우에도 허익범 특검팀이 공식적인 직접수사도 시작하기 전에 '드루킹 일당으로부터 불법정치자금 5000만원을 받은 혐의가 있다'고 언론에 흘리며 망신을 준 탓에 서민의 벗이자 훌륭한 정치인 한 분을 홀연히 떠나보내지 않았나\"라고 반문했다.김 대변인은 \"허익범 특검팀이 지금 김경수 지사의 집무실과 관사에 대해 압수수색 영장을 발부받아 집행하고 있는데, 범죄자들의 오락가락한 진술에 기대지 말고 오직 증거에 따른 원칙적이고 과학적인 수사를 하길 기대한다\"면서 \"자유한국당이 이미 한나라당(2006년) 시절부터 당 차원에서 매크로 프로그램을 동원해 조직적으로 여론조작을 한 사실에 대해서도 검찰은 철저한 수사를 해야 한다\"고 강조했다.lje@newsis.com▶ 뉴시스 빅데이터 MSI 주가시세표 바로가기 ▶ 뉴시스 SNS [페이스북] [트위터]"
text <- partMain
x <- gsub("[^A-Za-z가-힣[:space:][:digit:][:punct:]]", "", text)
x <- gsub("@|\n|RT", "", x)
x <- gsub("[[:punct:]]", " ", x)
x <- gsub("[[:digit:]]", "", x)
x <- tolower(x)
x <- gsub("[a-z]", "", x)
x <- str_trim(x)
x
## [1] "오류를 우회하기 위한 함수 추가 창원 뉴시스 강경국 기자 드루킹 사건 김동원 구속중 씨의 댓글조작 사건을 수사 중인 허익범 특별검사팀이 일 오전 김경수 경남도지사 집무실에 대한 압수수색에 나선 가운데 도청 관계자가 집무실 밖에 대기하고 있다 서울 뉴시스 이재은 기자 더불어민주당은 일 허익범 특검팀이 김경수 경남도지사를 피의자 신분으로 전환하고 집무실 및 관사 등을 압수수색한 데 대해 성실한 수사보다는 지나친 언론플레이를 하고 있다 고 비판했다 김현 대변인은 이날 논평을 통해 특검팀이 김 지사에 대한 직접적인 소환조사와 압수수색도 하기 전에 김경수 지사를 드루킹과의 공범으로 보고 피의자 신분으로 전환했다 는 예고를 언론에 흘리는 식의 행태는 그야말로 구태 라고 지적했다 김 대변인은 당사자에게 통보도 하기 전에 소환 임박 이라는 등의 정보를 언론에 흘리며 흠집내기 식 여론몰이를 하는 것은 온당하지 않다 면서 특히 지난 경찰 조사에서 충분히 소명되었던 내용을 가지고 마치 새롭게 밝혀낸 것처럼 반복해서 공개하며 드루킹과의 공범 을 운운하는 것은 악의적인 여론몰이며 마녀사냥에 다름 아니다 라고 일갈했다 이어 정의당 노회찬 의원의 경우에도 허익범 특검팀이 공식적인 직접수사도 시작하기 전에 드루킹 일당으로부터 불법정치자금 만원을 받은 혐의가 있다 고 언론에 흘리며 망신을 준 탓에 서민의 벗이자 훌륭한 정치인 한 분을 홀연히 떠나보내지 않았나 라고 반문했다 김 대변인은 허익범 특검팀이 지금 김경수 지사의 집무실과 관사에 대해 압수수색 영장을 발부받아 집행하고 있는데 범죄자들의 오락가락한 진술에 기대지 말고 오직 증거에 따른 원칙적이고 과학적인 수사를 하길 기대한다 면서 자유한국당이 이미 한나라당 년 시절부터 당 차원에서 매크로 프로그램을 동원해 조직적으로 여론조작을 한 사실에 대해서도 검찰은 철저한 수사를 해야 한다 고 강조했다 뉴시스 빅데이터 주가시세표 바로가기 뉴시스 페이스북 트위터"
initRhino()
noun <- lapply(x, getMorph, "noun")
a <- unlist(noun)
a <- data.frame(noun = unique(a))
a
## noun
## 1 오류
## 2 함수
## 3 추가
## 4 창원
## 5 뉴시스
## 6 강경국
## 7 기자
## 8 드루
## 9 킹
## 10 사건
## 11 김동원
## 12 구속
## 13 댓글
## 14 조작
## 15 수사
## 16 범
## 17 특별
## 18 검사
## 19 팀
## 20 일
## 21 오전
## 22 김경수
## 23 경남
## 24 도지사
## 25 집무실
## 26 압수
## 27 수색
## 28 나선
## 29 가운데
## 30 도청
## 31 관계자
## 32 밖
## 33 서울
## 34 이재은
## 35 어민
## 36 주당
## 37 특검
## 38 피의자
## 39 신분
## 40 관사
## 41 데
## 42 언론
## 43 플레이
## 44 김현
## 45 대변인
## 46 이날
## 47 논평
## 48 김
## 49 지사
## 50 소환
## 51 조사
## 52 하기
## 53 전
## 54 공범
## 55 예고
## 56 식의
## 57 행태
## 58 구태
## 59 당사자
## 60 통보
## 61 이
## 62 등
## 63 정보
## 64 흠집
## 65 여론
## 66 몰이
## 67 면
## 68 경찰
## 69 내용
## 70 악의
## 71 마녀
## 72 사냥
## 73 다름
## 74 정의당
## 75 차
## 76 의원
## 77 경우
## 78 공식
## 79 직접
## 80 일당
## 81 불법
## 82 정치
## 83 자금
## 84 혐의
## 85 망신
## 86 탓
## 87 서민
## 88 벗
## 89 정치인
## 90 분
## 91 지금
## 92 영장
## 93 발부
## 94 범죄자
## 95 진술
## 96 증거
## 97 원칙
## 98 과학
## 99 자유
## 100 한국당
## 101 한나라당
## 102 년
## 103 시절
## 104 차원
## 105 매크로
## 106 프로그램
## 107 조직
## 108 사실
## 109 검찰
## 110 빅
## 111 데이터
## 112 주가
## 113 시세표
## 114 페이스북
## 115 트위터
verb <- lapply(x, getMorph, "verb")
v <- unlist(verb)
v <- data.frame(verb = unique(v))
v
## verb
## 1 우회하
## 2 위하
## 3 익
## 4 하
## 5 대기하
## 6 더불
## 7 전환하
## 8 수색하
## 9 대하
## 10 성실하
## 11 지나치
## 12 비판하
## 13 통하
## 14 보
## 15 흘리
## 16 지적하
## 17 임박
## 18 온당
## 19 지나
## 20 소명
## 21 되
## 22 가지
## 23 새롭
## 24 밝히
## 25 반복하
## 26 공개하
## 27 운운하
## 28 일갈하
## 29 노회
## 30 시작하
## 31 받
## 32 줄
## 33 훌륭
## 34 떠나보내
## 35 반문하
## 36 집행하
## 37 기대
## 38 말
## 39 동원하
## 40 철저
## 41 강조하
## 42 가
write.csv(a, "noun_a.csv")
write.csv(v, "verb_v.csv")
1.2 사전구축
1.2.1 사전 불러오기
## [1] "C:/Users/94tjd/data/rpubs/text function"
setwd("C:/Users/94tjd/OneDrive/바탕 화면/data")
positive <- readLines("positive.txt")
negative <- readLines("negative.txt")
1.2.2 사전에 단어 추가하기
positive <- c(positive, '여행')
negative <- c(negative, "해고", "감소", "보이콧")
tail(positive); tail(negative)
## [1] "활약하" "횡재하" "후끈" "휴식" "흥겹" "여행"
## [1] "흥청망청" "흩어지" "힘들" "해고" "감소" "보이콧"
1.2.3 형태소 분석
library(RHINO)
initRhino()
getwd()
## [1] "C:/Users/94tjd/data/rpubs/text function"
setwd("C:/Users/94tjd/OneDrive/바탕 화면/data")
txt <- readLines("sample_news.txt")
POS <- lapply(txt, getMorph, "ALL")
length(POS)
## [1] 9
## [[1]]
## [1] "9" "일" "관계" "부처" "에" "따르" "면"
## [8] "정부" "는" "이달" "말" "발표하" "ㄴ" "하반기"
## [15] "경제" "운용" "방향" "을" "통하" "아" "소비"
## [22] "및" "투자" "진작" "방안" "을" "내놓" "을"
## [29] "방침" "이다" "." "그간" "정부" "는" "세월호"
## [36] "참사" "이후" "소비" "심리" "가" "크" "게"
## [43] "악화되" "ㅁ" "에" "따르" "아" "재정" "을"
## [50] "당초" "계획" "보다" "조기" "집행하" "고" "공무원"
## [57] "복지" "포인트" "조기" "사용" "을" "독려하" "는"
## [64] "등" "여러" "대책" "을" "발표하" "ㄴ" "바"
## [71] "있" "다" "." "하지만" "근본" "적" "이"
## [78] "ㄴ" "대책" "과" "는" "거리" "가" "멀"
## [85] "다" "." "정부" "가" "표현하" "ㄴ" "대로"
## [92] "‘" "원" "포인트" "’" "수준" "이다" "."
1.2.4 문장의 검정어휘 탐색
POS.vec <- unlist(POS)
pos.matches.num <- match(POS.vec, positive)
neg.matches.num <- match(POS.vec, negative)
pos.matches.num; neg.matches.num
pos.matches <- !is.na(pos.matches.num)
neg.matches <- !is.na(neg.matches.num)
pos.matches; neg.matches
1.2.5 감정어휘 개수 파악
pos.sum <- sum(pos.matches)
neg.sum <- sum(neg.matches)
pos.sum; neg.sum
1.2.6 감정값 계산
result <- pos.sum - neg.sum
if(result > 0) {
print("긍정")
}else if(result == 0){
print("중립")
}else {
print("부정")
}
1.2.7 시그모이드 함수를 이용한 결과 출력
sigmoid <- function(X){
1 / (1 + exp(-x))
}
1.2.8 시그모이드 함수 그래프, 모든 값을 0-1 사이로 변환
x <- seq(from = -5, to = 5, by = 0.1)
plot(x, sigmoid(X), col = "red")

1.2.9 감정 어휘 점수 계산
result <-sigmoid(pos.sum) - sigmoid(neg.sum)
result
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [36] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [71] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1.2.10 감정 판정
result <- round(result, digits = 3)
if(result > 0.3) {
print("긍정"); print(result)
}else if (result < -0.3) {
print("부정"); print(result)
}else{
print("중립"); print(result)
}
## Warning in if (result > 0.3) {: length > 1 이라는 조건이 있고, 첫번째 요소
## 만이 사용될 것입니다
## Warning in if (result < -0.3) {: length > 1 이라는 조건이 있고, 첫번째 요소
## 만이 사용될 것입니다
## [1] "중립"
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [36] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [71] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pos.txt <- scan(file = "positive2.txt", what = "character")
neg.txt <- scan(file = "negative2.txt", what = "character")
head(pos.txt)
pos <- NULL; pos.num <- NULL
neg <- NULL; neg.num <- NULL
1.3 감정사전 전처리
- 형태소와 감정값이 연결되어 벡터로 저장되었으므로, ifelse 함수를 이용해 둘을 분리힌다.
for(i in 1:length(pos.txt))
{
ifelse(i %% 2 == 0, pos.num <- c(pos.num, pos.txt[i]), pos <- c(pos <- c(pos, pos.txt[i])))
}
for(i in 1:length(neg.txt))
{
ifelse(i %% 2 == 0, neg.sum <- c(neg.num, neg.txt[i], neg <- c(neg <- c(neg, neg.txt[i])))
}