파이썬으로 부산대학교 한국어 맞춤법 검사기 사용하기
웹에서 사용할 수 있는 한국어 맞춤법 검사기로 가장 대표적인 건 부산대학교 한국어 맞춤법/문법 검사기다. 맞춤법 교정에 신경을 써본 사람이라면 다 알고 있는, 현존하는 최고의 맞춤법 검사기다.
참고로 예전에 카카오에서도 맞춤법 검사기를 개발해서 API까지 공개한 적이 있었는데, 부산대 맞춤법 검사기를 개발한 권혁철 교수가 직접 카카오의 검사기는 부산대학교 검사기를 리버스 엔지니어링해서 개발한 거라고 비판하면서 큰 논란이 되었고, 결국 카카오는 서비스를 중단했다. (참고: 카카오, 표절 논란된 한글 맞춤법 검사기 API 공개 중단, 대형 포털들이 맞춤법 검사기를 공개했다, 그런데…)
그나마 사람들이 많이 사용하는 서비스로 네이버 맞춤법 검사기가 있긴 한데, 한 번에 최대 500자만 검사해주는 베타 버전이고 교정의 정확도도 부산대 검사기에 비해 안 좋다. 네이버 검사기를 사용하기 위한 파이썬 라이브러리 py-hanspell도 있긴 한데, 라이브러리라고 하기엔 기능이 너무나도 단순해서 굳이 설치해서 쓸 이유가 없어 보인다.
직접 부산대 검사기를 사용하는 파이썬 스크립트를 작성하게 된 이유이기도 하다.
아무튼 본 포스팅에서는 파이썬의 기본 라이브러리인 requests
를 활용해서 맞춤법 검사기 돌리는 방법을 소개한다. 핵심 코드는 10줄이 채 안 된다.
파이썬 코드 예시
코드에서 사용하는 라이브러리는 requests
, json
뿐이다. 파이썬 기본 라이브러리라 별도의 설치도 필요 없음.
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'도 도움말로 구분을 했었습니다. 그런데, 현재 검사기 교정 방법이 조금 바뀌었습니다.
따라서, 참고용으로만 보셨으면 합니다.