반응형

이번 포스팅은 SVD를 이용한 추천시스템 2번째 글입니다. 저는 Oracle과 연동하여 사용하였습니다.

SVD에 대한 이해가 필요하다면 이전 글을 보고 와주세요 ↓↓↓↓↓

 

 

[Python] SVD를 이용한 추천 시스템 만들기 - 1

안녕하세요 이번엔 SVD를 이용한 추천 시스템을 소개해 보려고 합니다. 그전에 SVD에 대해 간략히 소개해드리겠습니다. https://angeloyeo.github.io/2019/08/01/SVD.html 특이값 분해(SVD) - 공돌이의 수학정리

maxtime1004.tistory.com

 

저는 아래의의 깃허브 내용을 토대로 jupyter notebook으로 진행하였고 저에게 맞춰서 조금씩 변형하였습니다.

원본 코드를 보고 싶으시면 아래의 주소로 가주세요 ↓↓↓↓↓

 

lsjsj92/recommender_system_with_Python

recommender system tutorial with Python. Contribute to lsjsj92/recommender_system_with_Python development by creating an account on GitHub.

github.com

 

 

저의 본 포스팅을 보시고 전체 코드를 원하신다면 밑의 github 주소로 들어가서 확인하세요↓↓↓↓↓

 

dpwls64/profit_recommand

Contribute to dpwls64/profit_recommand development by creating an account on GitHub.

github.com

 

* 참고

- 테스트용으로 만든거라 데이터가 보기 좋은 형태가 아닐 수도 있는데 이점은 양해부탁드려요 ㅜㅜ

- 필요한 테이블은 2개인데 하나는 강의(강의번호, 강의제목) 데이터가 들어있는 테이블,

   하나는 강의에 대한 평점(사용자아이디, 강의번호, 평점) 데이터가 들어있는 테이블이 필요합니다.

- 저의 목적은 강의 하나당 추천 강좌 5개의 데이터를 DB로 넣어서 활용하려고 합니다.

  최종 테이블에는 이러한 형태로 들어갈 것 입니다. 방법을 이해하셔서 본인에게 맞게 변경하여 사용하세요.

 

* SVD 추천 시스템 

 

1. 필요한 패키지를 import 합니다.

 

2. 현재 DB에 등록되어 있는 강의 테이블을 가져옵니다. 필요에 따라 안의 sql문은 바꿔주세요.

 

3. 같은 방식으로 평점 테이블도 가져옵니다.

 

4.  강의 번호를 기준으로 두 테이블을 합칩니다.

 

5. SVD 를 수행하기 위한 데이터 형태를 맞춰줍니다.

 

6. 다음과 같이 특이값 분해를 진행합니다.

 

7. 그래프를 그려봅니다.

 

8. 강의 번호와 그에 따른 추천 강의 5개를 추출합니다.

 

9. 형태에 맞게 데이터를 추가 합니다.

반응형
반응형

안녕하세요 이번엔 SVD를 이용한 추천 시스템을 소개해 보려고 합니다.

그전에 SVD에 대해 간략히 소개해드리겠습니다.

 

 

특이값 분해(SVD) - 공돌이의 수학정리노트

 

angeloyeo.github.io

 

저는 이분의 글을 참고하여 개념을 익혔지만 사실 수학적인 부분은 깊게 이해하지 못했기 때문에 추천시스템을 활용하기 위한 정도만 학습하였고, 제 이해를 바탕으로 글을 작성하는 것이기 때문에 깊은 이해를 원하시면 위의 링크나 따로 검색을 이용해 주세요!!

 

 

* 배경 지식 

 

먼저 고유값 분해(EVD)가 있습니다. 고유값 분해는 정방행렬에 대해서만 적용 가능하여 한계가 존재합니다.

따라서 정방 행렬이 아닌 m x n 행렬에 적용될 수 있게 일반화된 EVD가 SVD 입니다.

즉, 특이값 분해(Singular Value Decomposition, SVD)의 정의는 임의의 m x n 차원의 행렬 A에 대하여 행렬을 분해할 수 있는 방법 중에 하나입니다.

 

 

* 특이값 분해의 기하학적 의미 

 

직교하는 벡터 집합에 대하여, 선형 변환 후에 그 크기는 변하지만 여전히 직교할 수 있게되는 그 직교 집합은 무엇인가?

그리고 선형 변환 후의 결과는 무엇인가?

 

 

* 특이값 분해의 활용 

 

특이값 분해는 분해되는 과정보다 분해된 행렬을 다시 조합하는 과정에서 그 응용력이 빛을 발합니다.

