Python & Code Issue

[python] py-Hanspell KeyError 에러 코드 해결 방법

cherie-ssom 2024. 9. 3. 14:20

Hanspell을 사용하면서 나타나는 Error들을 정리해보고자 한다.

* 사용환경은 Window 기준

 

다양한 해결 방법을 찾아보다가 우연히 한 블로그를 통해 해결 방법을 찾게 되었다.

다음에 또 잊어버리지 않기 위해서 해결 방법들을 정리해 보았다..

 

우선 설치를 진행해야 하는데, 현재 pip 설치 경로가 조금 바뀌었다.

pip install git+https://github.com/Seokhyeon-Park/hanspell.git

다음과 같은 코드로 최신 hanspell을 설치할 수 있다.

 

하지만, 이렇게 설치한다고 해서 KeyError가 근본적으로 해결되는 것이 아니었다.

나의 경우 다음과 같은 에러가 발생했다.

 

from hanspell import spell_checker

spelled_checked_text = []
for lst in reviews_df['content_lst']:
    result = spell_checker.check(lst)
    spelled_text = result.checked
    spelled_checked_text.append(spelled_text)

reviews_df['spelled_checked_text'] = spelled_checked_text
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[18], line 8
      6 spelled_checked_text = []
      7 for lst in reviews_df['content_lst']:
----> 8     result = spell_checker.check(lst)
      9     spelled_text = result.checked
     10     spelled_checked_text.append(spelled_text)

File c:\Users\MY\anaconda3\lib\site-packages\hanspell\spell_checker.py:74, in check(text)
     70 data = json.loads(r.text)
     72 # print("r - data : ", data)
---> 74 html = data['message']['result']['notag_html']
     75 result = {
     76     'result': True,
     77     'original': text,
   (...)
     81     'words': OrderedDict(),
     82 }
     84 # ElementTree의 iter()를 써서 더 좋게 할 수 있는 방법이 있지만
     85 # 이 짧은 코드에 굳이 그렇게 할 필요성이 없으므로 일단 문자열을 치환하는 방법으로 작성.

KeyError: 'result'

Error가 난 부분을 보면 설치된 라이브러리 spell_checker.py에서 html = data['message']['result']['notag_html'] 해당 부분에 무언가 문제가 있음을 알 수 있다.

 

여러 가지 찾아보다가 네이버 맞춤법 검사기의 payload 부분이 지속적으로 변경되면서 발생하는 Error인 듯싶었다.

따라서 이 문제를 해결하려면 라이브러리의 spell_checker.py의 코드 일부를 수정해주어야 했다.

(물론 사용할 때마다^^.. 하루, 이틀은 괜찮지만 일정 시간 이상이 지나면 계속 바뀌는 듯..)

 

1. 네이버 맞춤법 검사기 검색 후 개발자 도구 들어가기

개발자 도구를 킨 상태에서 오른쪽 상단의 networks를 누른다.

이때, 네이버 맞춤법 검사기에 글을 하나 써주고 '검사하기'를 누른다.

(개발자 도구를 킨 상태에서 검사하기를 눌러야 payload의 값들을 볼 수 있다)

 

예시

검사하기를 누르고 개발자 도구에서 분홍색으로 표시해 둔 부분을 클릭 후 payload를 누르면 다음과 같은 화면이 뜬다.

예시

여기에서 passportKey와 _: 이 두 개의 값을 확인한다.

 

2. 파일 수정을 위한 설치된 라이브러리의 경로 확인 및 .py 파일 수정

import hanspell
print(hanspell.__file__)

> c:\Users\MY\anaconda3\lib\site-packages\hanspell\__init__.py

 

앞서 Error 코드에 spell_checker.py에서 에러가 났기 때문에, 다음과 같은 경로에서 해당 파일을 켜준다.

그리고 코드에서 payload 부분을 확인해 보면 개발자 도구에 payload 값과 다름을 알 수 있다.

따라서, 코드 부분에 개발자 도구에서 확인한 payload 값을 복사해서 붙여 넣어 준다.

# 기존 코드
payload = {
        'passportKey': 'c384b2ff8b3456f9338af70b63f1e611131353bf',
        'where': 'nexearch',
        'color_blindness': 0,
        '_': 1702974192406,
        'q': text
    }


# 수정 코드

payload = {
        'passportKey': '4c1a4e91696c678085b86d47abc3776b3fc19814', # 변경
        'where': 'nexearch',
        'color_blindness': 0,
        '_': 1725607824079, # 변경
        'q': text
    }

 

이렇게 해서 나는 KeyError가 나는 것을 해결할 수 있었다.

하지만, 나의 경우 맞춤법 검사가 진행된 데이터를 df의 새로운 열로 넣어주고 싶었지만, 돌리다 보면 간혹 맞춤법 검사가 불가한 문장들이 있기 때문에 그런 문장들은 원문을 다시 가져오도록 예외문을 걸어주었다.

from hanspell import spell_checker
import xml.etree.ElementTree as ET

spelled_checked_text = []
for lst in df['content']:
    try:
        result = spell_checker.check(lst)
        spelled_text = result.checked
    except ET.ParseError:
        spelled_text = lst  # 오류 발생 시 원래 텍스트 사용
    except Exception as e:
        spelled_text = lst  # 기타 예외 발생 시 원래 텍스트 사용
        print(f"Error processing text: {lst}\nException: {e}")
    
    spelled_checked_text.append(spelled_text)

df['spelled_checked_text'] = spelled_checked_text

 

데이터가 많으면 많을수록 시간이 오래 걸렸다. 나의 경우 한 시간 정도 걸리는 것도 있었다...

사실 해당 맞춤법 검사기로 모든 문장을 완벽하게 수정할 순 없었다. 

그래서 일부분은 replace 함수를 사용해서 수동 수정을 해줄 수밖에 없었다. (더 좋은 방법이 생각나지 않았기에...)

 

이렇게 해서 hanspell의 KeyError 문제를 해결해 보았다.

 

* 참고로 KeyError 부분에 html = data['message']['result']['html'] 라고 작성되어 있다면, 이 부분에서도 Error가 발생하기 때문에  spell_checker.py에서 html = data['message']['result']['notag_html']로 변경해주어야 한다.

 

* 다음 블로그에서 참고해서 작성했어요. 감사합니다

https://seokbong.tistory.com/223