[데이터 전처리] 재료명 정확도 높이기

이전 포스팅에서는 데이터를 파싱 하고 DB에 메뉴, 재료들을 저장하였습니다.

 

이번 포스팅에서는 저장된 이 재료명들을 정확성 있고 깔끔한 데이터로 전처리했던 방법을 설명하려 합니다.

 

전처리를 하는 이유는 Beatuifulsoup으로 파싱 했던 재료 내용들은 아무래도 사용자가 직접 입력한 양식이 일정하지 않은 재료들입니다.

 

그래서 이 데이터들을 제가 사용하기에 알맞게 일정한 양식으로 전 처리하는 과정이 필요합니다.

 

또한 word2 vec학습에 있어서 정확한 단어를 가지고 임베딩 하고 학습을 하는 것이 좀 더 정확도 높은 레시피 추천과 속도를 가져올 수 있기 때문입니다. 

 

 

데이 터전 처리 전에는 위 사진처럼 띄어쓰기나 'ZWSP국수' 와같이 불필요한 단어가 섞여있는 것을 확인할 수 있습니다. 

 

이외에도 '소고기 다시다' 이러한 단어들은 다시다와 중복이 되기 때문에 이를 최대한 내가 원하는 데이터로 전처리 과정이 필수적이라 할 수 있습니다.

 


1. DB에서 재료 모두 받아오기

 

우선 DB에 저장되어있는 재료들을 모두 받아옵니다.

    def makeIngredientToText(self):
        ingredientList = self.myDB.select_ingredient_iname()
        f = open('textFile/ingredientList.txt', mode='wt', encoding='utf-8')
        for ingredient in ingredientList:
            f.write(ingredient['iname'] + '\n')
        f.close()

DB에 저장되어있는 ingredient 테이블에서 select문을 이용하여 재료들을 ingredientList.txt 에 받아오기.

 

ingredientList.txt

ingredient.txt에 재료명들을 쭉 받아온 후 이를 가시적으로 확인하며 변경이 필요한 요소들을 찾고 이후 일괄적으로 변경할 코드를 작성하였습니다.

 

2. 특수문자 및 공백 제거

 

rf = open('textFile/ingredientList.txt', mode='rt', encoding='utf-8')
        
for line in rf:
    line = re.sub(pattern=patternBlank, repl='', string=line)
    line = re.sub(pattern=patternSymbol, repl='', string=line)

ingredientList.txt에서 보면 재료명에 공백과 '()*^[]'과 같은 특수문자가 많은 것을 확인할 수 있었고 모두 제거해주었습니다.

 

3. 명사 외 불필요한 품사 제거

 

재료명은 모두 명사이기 때문에 명사 이외에 모든 단어를 제거할 필요가 있습니다. 

 

예를 들면 볶은 콩, 두부 2모 와 같은 재료명들을 보면, '볶은'과 '2모'는 불필요한 단어이고 콩, 두부와 같은 명사만 필요하기 때문에 이를 처리해주어야 합니다.

 

이러한 분류를 위해서는 이미 훌륭한 형태소분석기들이 많이 만들어져 있고 알려져 있습니다.

 

그중에서도 okt, 한나눔, 꼬꼬마, 코모란 등 여러 분석기가 있습니다.

 

하지만 저는 데이터의 정확도를 매우 끌어올리고 싶었습니다.

 

그래서 직접 단어를 추가하고 단어의 우선순위를 정해 주고 싶기 때문에 이러한 사용자 설정이 가능한 mecab이라는 형태소 분석기를 이용했습니다.(mecab에 대한 내용은 다음에 간단하게 포스팅할 예정)

 

temp=self.mecab.nouns(line)

 

mecab에서 제공되는 nouns함수를 이용해 간단하게 string에서 명사를 분류할 수 있습니다. 그리고  mecab dictionary를 통해서 단어를 등록할 수 있고 우선순위를 정할 수 있습니다.

 

mecab.nouns()를 적용한 단어들

mecab.nouns를 적용하여보면 

야끼소바-> 야끼+소바

굴소스-> 굴+소스

이처럼 분류가 됩니다.

이는 mecab 사전에 굴소스랑 야끼소바가 단어로 등록되어있지 않거나 우선순위가 더 낮기 때문입니다. 

(이를 처리하는 내용은 다음 포스팅에서 할 예정)

 

4. 불용어 처리

 

마지막으로는 불용어 처리를 해주어야 합니다.

 

mecab을 이용하여 명사를 추출하더라도 불필요한 명사가 섞여 나옵니다.

 

mecab이 분석한 명사들이 제가 원하는 형태가 아닌 명사일 수 있기 때문입니다.

 

예를 들면 벨기에 아이스크림 -> 벨기에+아이스크림으로 mecab이 분류합니다. 벨기에도 정확한 명사이긴 하지만 word2 vec학습에는 재료만 필요하기 때문에 벨기에라는 단어를 불용어 처리해야 합니다.

 

이를 제거하기 위해서 미리 stopwordFilter.txt를 만들어 불용어를 저장해주고 분류된 명사들이 이 불용어 txt에 속했는지 확인하여 제거해주는 작업을 거쳤습니다.

 

이 불용어 처리 작업은 수작업으로 진행했습니다 ㅜㅜ

이런 정밀한 데이터 가공은 별다른 방도가 없는 것 같습니다.

 

이렇게 3번까지 적용된 단어를 보고 불용어를 정리했습니다.

 

데이터의 질을 높이기 위해서 6시간 정도 투자하여 6-700개의 불용어를 등록해주었습니다. 

 

5. 기타

 

이외에도 오타 단어, 중복 단어들을 제거하는 절차가 있지만 생략하겠습니다. 

 


 

데이터 전처리는 정말 손이 많이 가서 귀찮으면서도 중요한 작업인 것 같습니다

 

프로젝트를 시작하기 전에는 학습에 시간이 더 쓰이고 난관이 많을 줄 알았는데 그게 아녔네요 ㅎㅎ

 

크롤링부터 데이터 전처리까지 해본 게 처음이어서 그런지 많은 내용들을 찾으며 참고해야 했고 시도해야 했었습니다.

 

아무튼 크롤링과 데이터 전처리를 해보면서 데이터 분석가들이 멋있고 대단하다 느껴집니다..ㅎㅎ

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유