A행렬을 특이값 p개 만을 이용해 A' 라는 행렬로 부분복원이 가능합니다.

특이값의 크기에 따라 A의 정보량이 결정되기 때문에 값이 큰 몇개의 특이값들을 가지고도 충분히 유용한 정보를 유지할 수 있습니다.

 

 

특이값 분해를 통해  부분 복원을 하여 사진을 더욱 선명하게 만들 수도 있습니다.

 

SVD를 이용한 실습 예제를 보고 싶으시면 다음 글을 클릭해주세요↓↓↓↓↓

 

[Python] SVD를 이용한 추천시스템 만들기 - 2

이번 포스팅은 SVD를 이용한 추천시스템 2번째 글입니다. 저는 Oracle과 연동하여 사용하였습니다. SVD에 대한 이해가 필요하다면 이전 글을 보고 와주세요 ↓↓↓↓↓ https://maxtime1004.tistory.com/90 [Py

maxtime1004.tistory.com

 

반응형
반응형

안녕하세요. 오늘은 파이썬과 Oracle을 이용하여 데이터 베이스를 가져오는 방법을 소개해드리겠습니다.

 

 

˙사전 준비 

 

Oracle 에서 접속할 계정의 이름 비밀번호, 호스트 이름, 포트번호, SID를 알고 있어야 합니다.

 

 

 

˙테이블 정보 

 

<TABLE1>

저는 이름이 TABLE1인 테이블을  가지고 오겠습니다.

 

 

 

˙코드 설명 

 

import cx_Oracle 

sql =   """
        select col1, col2 
        from table1
        """
conn = cx_Oracle.connect('python/python@localhost:1521/xe')
# conn = cx_Oracle.connect('접속이름/비밀번호@호스트이름:포트번호/SID)
cs = conn.cursor()
rs = cs.execute(sql)

cx_Oracle 모듈을 import 하고 sql 에 자신이 실행하고 싶은 sql 문장을 적습니다.

그 후 Oracle과 접속하여 sql문을 실행합니다.

 

col1 = []
col2 = []

for record in rs:
    col1.append(record[0])
    col2.append(record[1])
print("col1 : ", col1)
print("col2 : ", col2)

sql 결과를 for문을 이용하여 가져옵니다.

이때 컬럼 별로 정보를 저장하고 싶으면 배열에 각각 저장 할 수 있습니다.

 

 

 

˙실행 결과 

 

각각의 컬럼의 정보가 배열에 담긴 것을 확인할 수 있습니다.

 

 

 

˙전체 코드 

 

import cx_Oracle 

sql =   """
        select col1, col2 
        from table1
        """
conn = cx_Oracle.connect('python/python@localhost:1521/xe')
cs = conn.cursor()
rs = cs.execute(sql)

col1 = []
col2 = []

for record in rs:
    col1.append(record[0])
    col2.append(record[1])
print("col1 : ", col1)
print("col2 : ", col2)

 

반응형
반응형

 

안녕하세요. 오늘은 파이썬을 통해 이메일 보내는 법을 소개해드리겠습니다.

 

 

˙사전준비 

 

저는 네이버 계정을 사용하였는데 먼저 메일로 들어가서 하단의 환경설정으로 들어갑니다.

그 후 POP3/IMAP 설정 으로 들어가 사용함으로 체크해줍니다.

 

 

 

˙코드 설명 

 

import smtplib                             
from email.mime.text import MIMEText

먼저 메일을 보내기 위한 SMTP 모듈을 import 해줍니다.

 

smtpName = "smtp.naver.com"                 
smtpPort = smtp 포트 번호                          

sendEmail = "나의 네이버 계정"
password = "나의 네이버 비밀번호"
recvEmail = "받는 사람 이메일"

 

아까 환경설정을 해주었던 네이버 메일 페이지 하단에 보면 smtp 포트 번호를 적어주시고,

보내는 사람, 비밀번호, 받는 사람을 적어주시면 됩니다.

 

title = "파이썬~~"                                 
content = "안녕하세용"                                

메일의 제목과 내용을 입력합니다.

 

msg = MIMEText(content)                       
msg['From'] = sendEmail
msg['To'] = recvEmail
msg['Subject'] = title

읽어들인 파일의 텍스트를 MIME 객체화 합니다.

 

s = smtplib.SMTP(smtpName , smtpPort)         
s.starttls()                                  
s.login(sendEmail , password)                 
s.sendmail(sendEmail, recvEmail, msg.as_string())  
s.close()                                     

