본문 바로가기

개발/Java & Spring

[Spring] 스프링과 IBM Watson Assistance 를 연동하여 자연어처리 챗봇 만들기 - 개발일기C[2]



Watson 플랫폼 설명은 생략하겠다. 

카카오 챗봇 구현은 지난 개발일기C[1] 에서 붙여서 한다!

사실 이렇게 노가다로 끼워넣는거 말고 단어만 추출해주면 그걸로 하고싶은데 ㅠ____ㅠ 자연어처리 API 는 좀 더 찾아볼 필요가 있을 것 같다.



가이드가 참 잘나와있어서 편했다

https://console.bluemix.net/docs/services/conversation/develop-app.html#building-a-client-application



우선 pom.xml 에 왓슨 클라우드 의존을 추가한다.


<!-- watson -->
<dependency>
	<groupid>com.ibm.watson.developer_cloud</groupid>
	<artifactid>java-sdk</artifactid>
	<version>6.2.0</version>
</dependency>

그런다음, /message 경로 컨트롤러로 슝


@RequestMapping(value = "/message", method = RequestMethod.POST, produces="application/json; charset=UTF-8")
	@ResponseBody
	public ResponseMessageVO message(@RequestBody RequestMessageVO vo) throws JsonParseException, JsonMappingException, IOException
	{
		ResponseMessageVO res_vo=new ResponseMessageVO();
		MessageVO mes_vo=new MessageVO();
		KeyboardVO keyboard=new KeyboardVO();
		keyboard.setType("text"); //텍스트 타입으로 출력
		res_vo.setKeyboard(keyboard);
		if(!vo.getType().equals("text"))
		{
			//텍스트 타입만 허용할 것이기 때문에
			
			mes_vo.setText("텍스트 타입만 허용하고 있습니다");

			res_vo.setMessage(mes_vo);
			return res_vo;
		}
		
		//텍스트 요청 받기 -> 사용자가 챗봇에게 보내는 메시지를 이렇게 담는다
		String query=vo.getContent();	
		
            //여기서부터 왓슨
	    // Set up Assistant service.
	    Assistant service = new Assistant("2018-08-06");
	    service.setUsernameAndPassword("", // replace with service username
	                                   ""); // replace with service password
	    String workspaceId = ""; // replace with workspace ID
           //이 세 항목은 자신의 워크스페이스에서 왼쪽 목록 두번째 -> Deploy에 들어가면 나와있다.

	    // Start assistant with empty message.
	    MessageOptions options = new MessageOptions.Builder(workspaceId).build();
	    

	    InputData input = new InputData.Builder(query).build();//위에서 입력받은 사용자의 요청을 여기로 넣어준다.
           //즉, 자연어(사용자의 요청) --- 왓슨 -----> "결과 도출" 이렇게 흘러가는 것이다. 
           //나같은 경우는 "홍대입구역인데 언제와?" 이런식으로 요청오면 "홍대입구"만 추출하는 것을 구현했다.(노가다로)
	    options = new MessageOptions.Builder(workspaceId).input(input).build();
	     
	     // Send message to Assistant service.
	    MessageResponse mes_response = service.message(options).execute();      
	    String responseText = mes_response.getOutput().getText().get(0); //이게 왓슨이 자연어를 처리한 뒤 출력해주는 단어. 즉, 홍대입구가 출력된다.
	    List<RuntimeIntent> responseIntents = mes_response.getIntents();

	        // If an intent was detected, print it to the console.
	    if(responseIntents.size() > 0) {
	    System.out.println("Detected intent: #" + responseIntents.get(0).getIntent());
	    }

	    String station= mes_response.getOutput().getText().get(0);
		

		RestTemplate restTemplate = new RestTemplate(); 
		 
		HttpHeaders headers = new HttpHeaders(); 
		headers.add("Content-type", "application/json; charset=UTF8");
		try{
		String encodeStation=URLEncoder.encode(station,"UTF-8");//추출한 station을 url인코딩
		HttpEntity entity = new HttpEntity("parameters", headers); 
		//http://swopenapi.seoul.go.kr/api/subway/sample/json/realtimeStationArrival/0/5/서울
		URI url=URI.create("http://swopenapi.seoul.go.kr/api/subway/appkey/json/realtimeStationArrival/0/5/"+encodeStation); 
		//x -> x좌표, y -> y좌표 
		 
		ResponseEntity response= restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
		//String 타입으로 받아오면 JSON 객체 형식으로 넘어옴
		ObjectMapper obj=new ObjectMapper();
		RealTimeArrivalList rl=new RealTimeArrivalList();
		//d=obj.readValue(response.getBody(), JSONMapper.class);
		
		JsonNode node=obj.readValue(response.getBody().toString(), JsonNode.class);
		JsonNode realtimeArrivalList=node.get("realtimeArrivalList");
		mes_vo.setText(realtimeArrivalList.get(0).get("trainLineNm")+" -> "+realtimeArrivalList.get(0).get("arvlMsg2"));
		res_vo.setMessage(mes_vo);
		return res_vo;
		
		}catch(NullPointerException exNull){
			mes_vo.setText("올바른 역 명을 입력해주세요");
			res_vo.setMessage(mes_vo);
			return res_vo;
		}
		catch(Exception ex){
			ex.printStackTrace();
			mes_vo.setText("서버뻑가");
			res_vo.setMessage(mes_vo);
			return res_vo;
		}

	}


사실 가이드를 보면 금방 적용할 수 있을 것이다!