POST 메소드 예제(부산대 맞춤법 검사기)

부산대에서는 한국어 맞춤법/문법 검사기를 개발하여 공개하고 있습니다. (링크)

pnuwebspeller

이곳에 원하는 문장을 써서 검사하면 http://speller.cs.pusan.ac.kr/PnuWebSpeller/lib/check.asp 주소로 정보가 보내지게 됩니다. 이때 ‘새 인터페이스 사용하기’ 항목은 체크해제 해주세요.

소스 코드를 보면 <form> 태그의 내부 내용에서 post 메소드를 통해 lib/check.asp의 주소에 text1의 내용을 보내는 것을 알 수 있습니다. 이 부분의 내용을 그대로 작성하여 POST()함수를 이용해서 R을 통해 접근하면, 웹 브라우저를 통해 접근하는 것과 동일한 내용을 얻을 수 있습니다.

form

post_result = POST("http://speller.cs.pusan.ac.kr/PnuWebSpeller/lib/check.asp",
                   body = list(text1 = inputWord), encode = "form")
html = htmlParse(post_result, encoding = "UTF-8")

body 인수에는 list형식으로 데이터가 들어간다는 점만 조심하면 됩니다. POST()함수를 실행하기 전에 맞춤법 검사기를 브라우저에서 직접 사용해서 결과가 어떻게 나오는지 미리 살펴보겠습니다.

pnuwebspeller2

개발 도구(F12 키)를 이용하여 맞춤법 검사 결과를 살펴보겠습니다.

각 수정 내용은 <table> 태그 내에 <td> 에 위치하고 있으며 맞춤법이 틀린 부분은 id가 tdErrorWord_0, tdErrorWord_1, … 이며 class가 tdErrWord로 동일합니다. 마찬가지로 대치어 부분은 id가 tdReplaceWord_0, tdReplaceWord_1, … 이며 class가 tdReplace로 동일합니다.

tderrword tdreplace

이제 xpath를 이용하면 틀린 단어와 대치어를 얻을 수 있습니다.

tdErrWord = xpathSApply(html, "//td[@class='tdErrWord']", xmlValue)
tdReplace = xpathSApply(html, "//td[@class='tdReplace red']", xmlValue)

다음으로 stringr의 str_replace_all() 함수를 이용하여 초기에 입력된 문장에 대해 수정사항을 적용하여 결과를 낼 수 있습니다.

result

위와 같이 맞춤법이 수정된 문장과 각각의 수정 내용을 출력하는 함수를 만들어서 사용하면 됩니다.

부산대 맞춤법/문법 검사기는 개인과 학생에게 무료인 점과 너무 대량의 요청을 보낼 경우 접근을 차단당할 수 있으므로 주의하시기 바랍니다.

require(httr)
require(XML)
require(stringr)

spell_checker = function(inputWord){
  
  post_result = POST("http://speller.cs.pusan.ac.kr/PnuWebSpeller/lib/check.asp",
                     body = list(text1 = inputWord), encode = "form")
  html = htmlParse(post_result, encoding = "UTF-8")
  
  tdErrWord = xpathSApply(html, "//td[@class='tdErrWord']", xmlValue)
  tdReplace = xpathSApply(html, "//td[@class='tdReplace']", xmlValue)
  
  if(length(tdErrWord) == 0 || length(tdReplace) == 0) return(list(input_word = inputWord, output_word = NA, replaced_word = NA))
  
  names(tdReplace) = tdErrWord

  list_result = list(input_word = inputWord, output_word = str_replace_all(inputWord, tdReplace), replaced_word = str_c(tdErrWord, " → ", tdReplace))
  return(list_result)
}

spell_checker("이 도너츠 존맛이네")