메일 서버로 연결 후 이메일을 보내고, 서버 연결을 종료합니다.

 

받는 사람의 메일로 가보면 성공적으로 전송된 것을 확인하실 수 있습니다.

 

 

 

˙전체 코드 

import smtplib                             
from email.mime.text import MIMEText

smtpName = "smtp.naver.com"                  
smtpPort = 포트번호                              

sendEmail = "나의 네이버 계정"
password = "나의 네이버 비밀번호"
recvEmail = "받는 사람 이메일"

title = "파이썬~~"                                
content = "안녕하세용"                                

msg = MIMEText(content)                      
msg['From'] = sendEmail
msg['To'] = recvEmail
msg['Subject'] = title                   

s = smtplib.SMTP(smtpName , smtpPort)         
s.starttls()                                
s.login(sendEmail , password)                 
s.sendmail(sendEmail, recvEmail, msg.as_string()) 
s.close()                                     
반응형
반응형

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.

준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다.

 

maxtime1004.tistory.com/37

 

[PYTHON] tesseract를 이용한 자동차 번호판 인식기 - 1

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다. 저는 아래의 영상을 통해 도움을 얻었고 해당 영상에도 링크에 깃허브 주소가 있으니 참고하실 분들은 아래 링크

maxtime1004.tistory.com

 

 

˙ 코드 및 실행 결과 

 

전체 코드는 더 많은 내용을 담고 있기 때문에 대략적으로 간단히만 설명 드리겠습니다. 전체 코드는 아래 깃허브에서 확인하실 수 있습니다.

github.com/dpwls64/tesseract_project

 

dpwls64/tesseract_project

Contribute to dpwls64/tesseract_project development by creating an account on GitHub.

github.com

 

1. 자동차 번호판 위치 알아내기

 

- 원본 이미지

 

- 이미지 흑백화

gray = cv2.cvtColor(img_ori, cv2.COLOR_BGR2GRAY)

 

- 가우시안 블러 : 노이즈 줄이기

img_blurred = cv2.GaussianBlur(gray, ksize=(5, 5), sigmaX=0)

 

- 스레시 홀드 : 이미지 구별 쉬움 (흑색, 흰색)

img_thresh = cv2.adaptiveThreshold(
    img_blurred, 
    maxValue=255.0, 
    adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    thresholdType=cv2.THRESH_BINARY_INV, 
    blockSize=19, 
    C=9
)

가우시안 블러를 이용하여 이미지를 흐릿하게 만들어 노이즈를 줄여주고,

스레시 홀드를 이용하여 이미지를 검정색, 흰색으로만 표현하여 컴퓨터가 구별하기 쉽게 만들어 줍니다.

 

 

- 윤곽선 찾기

contours, _ = cv2.findContours(
    img_thresh, 
    mode=cv2.RETR_LIST, 
    method=cv2.CHAIN_APPROX_SIMPLE
)

 

- 윤곽선 중 사각형 찾기

for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(temp_result, pt1=(x, y), pt2=(x+w, y+h), color=(255, 255, 255), thickness=2)

찾은 사각형 중에서 점차적으로 번호판과 가깝다고 생각하는 사각형들을 찾습니다.

 

- 번호판 각도 돌리기

 rotation_matrix = cv2.getRotationMatrix2D(center=(plate_cx, plate_cy), angle=angle, scale=1.0)
 img_rotated = cv2.warpAffine(img_thresh, M=rotation_matrix, dsize=(width, height))

비뚤어져 있는 번호판을 일자로 되도록 돌리고, 이미지를 더 선명하게 해줍니다.

2. 번호판 글자 인식하기 (tesseract)

chars = pytesseract.image_to_string(img_result, lang='kor', config='--psm 7 --oem 0')

result_chars = ''
has_digit = False
for c in chars:
if ord('가') <= ord(c) <= ord('힣') or c.isdigit():
if c.isdigit():
has_digit = True
result_chars += c

숫자와 한글로 이미지를 인식하여 결과를 추출합니다.

반응형
반응형

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.

저는 아래의 영상을 통해 도움을 얻었고 해당 영상에도 링크에 깃허브 주소가 있으니 참고하실 분들은 아래 링크를 확인하시면 됩니다.

 

www.youtube.com/watch?v=PpTl7xxGXh4

<빵형의 개발도상국 - 자동차 번호판 인식기>

 

 

˙ 준비 과정 

 

- pytesseract 설치

 

anaconda 창이나 cmd창을 이용하여 아래의 명령어를 통해 패키지를 설치합니다.

pip install pytesseract

 

 

- tesseract-OCR 설치

 

