빅데이터 & 분석/Machine Learning

파이썬(Python) - 머신러닝 프로젝트(4) - mLab 호스팅 활용 MongoDB 연동

2018. 9. 9. 15:39
목차
  1. 파이썬 머신러닝 -  mLab(MongoDB 호스팅) 가입 및 환경 설정

파이썬  - 머신러닝 프로젝트 설명


OCR 추출 부터 이어지는 머신러닝을 활용한 프로젝트 네 번 째 포스팅 입니다.

제가 진행하는 프로젝트는 SMS로 수신되는 다양한 이미지 스팸(SPAM) 광고 문자(이미지)를 분석해서 

텍스트를 분석 -> 출력 후 -> 데이터 정제 -> 기계학습 -> 데이터 확인(스팸 종류 및 여부) 확인
순서로 진행할 예정입니다.


오늘은 지금까지 전처리 된 텍스트 데이터를 데이터베이스에 저장하는 방법을 설명드리겠습니다.

데이터를 저장하는 작업은 중요한 작업입니다. 전처리 된 데이터는 해당 프로젝트 분석 결과를 결정하는
만큼 원천 데이터를 반드시 관련 데이터베이스 저장해야 합니다.

아울러, 지속적으로 데이터가 증가되는 환경 및 후에 데이터 재사용을 고려할 때 응답속도가 높은 
데이터베이스 시스템을 선정하는 태스크 역시 중요한 작업이라 볼 수 있습니다. 

그 중에서 저는 파이썬에서 손쉬운 API를 사용해서 핸들링 할 수 있고 많은 장점을 가지고 있는
MongoDB를 선정했습니다.

예제 소스를 첨부파일로 제공하므로, 관심이 있으신 분은 하단 설명을 참고해서 실습을 추천드립니다.


5회 정도의 포스팅으로 연재를 이어나갈 예정이며, 하단의 예제를 쉽게 따라하실 수 있게 정리하겠습니다.

이전 포스팅을 차근차근 읽어보시면 더욱 도움이 되실걸로 생각이 됩니다. - 관련 포스팅




파이썬 머신러닝 -  mLab(MongoDB 호스팅) 가입 및 환경 설정


지난 세 번째 포스팅에서 달라진 점은 전처리가 완료 된 텍스트를 파이썬에서 쉽게 사용 가능한
PyMongo API를 활용해서 무료 MongoDB 호스팅 서비스인 mLab에 저장하는 프로세스를 추가하는
부분입니다.

mLab 서비스 회원 가입 및 DataBase, 콜렉션 생성에 관한 설명은 검색을 해보시면 너무나 자세하게 
나와 있기 때문에 하단에 관련 링크를 첨부하는 것으로 설명을 대체합니다.

mLab 회원 가입 및 데이터베이스, 콜렉션 생성 - 관련 포스팅(1), 관련 포스팅(2)

해당 블로그를 참고하신 후 회원 가입 -> DB 생성, 계정 생성 -> 콜렉션 생성 -> 접속 정보 확인
완료 후에 하단에 소스코드를 살펴보시면 쉽게 이해 하실 수 있습니다.

그럼 소스코드를 살펴볼까요?

main.py

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from PIL import Image            #pip install pillow
from pytesseract import *        #pip install pytesseract
import configparser
import sys
import io
import os
import csv
import re
from pymongo import MongoClient  #pip install pymongo -> Mongodb 관련 패키지 설치
 
#아톰 에디터에서 한글 출력 위해 선언
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
 
#Config Parser 초기화
config = configparser.ConfigParser()
#Config File 읽기
config.read(os.path.dirname(os.path.realpath(__file__)) + os.sep + 'envs' + os.sep + 'property.ini')
 
 
def initialDB():
    #Mongodb 접속 초기화
    client = MongoClient(config['System']['DatabaseUrl'])
    #데이터 베이스 획득
    db = client[config['System']['DatabaseName']]
    #콜렉션(Documents) 획득 및 전역 선언
    global nplKo
    nplKo = db[config['System']['CollectionName']]
    #DB 저장 데이터 리스트 변수 선언
    global spamList
    spamList = []
 
#이미지 -> 문자열 추출
def ocrToStr(fullPath, outTxtPath, fileName, lang='eng'): #디폴트는 영어로 추출
    #이미지 경로
 
    img = Image.open(fullPath)
    txtName = os.path.join(outTxtPath,fileName.split('.')[0])
 
    #추출(이미지파일, 추출언어, 옵션)
    #preserve_interword_spaces : 단어 간격 옵션을 조절하면서 추출 정확도를 확인한다.
    #psm(페이지 세그먼트 모드 : 이미지 영역안에서 텍스트 추출 범위 모드)
    #psm 모드 : https://github.com/tesseract-ocr/tesseract/wiki/Command-Line-Usage
    outText = image_to_string(img, lang=lang, config='--psm 1 -c preserve_interword_spaces=1')
 
    print('+++ OCT Extract Result +++')
    print('Extract FileName ->>> : ', fileName, ' : <<<-')
    print('\n\n')
    #출력
    print(outText)
    #추출 문자 텍스트 파일 쓰기
    strToTxt(txtName, outText)
 
