Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

짱이 될거야

2022-09-19(2): pandas csv 파일 맞춤법 검사 (with XML ParseError) 본문

Today I Learned

2022-09-19(2): pandas csv 파일 맞춤법 검사 (with XML ParseError)

jeong57 2022. 9. 19. 23:37

hanspell을 활용한 csv 맞춤법 검사

pandas를 활용해 csv를 가져오고, 그 중 한 열에 대해 모든 행의 맞춤법 검사를 했다. (hanspell 활용)

그 코드는 아래와 같다.

import pandas as pd
from hanspell import spell_checker

# Read csv file with pandas
data = pd.read_csv(PATH, encoding='cp949')

for description in data.description:
    result = spell_checker.check(description).checked    # 맞춤법 검사
    print(result)

참고

  • hanspell: 네이버에서 지원하는 한글 맞춤법 검사 라이브러리 (Python)
  • encoding='cp949': VMWare에 csv를 저장하는 과정에서 한글이 깨지고, 그것을 정상적으로 출력하기 위함.

 

xml.etree.ElementTree.ParseError

이렇게 했을 때, 결과가 제대로 출력되다가 갑자기 에러가 나면서 중단되었다.

그 에러 메세지는 다음과 같다.

xml.etree.ElementTree.ParseError: not well-formed (invalid token)

 

해당 코드에 대해서 구글링한 결과 대부분 XML 파일에 예약 문자가 포함되어 있기 때문에 에러가 발생한다고 말했다.

해결 방법은 아래와 같은 코드를 사용하는 것이었다.

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ElementTree, Element, SubElement, dump

xmltree=ET.parse(xml_file_name)
xmlroot = xmltree.getroot()
출처: https://kibua20.tistory.com/26 [모바일 SW 개발자가 운영하는 블로그:티스토리]

하지만 나는 코드에서 xml을 언급하지 않았고 구글링해서 찾은 코드들을 어떻게 사용해야 하는지도 몰랐다.

한 가지 확실한 것은 맞춤법 검사를 해야 하는 내용에 특수문자나 예약문자가 포함되어 있기 때문에 에러가 발생했다는 것이었다.

따라서 파이썬에서 특수문자를 없애는 방법을 찾는 것으로 조사 방향을 바꿨다.

 

Python에서 특수문자 제거

https://euriion.com/?p=413175 

 

파이썬 문자열에서 특수문자 제거하는 3가지 방법 - python 3 ways to remove punctuations from a string - 토탈

Python으로 특수기호 제거하는 예제입니다. 자연어처리, 크롤한 데이터 정제 등을 할 때 특수문자를 제거하거나 클린징을 해야 할 때...

euriion.com

위의 사이트를 참고했는데, 크게 translate() 함수를 사용하는 방법과 정규표현식(regular expression)을 사용하는 방법이 있었다.

translate() 함수를 사용했을 때는 이전보다는 조금 더 진행되었지만 마찬가지로 에러가 나면서 중도 종료되었고, 따라서 정규표현식을 사용했다.

import pandas as pd
from hanspell import spell_checker

# Read csv file with pandas
data = pd.read_csv(PATH, encoding='cp949')

for description in data.description:
    description.replace("\n", "").replace("\t", " ")	# 개행문자 제거
    pattern_punctuation = re.compile(r'[^\w\s]')    	# 정규표현식
    description = pattern_punctuation.sub('', description)
    result = spell_checker.check(description).checked	# 맞춤법 검사
    print(result)

먼저 "\n", "\t"를 없애고 정규표현식을 사용해 특수문자를 제거했더니 끝까지 끊기지 않고 결과가 잘 출력됐다.

 

배운 것

처음 xml ParseError가 났다고 했을 때, 가장 먼저 든 생각은 나는 xml을 코드에 쓴 적이 없는데? 였다.

구글링을 해봐도 계속 xml을 써서 오류를 해결하는 방법밖에 안나왔는데 그 코드 자체를 이해하지 못하니까 너무 답답하고 이게 맞는 해결책인가 의문이 들었다.

결국 "에러코드에 xml이 있으니까 xml을 건드리자!" 가 아니라 "특수, 예약문자 때문에 xml 에러가 발생했으니까 특수문자를 없애보자!"로 접근했더니 10분도 채 걸리지 않아서 해결할 수 있었다.

무엇보다 문제의 근본적인 원인을 파악하는 것이 중요함을 배울 수 있었다.

Comments