github.com/UB-Mannheim/tesseract/wiki

 

UB-Mannheim/tesseract

Tesseract Open Source OCR Engine (main repository) - UB-Mannheim/tesseract

github.com

 

위의 링크로 들어가서 자신의 PC의 맞는 파일을 다운로드 합니다. 저는 64bit를 다운받았고, 설치 경로는 바꾸지 않고 기본 경로로 설치합니다.

<다운로드 파일 선택>

 

 

- kor.traineddata 넣기

 

파일을 다운받아 아래의 경로에 추가합니다. 파일과 전체코드는 아래 깃허브에서 다운받으실 수 있습니다.

github.com/dpwls64/tesseract_project

 

dpwls64/tesseract_project

Contribute to dpwls64/tesseract_project development by creating an account on GitHub.

github.com

[ 파일경로 ]  C:\Program Files\Tesseract-OCR\tessdata

 

 

- 환경변수 설정

제어판 - 시스템 및 보안 - 시스템
고급시스템 – 환경변수 – 시스템변수 – Path 맨 위에 C:\Program Files\Tesseract-OCR 추가

 

준비과정은 여기까지입니다. 코드 설명 및 실행 결과는 다음 글에서 확인하실 수 있습니다!

maxtime1004.tistory.com/38

 

[PYTHON] tesseract를 이용한 자동차 번호판 인식기 - 2

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다. 준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다. maxtime1004.tistory.com/37 [PYTHON] tesseract를 이용한 자동차 번

maxtime1004.tistory.com

 

반응형
반응형

안녕하세요! 오늘은 selenium을 이용한 간단한 웹 크롤링입니다.

 

 사전 준비 

 

- selenium 설치

   selenium이 설치가 안되신 분들은 pip install selenium 으로 먼저 설치합니다.

 

- chromedriver 설치

크롬 - 더보기 - 도움말 Chrome 정보에 가시면 자신의 Chrome 버전이 나와있습니다.

버전에 맞게 chromedriver를 설치합니다.

 

 

 크롤링 

 

- 원하는 페이지로 들어갑니다. 저는 아래의 기사를 이용하였습니다.

news.v.daum.net/v/20210329142236043

 

삼성 '갤럭시S21' 국내 판매 100만 대 돌파.. "가격 인하책 통했다"

삼성전자 '갤럭시S21' 시리즈의 국내 판매량이 출시 57일 만에 100만 대를 돌파했다. 이는 전작인 '갤럭시S20'의 판매 기록을 한 달가량 앞당긴 것이다. 갤럭시S21은 삼성전자 5세대(5G) 스마트폰 가운

news.v.daum.net

 

- 가져올 내용을 아래와 같이 copy 합니다 (selector 사용)

<기사 본문 Copy>

 

- 해당 기사의 주소와 Copy selector를 넣어주면 기사 본문을 가져오게 됩니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('chromedriver') 
driver.implicitly_wait(1)

driver.get("https://news.v.daum.net/v/20210329142236043") #기사 주소
driver.implicitly_wait(1)

elem = driver.find_element_by_css_selector("#harmonyContainer") # Copy한 selector

print(elem.text)

반응형
반응형

안녕하세요! 오늘은 카카오페이 API 사용법에 대해 소개해 드리겠습니다.

저는 Flask를 활용하여 단건 결제를 구현해보았습니다.

카카오개발자 홈페이지에 들어가면 API 종류 별 설명을 보실 수 있습니다.

카카오 개발자 홈페이지에서 자세한 정보를 보고 싶은 분들은 아래 링크를 통하여 보시면 되고, 전체코드는 아래 깃허브에 올려놓겠습니다.

 

https://developers.kakao.com/docs/latest/ko/kakaopay/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

github.com/dpwls64/KAKAO-API

 

dpwls64/KAKAO-API

Contribute to dpwls64/KAKAO-API development by creating an account on GitHub.

github.com

 

˙  실행 과정 

 

 

˙  코드 설명 

 

해당 URL로 필수 요소들을 적어 보내주면 필요한 정보들을 받게 되고,  상태에 따라 approval_url / cancel_url / fail_url 로 이동하게 됩니다.

 

˙  실행 화면 

 

<QR 코드 또는 카톡 메시지로 결제가 가능합니다.>

 

<결제 화면>


 

<결제 완료>


사용자가 결제 도중 창을 닫게 되면 결제 취소가 됩니다.

<결제 취소>


결제하기 버튼을 누른 후 15분이 경과하면 결제 만료가 됩니다.

<결제 만료>

반응형

+ Recent posts