#문자열 -> 텍스트파일 개별 저장
def strToTxt(txtName, outText):
    with open(txtName + '.txt', 'w', encoding='utf-8') as f:
        f.write(outText)
 
#텍스트파일 -> csv 파일 생성
def txtToCsv(txtName, cateName, outTxtPath, outCsvPath):
    #파일 사이즈가 0이면 패스(미추출 파일)
    if os.path.getsize(os.path.join(outTxtPath,txtName)) != 0:
        with open(os.path.join(outTxtPath, txtName), 'r', encoding='utf-8') as r:
            with open(os.path.join(outCsvPath, config['FilneName']['CsvFileName']),'a',  encoding='utf-8', newline='') as w:
                writer = csv.writer(w, delimiter=',')
                clText = cleanText(r.read())
                writer.writerow([cateName, clText])
                spamList.append({"category" : cateName, "contents": clText})
 
#텍스트 정제(전처리)
def cleanText(readData):
    #스팸 메세지에 포함되어 있는 특수 문자 제거
    text = re.sub('[-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》]', '', readData)
    #양쪽(위,아래)줄바꿈 제거
    text = text.strip('\n')
    return text
 
#메인 시작
if __name__ == "__main__":
    #MongoDB 관련 초기화
    initialDB()
    #텍스트 파일 저장 경로
    outTxtPath = os.path.dirname(os.path.realpath(__file__))+ config['Path']['OcrTxtPath']
    #CSV 파일 저장 경로
    outCsvPath = os.path.dirname(os.path.realpath(__file__))+ config['Path']['TxtCsvPath']
 
    #OCR 추출 작업 메인
    for root, dirs, files in os.walk(os.path.dirname(os.path.realpath(__file__)) + config['Path']['OriImgPath']):
        for fname in files:
            fullName = os.path.join(root, fname)
            #한글+영어 추출(kor, eng , kor+eng)
            ocrToStr(fullName, outTxtPath, fname,'kor+eng')
 
    #CSV 변환 작업 메인
    for fname in os.listdir(os.path.dirname(os.path.realpath(__file__))+ config['Path']['OcrTxtPath']):
        cateName = ''.join([i for i in fname if not i.isdigit()]).split('.')[0].strip()
        txtToCsv(fname, cateName, outTxtPath, outCsvPath)
 
    #추출 후 정제된 모든 데이터를 DB에 저장
    nplKo.insert_many(spamList)
    #작업 완료 메시지
    print('+++ OCR Image >> Text >> CSV Convert Complete! +++')
Colored by Color Scripter
cs

지난 예제와 비교해서 변경 및 추가된 라인에 대한 상세 설명

- 9번 라인 : 파이썬에서 MongoDB API 사용을 위한 pymongo 임포트(설치 필요)
- 21번 라인 : MongoDB API 접속 및 초기화 작업을 위한 함수 선언
- 31번 라인 : 텍스트 데이터를 한 번에 MongoDB에 삽입 하도록 파이썬 리스트 선언
- 100번 라인 : pymongo의 API 메소드인 insert_many를 통해서 전처리 된 모든 텍스트를 서버 DB에 저장



property.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Bigdata Ocr Extract]
Version= 1.0
 
[FilneName]
CsvFileName= result.csv
 
[Path]
OriImgPath= \\resource\\orc_ori_image
OcrTxtPath= \\resource\\ocr_result_txt
TxtCsvPath= \\resource\\ocr_result_csv
TrainCsvPath= \\resource\\trainning_csv
 
[System]
DatabaseUrl= mongodb://<dbuser>:<dbpassword>@ds020228.mlab.com:20228/<database>
DatabaseName= ''
CollectionName= ''
OperMode= 1
Colored by Color Scripter
cs

- 1번 라인 : 프로그램 버전 명시
- 5번 라인 : 저장 CSV 파일명
- 8번 라인 : 추출 할 원본 이미지 경로
- 9번 라인 : 추출 된 텍스트 파일이 저장 될 경로
- 10번라인 : 완성 된 CSV 파일이 저장 될 경로
- 11번라인 : 기계학습을 위한 CSV파일이 저장 될 경로

파이썬에서 MongoDB 사용을 위한 pymongo API의 추가적인 상세 설명은 이 곳을 참고해 주세요.




파이썬 머신러닝 - mLab(MongoDB 호스팅) 연동 및 저장 작업 결과 확인 


실제 소스코드 실행 화면(1) - 콘솔 출력



실제 소스코드 실행 화면(2) - OCR 텍스트 추출 TXT 및 CSV 파일 확인



실제 소스코드 실행 화면(3) - MongoDB Hosting mLab 서비스 연동 & 저장 확인


mLab에서 제공하는 무료 호스팅 서비스에 전처리 완료 된 데이터들이 Json 포멧 형식으로 정상적으로 저장
되는 것을 확인 하실 수 있습니다.

