Post

파이썬으로 부산대학교 한국어 맞춤법 검사기 사용하기

웹에서 사용할 수 있는 한국어 맞춤법 검사기로 가장 대표적인 건 부산대학교 한국어 맞춤법/문법 검사기다. 맞춤법 교정에 신경을 써본 사람이라면 다 알고 있는, 현존하는 최고의 맞춤법 검사기다.

참고로 예전에 카카오에서도 맞춤법 검사기를 개발해서 API까지 공개한 적이 있었는데, 부산대 맞춤법 검사기를 개발한 권혁철 교수가 직접 카카오의 검사기는 부산대학교 검사기를 리버스 엔지니어링해서 개발한 거라고 비판하면서 큰 논란이 되었고, 결국 카카오는 서비스를 중단했다. (참고: 카카오, 표절 논란된 한글 맞춤법 검사기 API 공개 중단대형 포털들이 맞춤법 검사기를 공개했다, 그런데…)

그나마 사람들이 많이 사용하는 서비스로 네이버 맞춤법 검사기가 있긴 한데, 한 번에 최대 500자만 검사해주는 베타 버전이고 교정의 정확도도 부산대 검사기에 비해 안 좋다. 네이버 검사기를 사용하기 위한 파이썬 라이브러리 py-hanspell도 있긴 한데, 라이브러리라고 하기엔 기능이 너무나도 단순해서 굳이 설치해서 쓸 이유가 없어 보인다.

직접 부산대 검사기를 사용하는 파이썬 스크립트를 작성하게 된 이유이기도 하다.

아무튼 본 포스팅에서는 파이썬의 기본 라이브러리인 requests를 활용해서 맞춤법 검사기 돌리는 방법을 소개한다. 핵심 코드는 10줄이 채 안 된다.

파이썬 코드 예시

코드에서 사용하는 라이브러리는 requestsjson뿐이다. 파이썬 기본 라이브러리라 별도의 설치도 필요 없음.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
import json

# 1. 텍스트 준비 & 개행문자 처리
with open('text.txt', 'r', encoding='utf-8') as f:
    text = f.read()
text = text.replace('\n', '\r\n')

# 2. 맞춤법 검사 요청 (requests)
response = requests.post('http://164.125.7.61/speller/results', data={'text1': text})

# 3. 응답에서 필요한 내용 추출 (html 파싱)
data = response.text.split('data = [', 1)[-1].rsplit('];', 1)[0]

# 4. 파이썬 딕셔너리 형식으로 변환
data = json.loads(data)

# 5. 교정 내용 출력
print(data['errInfo'])

코드를 설명하자면,

1) 텍스트 준비 & 개행문자 처리

일단 ‘text.txt’라는 텍스트 파일에서 검사할 원문을 읽어오자. (물론 그냥 파이썬 문자열로 작성해도 되긴 하다.)

그 다음 텍스트에서 줄바꿈 시 사용하는 '\n'이라는 개행문자를 '\r\n'으로 변경해줘야 한다. 만약 이 선행작업 없이 개행문자가 포함된 텍스트를 그대로 넣고 검사를 돌리면 개행문자가 모두 삭제되어 불필요한 띄어쓰기 오류가 발생하니까 주의하자.

2) 맞춤법 검사 요청 (requests)

이후 requests.post()를 사용해서 텍스트를 전달하여 맞춤법 검사 요청을 한다. data라는 파라미터 안에 text1의 값으로 준비한 텍스트를 넣어주면 된다.

