R 활용해서 워드클라우드 만들기
네이버에서 워드클라우드 만들 텍스트 데이터 받아서 txt로 저장하기
package com.sist.service;
import java.io.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class NaverManager {
public void naverData(String fd) {
ApiExamSearchBlog api = new ApiExamSearchBlog();
String json = api.naverFindData(fd);
System.out.println(json);
// JSON 파싱 방법 ------------------------------------------------
try {
JSONParser jp = new JSONParser();
JSONObject root = (JSONObject)jp.parse(json);
JSONArray arr = (JSONArray)root.get("items");
String result = "";
for(int i = 0; i < arr.size(); i++){
JSONObject obj = (JSONObject)arr.get(i);
obj.get("description");
result += obj.get("description") + "\r\n";
}
// 한글빼고 싹다 지우기 ----------------------------------------
result = result.replace("<", "");
result = result.replace(">", "");
result = result.replace("/", "");
result = result.replace("#", "");
result = result.replace(".", "");
result = result.replaceAll("[0-9]", "");
result = result.replaceAll("[A-Za-z]", "");
FileWriter fw = new FileWriter("c:\\upload\\naver.txt");
fw.write(result);
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
R실행시켜서 워드클라우드 만들기
- 참고 : https://m.blog.naver.com/PostView.nhn?blogId=bb_&logNo=220373069457&proxyReferer=https:%2F%2Fwww.google.com%2F
package com.sist.web;
import org.rosuda.REngine.Rserve.RConnection;
import org.springframework.stereotype.Component;
@Component
public class RManager {
public void graph(int no){
// 워드클라우드 실행 순서 입력
try {
RConnection rc = new RConnection();
// voidEval : 리턴 값이 없는 R 코드 실행
// 라이브러리 불러오기
rc.voidEval("library(rJava)");
rc.voidEval("library(KoNLP)");
rc.voidEval("library(wordcloud)");
// 프로젝트의 리얼패스에 png파일 생성
rc.voidEval("png(\"C:/springDev/springStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Project/naver"+no+".png\")");
// txt 파일을 줄마다 읽기
rc.voidEval("data<-readLines(\"c:/upload/naver.txt\", encoding = \"UTF-8\")");
// KoNLP의 extractNoun 이용해서 한글명사만 뽑아오기
// USE.NAMES = F가 없는 경우 원문장, 명사뽑은 내용이 같이 나옴
// 원문장 필료 없으므로 F
// sapply 이용했으므로 vector로 반환
rc.voidEval("data1<-sapply(data, extractNoun, USE.NAMES = F)");
rc.voidEval("data2<-unlist(data1)");
// 의미없는 한글자 제외시키기
rc.voidEval("data3<-Filter(function(x){nchar(x)>=2}, data2)");
// 단어들 몇 번 나왔는지 횟수 확인
rc.voidEval("data4<-table(data3)");
rc.voidEval("data5<-head(sort(data4, decreasing=T), 100)");
// 워드 클라우드 그리기
rc.voidEval("wordcloud(names(data5), freq = data5, min.freq = 3, max.words = 100, random.order = F, scale = c(10,1), colors = rainbow(15))");
rc.voidEval("dev.off()");
rc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Contoller
package com.sist.web;
@Controller
public class Contoller {
@Autowired
private DAO dao;
@Autowired
private NaverManager nm;
@Autowired
private RManager rm;
// 상세보기 ====================================================================================================================================================
@RequestMapping("/detail.do")
public String detail(Model model, String no, HttpSession session, HttpServletRequest request){
try {
VO vo = dao.Detail(Integer.parseInt(no)); // DAO의 상세보기 메소드 리턴값을 vo에 담기
// 워드클라우드 -----------------------------------------------------------------------------------------
nm.naverData(vo.getSubject());
rm.graph(Integer.parseInt(no));
model.addAttribute("vo", vo);
model.addAttribute("reply_list", reply_list);
} catch (Exception e) {
System.out.println(e.getMessage());
}
return "/detail";
}
화면 출력하기
- 저장한 워드클라우드 png파일 원하는 위치에서 출력하기