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']로 변경해주어야 한다.
* 다음 블로그에서 참고해서 작성했어요. 감사합니다
'Python & Code Issue' 카테고리의 다른 글
[AWS s3] Python Boto3의 list_objects_v2를 활용한 s3 데이터 불러오기 (0) | 2025.02.16 |
---|---|
[python] Pyspark local 환경 설정 및 AWS S3 데이터 읽기, Window 환경, Error 해결 (2) | 2025.01.25 |
[python] poetry 설치 가이드 및 에러 해결 (1) | 2024.11.21 |
[python] Konlpy Okt 사용자 사전 설정 가이드 (0) | 2024.09.03 |
[python] vscode anaconda 가상환경 설정 (1) | 2024.09.03 |