이를 통해 받은 response를 출력해보면, <Response [200]>이라고 뜰 거다. HTTP 요청이 성공했음을 나타내는 서버측 성공 응답 상태 코드다. 여기서 response.text를 확인하면 익숙한 html 문서를 확인할 수 있다. 아마 이런 식으로 되어 있을 거다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" /><title>한국어 맞춤법/문법 검사기</title>
    <link rel=\'stylesheet\' type=\'text/css\' href=\'css/speller.css\'>
    <link rel=\'stylesheet\' type=\'text/css\' href=\'css/redesign.css\'>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="js/speller.js"></script>
    <script
        type="text/javascript">$(document).ready(function () { data = [....................................
    </script>
<body ...........>
</body>
</html>

3. 응답에서 필요한 내용 추출 (html 파싱)

우리에게 필요한 건 <head>에서 세 번째 <script> 태그 안에 있는 data다. 실제로 우리가 전달한 텍스트 원문과 모든 교정 내용은 이 안에 담겨 있다. 물론 이 html 문서를 분해하기 위해서는 파이썬 웹 크롤링에서 주로 활용하는 BeautifulSoup를 불러와도 되지만, 애초에 문서 구조가 워낙 단순하고 우리가 원하는 자료의 위치가 분명하기 때문에, 그냥 단순한 문자열이라 생각하고 data = [부터 ];까지 슬라이스 해주면 그만이다.

4. 파이썬 딕셔너리 형식으로 변환

그리고 이렇게 잘라낸 문자열을 json.loads()를 사용해서 파이썬 딕셔너리 형태로 변환해주면 우리가 원하는 교정 내용을 불러올 수 있다. 사실상 끝난 셈.

이 딕셔너리 안에는 두 쌍의 키-값이 있는데, str의 값으로는 검사기에 요청한 텍스트 원본이 담겨 있고, errInfo의 값으로는 교정 내용이 리스트 형식으로 담겨 있다. 그리고 그 리스트 안의 원소들은 각각 딕셔너리 형식으로 교정 내용에 대한 상세한 값들을 담고 있다.

  • errorIdx : 교정 순서
  • correctMethod : 교정 방법 분류(?)
  • orgStr : 입력 내용
  • candWord : 대치어 (2개 이상일 경우 ‘’로 구분)
  • help : 도움말
  • start, end : 원문에서 입력어 위치

5. 교정 내용 출력

그냥 이 딕셔너리의 errInfo 값을 출력해도 되지만, 불필요한 내용도 많으니 필요한 정보만 보고 싶을 땐 이런 식으로 반복문을 돌아주면 보기 편하다.

1
2
3
4
5
for err in data['errInfo']:
    print(f"입력 내용 : {err['orgStr']}")
    print(f"대치어 : {err['candWord']}")
    print(f"도움말 : {err['help']}")
    print("\n")

파이썬으로 부산대 맞춤법 검사기 사용하기 끝.

참고로 부산대 맞춤법 검사기는 원문이 300어절이 넘어가면 한 번에 검사할 수 없다. 자바스크립트 형식으로 교정 내용을 돌려주기 때문에 웹 브라우저를 실제 동작하는 selenium 같은 라이브러리를 사용해서 페이지를 넘겨가며 이 요청을 반복해야 하는데, 그러면 복잡해지니까 차라리 원문을 300 어절 단위로 잘라서 돌리는 걸 추천한다.

풀리지 않은 나의 궁금증

교정 내용을 뜯어보면 correctMethod에 관한 정보가 있는데, 이게 뭔지 아직도 궁금하다. 일단 이것저것 돌려보면서 숫자로 1부터 7까지 나오는 걸 확인했는데, 맞춤법 오류의 성격을 카테고리로 구분하는 게 아닐까 싶다.

실제로 웹 브라우저 상에서 검사기를 돌릴 경우, 우측 교정 내용에서 입력어의 색상을 correctMethod에 따라 다르게 표현하고 있다. 이 UI 디자인과 관련해서는 pxd의 無異 님께서 해당 검사 사이트와 워크플로우의 리디자인 버전을 만들어 적용했다고 한다. (참고: 한국어 맞춤법/문법 검사기 리디자인) 근데 사실 난 이 글을 읽어봐도 색깔 구분의 원리를 잘 모르겠다. 부산대 검사기 공식 웹 페이지에서도 관련 정보를 찾을 수가 없었다.

결국 직접 이런저런 문장들을 웹 브라우저로도 동시에 테스트 해보며, 대략 아래와 같은 정보만 유추할 수 있었다. (도움말 예시도 몇 개 가져왔다.)

  • correctMethod: 1 (파란색)
    주로 사소한 띄어쓰기를 잡아내는데, 참고만 하면 좋은 수준이다.
    • 띄어쓰기 오류입니다. 대치어를 참고하여 띄어 쓰도록 합니다.
    • 철자 검사를 해 보니 이 어절은 분석할 수 없으므로 틀린 말로 판단하였습니다. 후보 어절은 이 철자검사/교정기에서 띄어쓰기, 붙여 쓰기, 음절대치와 같은 교정방법에 따라 수정한 결과입니다. 후보 어절 중 선택하시거나 오류 어절을 수정하여 주십시오. 단, 사전에 없는 단어이거나 사용자가 올바르다고 판단한 어절에 대해서는 통과하세요!!
    • 띄어쓰기 오류입니다. 맞춤법 표준안에 따르면 명사와 명사는 복합명사를 구성할 수 있습니다. 그러나 의미상으로 옳지 않거나 사용 빈도가 아주 낮은 복합 명사는 띄어 쓰시면 좋습니다. 굳이 붙여 쓰고자 할 때는 붙여 써도 무방합니다.
  • correctMethod: 2 (빨간색)
    오용어, 확실한 띄어쓰기 오류를 잡아낸다.
    • 바른 표현을 찾아 씁니다.
    • 용언 앞의 명사가 조사가 생략된 채로 쓰이면 각각을 띄어 쓰거나 그 명사의 문장성분에 맞는 조사를 되살려 쓰면 의미가 더욱 명확해집니다.
    • 불필요한 받침을 첨가하셨습니다. 대치어를 참고하여 바르게 표기하십시오.
    • 필요 없는 어미를 더한다든지, 모음이나 어미의 형태를 변형하지 말고 표준어 어미를 그대로 사용합니다. 특히 사투리나 통신 용어의 영향으로 문법에 맞지 않는 표기와 혼동할 수 있으니 주의해야 합니다.
    • 의존 명사는 앞의 어미와 띄어 써야 합니다. 또한 문장 성분이 다른 단어나 명사가 덧붙을 때는 각각의 단어를 띄어 씀이 바릅니다.[맞춤법 표준안 42조]
    • 수관형사와 수의존명사는 띄어 쓰는 것이 원칙이지만, 차례를 나타낼 때는 띄어 써도 붙여 써도 됩니다. 단, 강하게 검사하는 옵션에서는 띄어 쓰게 합니다. 또 차례를 나타내더라도 일관성은 유지해야 합니다.
    • 연결 어미나 조사 다음에 오는 단어는 띄어 써야 바릅니다.
    • 단위를 나타내는 명사는 띄어 씁니다. 특히 수관형사와 함께 사용하는 경우를 흔히 보는데 이때 뒤에 오는 의존명사(단위명사)와 띄어 씁니다.
    • 외래어 표기법 오류(일반)입니다. 대치어를 보고 바르게 쓰십시오.
    • [복합어 오류] 의미상 두 단어가 복합어를 만들기 어렵습니다. 그러니 입력 오류가 없다면 적당히 띄어 씁니다. 물론, 본 철자 검사 과정의 오류일 수도 있으니 이 도움말은 참고만 하시길 바랍니다.
  • correctMethod: 3 (하늘색)
    사소한 띄어쓰기를 점검하거나 더 나은 표현을 제안해준다.
    • 붙여 씁니다.
    • ‘일부 동사 앞에 쓰이어, 그와 같은 동작에 대한 금지나 불가능 따위의 부정을 뜻하는 말’의 뜻이면, ‘못’이 맞습니다.
    • ‘뜨겁다’라는 형용사를 아무런 거리낌없이 ‘박수’와 어울려 사용합니다. 흔히 은유적으로 사용한 예라고 볼 수 있으나 의미의 논리상 어긋나는 표현입니다. 본 철자 검사기는 다음과 같이 바꾸어 사용하시기를 권합니다. (예) 뜨거운 박수 (X) -> 우렁찬 박수, 힘찬 박수, 큰 박수 (O)
    • ‘국민이 모두’나 ‘모든 국민이’와 같은 표현이 더 적합합니다.
    • 외국인이 틀린 예입니다.
  • correctMethod: 4 (초록색)
    문체 오류나 용어 순화와 관련한 내용이 많이 등장한다.
    • 되도록 ‘의’를 겹쳐 쓰지 말아야 합니다.
    • 뜻으로 볼 때 바르지 않은 표현입니다.
    • 조사가 바르지 않습니다.
    • 조사 쓰임이 어색합니다.
    • 조사를 쓰지 않습니다.
    • 굳이 조사 ‘을/를/이/가’를 쓰지 않아도 된다면 쓰지 않습니다.
    • 수사 앞에 붙어 ‘그 숫자에 해당하는 차례’를 의미하는 ‘제(第)’는 접두사이니 붙여 써야 바릅니다.
    • ‘당하다’가 자동사나 타동사로 쓰일 경우는 띄어 씁니다. 그러나 ‘명사+당하다’의 형태로 자기가 원치 않는 일을 겪거나, 피해를 입음을 뜻할 때는 붙여 씁니다. 이때는 동작을 나타내는 일부 명사 뒤에 쓰여 피동사가 되게 하는 접미사 역할을 합니다.
  • correctMethod: 5 (파란색)
    주로 문장 부호 관련한 띄어쓰기 내용이다.
    • 우리말에서 온점(.)은 앞에 오는 말에는 붙여 쓰지만, 뒤에 오는 말과는 띄어 써야 바릅니다.
    • 공백이나 기호를 중복해서 썼거나 잘못 사용하였습니다.
    • 조사를 잘못 사용하였습니다. 흔히 모음의 발음이 유사하거나 입말투, 사투리의 영향으로 표기를 혼동하는 경우가 있습니다. 조사 오류는 다양하기 때문에 예에서 제시한 것 외에도 오류를 범할 수 있습니다. 오류가 지적되면 다시 확인해 보십시오.
  • correctMethod: 6 (???)
    (예시를 못 찾았지만 있을 거라고 생각함.)
  • correctMethod: 7 (파란색)
    영어 관련 표현을 지적한다. (hunspell은 오픈소스 한국어 맞춤법 사전인데, 도움말에서 이게 갑자기 여기서 왜 등장하는 건지도 모르겠고.)
    • 이 대치어는 Hunspell을 이용해 생성한 대치어입니다.

너무 궁금해서 일단 문의를 넣어봤더니 다음날 이렇게 바로 답장이 왔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
나라인포테크입니다.
 
맞춤법검사기에 깊은 관심을 가지고 계시다니, 정말 고맙습니다.
 
저희가 기본적으로는 색상 구분을 이렇게 합니다.
 
빨강: 오용어(틀린 단어)
파랑: 분석이 안 되서 강제로 띄어쓰기 등을 적용한 결과
초록: 앞/뒤 문맥의 정보를 보고 단어나 문맥을 교정하는 결과
 
그런데 최근 맞춤법 검사기를 두 번 돌려서 검사 결과를 내 놓다 보니, 초록색 결과가 많아졌습니다. 그 안에는 빨강, 파랑의 결과를 내는 오류도 같이 묻혀있습니다. 참고로만 보셨으면 합니다.
 
'correctMethod'도 도움말로 구분을 했었습니다. 그런데, 현재 검사기 교정 방법이 조금 바뀌었습니다.
따라서, 참고용으로만 보셨으면 합니다.
This post is licensed under CC BY 4.0 by the author.