반응형
/*********************************************************************************************************
-- Title : [R3.3] 비정형텍스트 - 연관어 분석 및 연관어 네트워크/근접중심성 시각화
-- Reference : hrd-net
-- Key word : R 비정형 텍스트 연관어 네트워크 시각화 근접 중심성 시각화 nlp konlp map sapply crosstable
연관 규칙 arules apriori inspect igraph package 패키지 edgelist
*********************************************************************************************************/
-- R
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | # ************************************************ # -- 연관어 분석(단어와 단어 사이 연관성 분석) # 시각화 : 연관어 네트워크 시각화, 근접중심성 시각화 # ************************************************ # ------------------------------- # -- 한글 처리를 위한 패키지 설치 # ------------------------------- install.packages("rJava") Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_112') library(rJava) # 아래와 같은 Error 발생 시 Sys.setenv()함수로 java 경로 지정 install.packages("KoNLP") library(KoNLP) # rJava 라이브러리가 필요함 # ------------------------------ # -- 1. 텍스트 파일 가져오기 # ------------------------------ marketing = file("C:\\RProject\\Rwork\\Part-II\\marketing.txt", encoding="UTF-8") marketing2 = readLines(marketing) # 줄 단위 데이터 생성 # incomplete final line found on - Error 발생 시 UTF-8 인코딩 방식으로 재 저장 close(marketing) head(marketing2) # 앞부분 6줄 보기 - 줄 단위 문장 확인 # ------------------------------ # -- 2. 줄 단위 단어 추출 # ------------------------------ # -- Map()함수 이용 줄 단위 단어 추출 : Map(f, ...) -> base) lword = Map(extractNoun, marketing2) length(lword) # [1] 472 lword = unique(lword) # 중복제거1(전체 대상) length(lword) # [1] 353(19개 제거) lword = sapply(lword, unique) # 중복제거2(줄 단위 대상) length(lword) # [1] 352(1개 제거) str(lword) # List of 353 lword # 추출 단어 확인 # ------------------------------ # -- 3. 전처리 # ------------------------------ # is.hangul() : KoNLP 패키지 제공 # Filter(f, x) : base # nchar() : base -> 문자 수 반환 # -- 1) 길이가 2~4 사이의 단어 필터링 함수 정의 filter1 = function(x){ nchar(x) <= 4 && nchar(x) >= 2 && is.hangul(x) } # -- 2) Filter(f,x) -> filter1() 함수를 적용하여 x 벡터 단위 필터링 filter2 = function(x){ Filter(filter1, x) } # -- 3) 줄 단어 대상 필터링 lword = sapply(lword, filter2) lword # 추출 단어 확인(길이 1개 단어 삭제됨) # ------------------------------ # -- 4. 트랜잭션 생성 : 연관분석을 위해서 단어를 트랜잭션으로 변환 # ------------------------------ # -- arules 패키지 설치 install.packages("arules") library(arules) # -- arules 패키지 제공 기능 # Adult,Groceries 데이터 셋 # as(),apriori(),inspect(),labels(),crossTable() wordtran = as(lword, "transactions") # lword에 중복데이터가 있으면 error발생 wordtran wordtable = crossTable(wordtran) # 교차표 작성 wordtable # ------------------------------ # -- 5. 단어 간 연관규칙 산출 # ------------------------------ # 트랜잭션 데이터를 대상으로 지지도와 신뢰도를 적용하여 연관규칙 생성 # 형식) apriori(data, parameter = NULL, appearance = NULL, control = NULL) # data : object of class transactions, # parameter : support 0.1, confidence 0.8, and maxlen 10(연관단어 최대수) # tranrules = apriori(wordtran, parameter=list(supp=0.25, conf=0.05)) # 0.22 -> 84 rules, supp=0.25 -> 59 rules # 지지도와 신뢰도를 높이면 발견되는 규칙의 수가 줄어든다. inspect(tranrules) # 연관규칙 생성 결과(59개) 보기 # ------------------------------ # 6.연관어 시각화 - rulemat[c(34:63),] # 연관규칙 결과- {} 제거(1~33) #------------------------------- # -- (1) 연관단어 시각화를 위해서 데이터 구조 변경 rules = labels(tranrules, ruleSep=" ") class(rules) # [1] "character" rules = sapply(rules, strsplit, " ", USE.NAMES=F) rulemat = do.call("rbind", rules) # sapply(), do.call() # base 패키지 rulemat class(rulemat) # [1] "matrix" # -- (2) 연관어 시각화를 위한 igraph 패키지 설치 install.packages("igraph") # graph.edgelist(), plot.igraph(), closeness() 함수 제공 library(igraph) # -- (3) edgelist보기 - 연관단어를 정점 형태의 목록 제공 ruleg = graph.edgelist(rulemat[c(12:59),], directed=F) # [1,]~[11,] "{}" 제외 ruleg # -- (4) edgelist 시각화 plot.igraph(ruleg, vertex.label=V(ruleg)$name, vertex.label.cex=1.2, vertex.label.color='black', vertex.size=20, vertex.color='green', vertex.frame.color='blue') # 정점(타원) 레이블 속성 # vertex.label=레이블명,vertex.label.cex=레이블 크기, vertex.label.color=레이블색 # 정점(타원) 속성 # vertext.size= 정점 크기, vertex.color=정점 색, vertex.frame.color=정점 테두리 색 # # -- 7.단어 근접중심성(closeness centrality) 파악 # closen = closeness(ruleg) # edgelist 대상 단어 근접중심성 생성 #closen = closen[c(2:8)] # {} 항목제거 closen = closen[c(1:10)] # 상위 1~10 단어 근접중심성 보기 plot(closen, col="red",xaxt="n", lty="solid", type="b", xlab="단어", ylab="closeness") points(closen, pch=16, col="navy") axis(1, seq(1, length(closen)), V(ruleg)$name[c(1:10)], cex=5) # 중심성 : 노드(node)의 상대적 중요성을 나타내는 척도이다. # plot, points(), axis() : graphics 패키지(기존 설치됨) | cs |
-- Files
반응형