티스토리 뷰

이번 포스트는 텍스트 전처리 Part1의 띄어쓰기 교정에 이어서 맞춤법 교정 과정이다.

 

수집한 데이터가 인터넷 상의 댓글이기 때문에 역시나 맞춤법도 교정이 필수라고 생각했다. 

 

아래의 문장만 봐도 수집한 데이터의 맞춤법을 꼭 교정해야 한다는 것을 알 수 있다.

 

'나를 찾이 줘 잼있어요~ ㅎㅎ'

 

대화체와 인터넷 상에서 텍스트의 특징 상 맞춤법을 일부러 흘려쓰거나 (~~했자나), 표준어가 아닌 단어를 사용 (꾸르잼), 혹은 아예 알아들을 수 없는 말(재미잉엉요오ㅠ) 등을 꼭 교정해주어야 모델의 성능을 높일 수 있다.

 

맞춤법 교정을 위한 방법은 2가지를 고안했고, 2가지에 딱 맞는 방법을 찾을 수 있었다.

 

1. 부산대 맞춤법 교정기

 

1번인 부산대 맞춤법 교정기는 기본적인 맞춤법 뿐만 아니라, 은어, 외래어, 심지어 장난스럽게 변경된 문장 (더치페이 -> 덮집회의) 까지 교정이 가능하다. 

 

많은 맞춤법 교정기에 대한 정보를 찾아본 결과 1순위로 성능이 좋다고 느꼈던 부산대 맞춤법 교정기를 사용하여 맞춤법을 교정해주었다. 

 

github에 있는 파이썬 기반 부산대 맞춤법 교정기 라이브러리를 찾았지만 python2.x 기반으로 작성되었기 때문에...그냥 셀레니움으로 돌리기로 했다 (시간이 굉장히 오래걸리는 단점이 있다)

 

아래의 코드는 colab 기준의 부산대 맞춤법 교정기를 selenium을 활용해서 실행했던 코드이다.

!pip install Selenium
!apt-get update 
!apt install chromium-chromedriver

from selenium import webdriver
import time

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
wd = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
def spell_checking(sentence, text_list):
    for i in tqdm(range(len(sentence))):
        time.sleep(0.5)
        wd.get('http://speller.cs.pusan.ac.kr/')
        try:
            wd.find_element_by_xpath('//*[@id="text1"]').send_keys(sentence[i])
            wd.find_element_by_xpath('//*[@id="btnCheck"]').click()
            time.sleep(1)
            entity_num = 0
            while True:
                try:
                    wd.find_element_by_xpath('//*[@id="tdReplaceWord_'+str(entity_num)+'"]/ul/li/a').click()
                    entity_num += 1
                except:
                    break
            texts = wd.find_element_by_xpath('//*[@id="tdCorrection1stBox"]').text
            text_list.append(texts)
        except:
            text_list.append(sentence[i])
train_spell_list = []
test_spell_list = []

spell_checking(train['리뷰'], train_spell_list)
spell_checking(test['리뷰'], test_spell_list)
train['리뷰'] = train_spell_list
test['리뷰'] = test_spell_list

이 코드의 효율성이 좋을지는...모르겠지만, 주어진 상황에서는 최선이었던거 같다 (만약 더 효율적이고 좋은 코드를 짤 수 있다면 그저 나의 실력 부족일듯) 

 

어찌됐든 수정이 필요한 대치되는 단어들을 모두 변경한 텍스트를 리스트에 모아서 데이터에 넣어주었다. 

 

이런식으로 1차적인 맞춤법 교정을 완료하였다. 

 

2. py-hanspell (네이버 맞춤법 교정기 기반 라이브러리)

 

1차적인 맞춤법 교정을 끝냈지만 역시나 Selenium 기반의 코드는 한계가 있었다. 

 

제대로 대치가 되지 않은 채 나온 문장이 가끔씩 존재했고, 부산대 맞춤법 교정기 자체의 불량도 꽤나 있었기 때문에 맞춤법 교정 과정을 한번 더 수행하기로 했다.

 

2차로 사용한 맞춤법 교정기는 네이버 맞춤법 교정기 기반으로 짜여진 py-hanspell 라이브러리를 사용했다.

 

아래는 py-hanspell의 github이다.

github.com/ssut/py-hanspell

 

ssut/py-hanspell

파이썬 한글 맞춤법 검사 라이브러리. (네이버 맞춤법 검사기 사용). Contribute to ssut/py-hanspell development by creating an account on GitHub.

github.com

이런 좋은 코드를 만들어주시는 분들께 언제나 감사한 마음으로 살아가고 있다...언젠간 나도 실용적인 오픈소스 라이브러리를 만드는 날이 오지 않을까 생각하며 열심히 사용하고 있다 ..^^

 

쨌든 네이버 맞춤법 교정기를 2차적으로 사용한 이유가 따로 있었는데, 네이버 맞춤법 교정기는 은어나 아예 잘못 쓰여진 단어는 잡아내지 못하는 것으로 보인다.

 

즉 맞춤법 교정기 자체가 정말 맞춤법 (ex. 맞춤법을 맛춤법으로 쓰는 등)을 교정하는데에 최적화 되어있기 때문에 1차적으로 사용하는 것 보단 2차 검수용으로 사용하는게 맞다고 보았다.

 

아래는 py-hanspell을 이용하여 2차 맞춤법 검사를 진행한 코드이다.

!pip install git+https://github.com/ssut/py-hanspell.git
for i in tqdm(range(len(train))):
  try:
    result_train = spell_checker.check(train['리뷰'][i])
    train['리뷰'][i] = result_train.as_dict()['checked']
  except:
    pass
for i in tqdm(range(len(test))):
  try:
    result_test = spell_checker.check(test['리뷰'][i])
    test['리뷰'][i] = result_test.as_dict()['checked']
  except:
    pass

이 또한 정말 간단하게 교정을 진행할 수 있다. 

 

교정될 맞춤법이 존재한다면 교정 후 기존 데이터를 대체하도록 하였고, 아니라면 그냥 pass하도록 코드를 짰다.

 

위의 1차, 2차 맞춤법 교정을 통해 대부분의 데이터가 깔끔한 문장으로 교정되었고, 역시 마지막 검수는 인간지능을 통해 팀원들 다 같이 하나하나 검수하였다...(데이터 전처리는 정말 헬이다)

 

어찌됐든 텍스트 자체에 대한 정제와 전처리는 어느정도 잡힌 것 같다.

 

단어 정규화라던지, 불용어을 어떻게 처리할건지 등 아직 생각해야할 것이 많지만 위의 과정만 거쳤을때도 F1-score는 상당히 향상 되었다. 

 

다음 포스팅은 아마 불균형에 대한 문제를 어떻게 해결할 것인가?에 대해서 다뤄볼 것 같다!

반응형
댓글