또한, 해당 데이터들이 누적될 수록 이미지에서 추출(OCR) 된 텍스트를 바탕으로 스팸 텍스트 분류 정확도
향상을 위한 기계학습 훈련에 효율적으로 사용 될 것으로 생각됩니다. 



마무리

오늘 포스팅에서는 학습 결과의 정확도를 결정하는 전처리 된 데이터를 보관 하기 위해서 MongoDB 호스팅
서비스를 를 활용하는 예제를 작성해보았습니다.

다음 마지막 포스팅에서는 파이썬의 KoNLPy 패키지의 트위터 형태소 분석기 및 Scikit-learn 등을
활용해서 추출 된 스팸이미지의 텍스트를 분석해서 스팸 및 햄 여부, 스팸 형식의 분류 등을 학습하는
코드를 작성해서 결과 값 및 정확도를 확인하겠습니다.

이해가 잘 안되시는 분들은 반드시 하단에 소스파일을 다운로드 후 차근차근 분석해 보시면 전체 내용 
학습에 큰 도움이 되실거라 생각됩니다.


다음포스팅에서 전체 프로젝트의 마지막 내용을 이어나가도록 하겠습니다. 감사합니다.

소스코드 다운로드 :  python_bigdata(3).zip



저작자표시 동일조건 (새창열림)

'빅데이터 & 분석 > Machine Learning' 카테고리의 다른 글

파이썬(Python) - Scikit Learn 의사결정트리(Decision Tree) 시각화 예제  (8) 2018.12.14
파이썬(Python) - 머신러닝 프로젝트(최종) - 나이브 베이즈 스팸 필터링  (26) 2018.09.23
파이썬(Python) - 머신러닝 프로젝트(3) - 문자열 가공 및 TXT 및 CSV 저장  (9) 2018.07.27
파이썬(Python) - 머신러닝 프로젝트(2) - OCR 이미지 문자열 추출(파이썬)  (12) 2018.07.23
파이썬(Python) - 머신러닝 프로젝트(1) - OCR 이미지 문자열 추출(Tesseract)  (7) 2018.07.15
  1. 파이썬 머신러닝 -  mLab(MongoDB 호스팅) 가입 및 환경 설정
'빅데이터 & 분석/Machine Learning' 카테고리의 다른 글
  • 파이썬(Python) - Scikit Learn 의사결정트리(Decision Tree) 시각화 예제
  • 파이썬(Python) - 머신러닝 프로젝트(최종) - 나이브 베이즈 스팸 필터링
  • 파이썬(Python) - 머신러닝 프로젝트(3) - 문자열 가공 및 TXT 및 CSV 저장
  • 파이썬(Python) - 머신러닝 프로젝트(2) - OCR 이미지 문자열 추출(파이썬)
[좋은사람]
[좋은사람]
좋은사람의 개발 노트 입니다.
[좋은사람]
좋은사람의 개발 노트
[좋은사람]
전체
오늘
어제
  • 전체보기 (189)
    • 언어 (68)
      • Java (12)
      • Python (39)
      • C# (5)
      • PHP (4)
      • Go (8)
    • OS (18)
      • Linux (7)
      • Windows 10 (5)
      • Etc (6)
    • 빅데이터 & 분석 (8)
      • R (0)
      • Machine Learning (8)
    • 네트워크 (4)
      • Etc (4)
    • 웹 프론트 (25)
      • Javascript & ECMA (8)
      • Vue (13)
      • React (4)
    • 웹 백엔드 (15)
      • Spring (3)
      • Django & Flask (7)
      • Npm & Express (5)
    • 개발도구 (18)
      • Jetbrains (3)
      • Eclipse (5)
      • Git (4)
      • Atom & VScode (6)
    • 데이터베이스 (7)
      • Oracle (2)
      • MariaDB & MySQL (2)
      • Etc (3)
    • 모바일 (6)
      • Android (3)
      • Hybrid (3)
    • 라이프 (20)
      • 여행 & 일상 (6)
      • 취미 (14)

블로그 메뉴

  • 홈으로
  • 블로그소개
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 아톰 에디터
  • react
  • nodejs
  • javascript
  • python
  • 3DS
  • ps4
  • Eclipse
  • 코딩 면접
  • Django
  • 2DS
  • Thread
  • C#
  • 미뮤
  • flask
  • SpringSTS
  • php
  • Git
  • centos
  • 윈도우10
  • 이클립스
  • ATOM
  • 디자인패턴
  • CFW
  • OCR
  • 커펌
  • 리액트
  • 개발자 면접
  • Database
  • 인텔리j
  • npm
  • go
  • 머신러닝
  • windows10
  • vue.js
  • Linux
  • ubuntu
  • Java
  • Anaconda
  • Algorithm

최근 댓글

최근 글

hELLO · Designed By 정상우.
[좋은사람]
파이썬(Python) - 머신러닝 프로젝트(4) - mLab 호스팅 활용 MongoDB 연동
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.