파이썬 - 머신러닝 프로젝트 설명
OCR 추출 부터 이어지는 머신러닝을 활용한 프로젝트 네 번 째 포스팅 입니다.
제가 진행하는 프로젝트는 SMS로 수신되는 다양한 이미지 스팸(SPAM) 광고 문자(이미지)를 분석해서
텍스트를 분석 -> 출력 후 -> 데이터 정제 -> 기계학습 -> 데이터 확인(스팸 종류 및 여부) 확인
순서로 진행할 예정입니다.
오늘은 지금까지 전처리 된 텍스트 데이터를 데이터베이스에 저장하는 방법을 설명드리겠습니다.
데이터를 저장하는 작업은 중요한 작업입니다. 전처리 된 데이터는 해당 프로젝트 분석 결과를 결정하는
만큼 원천 데이터를 반드시 관련 데이터베이스 저장해야 합니다.
아울러, 지속적으로 데이터가 증가되는 환경 및 후에 데이터 재사용을 고려할 때 응답속도가 높은
데이터베이스 시스템을 선정하는 태스크 역시 중요한 작업이라 볼 수 있습니다.
그 중에서 저는 파이썬에서 손쉬운 API를 사용해서 핸들링 할 수 있고 많은 장점을 가지고 있는
MongoDB를 선정했습니다.
예제 소스를 첨부파일로 제공하므로, 관심이 있으신 분은 하단 설명을 참고해서 실습을 추천드립니다.
5회 정도의 포스팅으로 연재를 이어나갈 예정이며, 하단의 예제를 쉽게 따라하실 수 있게 정리하겠습니다.
이전 포스팅을 차근차근 읽어보시면 더욱 도움이 되실걸로 생각이 됩니다. - 관련 포스팅
파이썬 머신러닝 - mLab(MongoDB 호스팅) 가입 및 환경 설정
지난 세 번째 포스팅에서 달라진 점은 전처리가 완료 된 텍스트를 파이썬에서 쉽게 사용 가능한
PyMongo API를 활용해서 무료 MongoDB 호스팅 서비스인 mLab에 저장하는 프로세스를 추가하는
부분입니다.
mLab 서비스 회원 가입 및 DataBase, 콜렉션 생성에 관한 설명은 검색을 해보시면 너무나 자세하게
나와 있기 때문에 하단에 관련 링크를 첨부하는 것으로 설명을 대체합니다.
해당 블로그를 참고하신 후 회원 가입 -> DB 생성, 계정 생성 -> 콜렉션 생성 -> 접속 정보 확인
완료 후에 하단에 소스코드를 살펴보시면 쉽게 이해 하실 수 있습니다.
그럼 소스코드를 살펴볼까요?
main.py
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 from PIL import Image #pip install pillowfrom pytesseract import * #pip install pytesseractimport configparserimport sysimport ioimport osimport csvimport refrom 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! +++') cs
지난 예제와 비교해서 변경 및 추가된 라인에 대한 상세 설명
- 9번 라인 : 파이썬에서 MongoDB API 사용을 위한 pymongo 임포트(설치 필요)
- 21번 라인 : MongoDB API 접속 및 초기화 작업을 위한 함수 선언- 31번 라인 : 텍스트 데이터를 한 번에 MongoDB에 삽입 하도록 파이썬 리스트 선언- 100번 라인 : pymongo의 API 메소드인 insert_many를 통해서 전처리 된 모든 텍스트를 서버 DB에 저장
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! +++') | cs |
지난 예제와 비교해서 변경 및 추가된 라인에 대한 상세 설명
- 9번 라인 : 파이썬에서 MongoDB API 사용을 위한 pymongo 임포트(설치 필요)
- 21번 라인 : MongoDB API 접속 및 초기화 작업을 위한 함수 선언
property.ini
property.ini
1234567891011121314151617 [Bigdata Ocr Extract]Version= 1.0 [FilneName]CsvFileName= result.csv [Path]OriImgPath= \\resource\\orc_ori_imageOcrTxtPath= \\resource\\ocr_result_txtTxtCsvPath= \\resource\\ocr_result_csvTrainCsvPath= \\resource\\trainning_csv [System]DatabaseUrl= mongodb://<dbuser>:<dbpassword>@ds020228.mlab.com:20228/<database>DatabaseName= ''CollectionName= ''OperMode= 1 cs
- 1번 라인 : 프로그램 버전 명시- 5번 라인 : 저장 CSV 파일명
- 8번 라인 : 추출 할 원본 이미지 경로- 9번 라인 : 추출 된 텍스트 파일이 저장 될 경로- 10번라인 : 완성 된 CSV 파일이 저장 될 경로
- 11번라인 : 기계학습을 위한 CSV파일이 저장 될 경로
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 | cs |
- 1번 라인 : 프로그램 버전 명시
- 8번 라인 : 추출 할 원본 이미지 경로
- 11번라인 : 기계학습을 위한 CSV파일이 저장 될 경로
파이썬에서 MongoDB 사용을 위한 pymongo API의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬에서 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 |