본문 바로가기
프로그래밍 project/Python (파이썬)

단어학습 머신러닝 api, 파이썬을 이용한 가상서버 만들기 (2편-응용)

by EATSTAR 2024. 9. 20.
반응형

https://eatstar.tistory.com/55

 

단어학습 머신러닝 api, 파이썬을 이용한 가상서버 만들기 (1편)

안녕하세요, 이트스타입니다. 오늘 해볼 것은 단어학습 머신러닝 api와 파이썬 코딩을 이용한 가상서버 만들기를 해볼겁니다. 쉽게 말하자면, 어떤 단어를 입력했을 때 이미 입력된 데이터를 토

eatstar.tistory.com

1편에 이은 게시물입니다.


 

저번에는 단순히 머신러닝 사이트(https://machinelearningforkids.co.uk/)를 이용해보는 것에서 그쳤다면, 이번에는 그것을 웹에 나타내는 응용편을 제작할 것이다. 저번 편에서 이야기 했던대로, 이 머신러닝 모델을 반출(export)하는데에는 스크래치 등 여러가지 방식이 있다고 보이나, 일단 제목을 파이썬을 이용한 가상서버라고 서술했으므로 파이썬부터 알아보자.

 

1. 사이트에서 제공하는 코드를 이용

 

일단 사이트에서 제공하는 정보를 살펴보자. (저번 머신러닝 모델을 유지하지 못헤 다시 만들었다.)

$ python yourscript.py
result: 'good_words' with 81% confidence

 

result: 이하의 글처럼 출력된다는 사실을 알 수 있다.

 

0ffd8460-774b-11ef-bcfc-1d7d35bf12ac934a02c9-0777-4a5f-95f0-13c3dbe09a21

 

API 키는 위와 같이 주어졌다. 나는 일회용 모델이라 공개했지만, 실제로 공개하는 것은 위험하다. (보안 및 그에 따른 비용에 대한 측면)

 

import requests

# This function will pass your text to the machine learning model
# and return the top result with the highest confidence
def classify(text):
    key = "0ffd8460-774b-11ef-bcfc-1d7d35bf12ac934a02c9-0777-4a5f-95f0-13c3dbe09a21"
    url = "https://machinelearningforkids.co.uk/api/scratch/"+ key + "/classify"

    response = requests.get(url, params={ "data" : text })

    if response.ok:
        responseData = response.json()
        topMatch = responseData[0]
        return topMatch
    else:
        response.raise_for_status()


# CHANGE THIS to something you want your machine learning model to classify
demo = classify("The text that you want to test")

label = demo["class_name"]
confidence = demo["confidence"]


# CHANGE THIS to do something different with the result
print ("result: '%s' with %d%% confidence" % (label, confidence))

 

또 제공하는 코드는 이와 같다. 일단 그대로 사용하지는 않을 것이다. 필요한 것만 사용해보자.

 

2. 코랩으로 이어지는 파이썬 코드

 

import requests

def classify(text):
    key = "0ffd8460-774b-11ef-bcfc-1d7d35bf12ac934a02c9-0777-4a5f-95f0-13c3dbe09a21"
    url = "https://machinelearningforkids.co.uk/api/scratch/"+ key + "/classify"

    response = requests.get(url, params={ "data" : text })

    if response.ok:
        responseData = response.json()
        topMatch = responseData[0]
        return topMatch
    else:
        response.raise_for_status()

def myfunc(sentence):
    demo = classify(f"{sentence}")

    label = demo["class_name"]
    confidence = demo["confidence"]

    return label, confidence

이 코드를 코랩의 첫번째 코드에 작성해보자.  이 코드에서는 모델 불러오기와 값 내보내기를 담당하는 함수가 있다.

본인의 API 키만 바꿔주면 된다. 그리고 실행시켜주자.

 


while True:
  keysentence = input('단어나 문장을 입력해 주시면 좋은말인지 나쁜말인지 AI 판단해드립니다(q to quit)')
  if keysentence == 'q':
    break
  else:
    lvar, cvar = myfunc(f'{keysentence}')
    print(f"Label: {lvar} / Conf:{cvar}")

 

이것은 두 번째로 작성할 코드다. 코드 설명을 하자면,

input 안에는 자신이 질문하기 원하는 텍스트를 입력해주면 되고, q(quit)를 누르면 함수가 종료되며, 그 대신 제시어를 입력하면 myfunc 함수에서 정의된대로 lvar 값과 cvar 값을 도출하고, 그것을 출력해주는 내용이 있는 코드이다.

while True:로 제시되어 있어 종료 조건이 없으므로 중간에 제시어를 q로 입력하지 않는 한, 종료되지 않는다.

앞서 적었던 첫번째 코드를 실행시킨 상태라면, 이 두 번째 코드도 마저 실행시켜 주자.

 

입력하면 우리가 설계한 모델대로 대답을 해준다! 앞서 [result: 'good_words' with 81% confidence]라고 출력이 나온다고 언급했지만, 그것은 코드를 변형시키지 않고 그대로 사용했을 때 그런 형식으로 나오는 것이고, 내가 수정한 코드로 실행시키면 위와 같이 실행결과가 나오는 것을 알 수 있다.

이렇게 완성된 코드를 ipynb 파일로 다운 받아서 visual code에서 열어보자.

 

3. visual code로 옮겨보기

 

좌측 상단 file의 [open file] 버튼을 통해 파일을 열어보자.

경고 문구는 무시하고 계속 open해주자.

일단 코드 업로드는 완료했다.

Import "requests" could not be resolved from source
PylancereportMissingModuleSource
ModuleNotFoundError: No module named 'requests'

 

만약 이 코드를 그대로 실행하게 된다면 둘 중에 어느 하나라도 오류가 뜨게 된다. 당황하지 말라! 오류 메세지에서 알 수 있듯, 그냥 모듈 설치가 되지 않았기에 생긴 오류이다. (나중에 설치한다.)

일단 코드 수정부터 좀 하자. (웹상에 나타내기 위한 형태로 변경)

 

import requests
import streamlit as st

def classify(text):
    key = "6c0c2520-69bf-11ef-8862-7949966a810c8dc78687-1296-488d-b254-d58a6c787b83"
    url = "https://machinelearningforkids.co.uk/api/scratch/"+ key + "/classify"

    response = requests.get(url, params={ "data" : text })

    if response.ok:
        responseData = response.json()
        topMatch = responseData[0]
        return topMatch
    else:
        response.raise_for_status()

def myfunc(sentence):
    demo = classify(f"{sentence}")

    label = demo["class_name"]
    confidence = demo["confidence"]

    return label, confidence

st.title('Good and Bad words perception')

* API 키는 바꿔보자.

# automation
keysentence = st.text_input('단어나 문장을 입력해 주시면 좋은말인지 나쁜말인지 AI판단해 드립니다.')
if keysentence != '':
    try:
        lvar, cvar = myfunc(f'{keysentence}')
        st.write(f'Label: {lvar} / Conf:{cvar}')
    except:
        st.error("API key error: terminated already!!")

 

 

visual code의 코드를 위의 코드로 바꿔준 상태에서, 아나콘다 프롬프트를 실행한다.

 

4. 아나콘다 프롬프트 실행

anaconda prompt를 찾아 실행시키자.

 

conda env list

위의 명령어로 콘다 가상환경(env) 리스트를 볼 수 있다.

 

conda activate aiconv

그리고 이 코드로 가상환경을 만들어야 하는데..

오류가 뜬다.

출력에서 제안하는 코드는 conda env list와 같은 류의 것이다. 현재 있는 가상환경 확인용.

 

conda create --name aiconv python=3.9

gpt에서 제안한 코드를 써보자.

뭔가 굉장한 것이 출력되고, 설치되었다.

 

방향키 위키를 눌러서 아까 코드를 찾아 다시 실행시켜주면.. gpt가 옳았다는 것을 알 수 있다. 계속 진행해보자.

 

pip install streamlit

이제 웹으로 이어줄 streamlit 모듈을 설치하자.

... 생략 ...

이제 requests 모듈과 streamlit 모듈이 설치되었으므로 코드를 정상적으로 실행시킬 수 있다!

 

이제, 아까 visual code에 있던 코드를 py파일로 저장해야 한다.

두 부분이었던 코드를 하나로 합쳐주고, 새로운 텍스트 파일을 만들어주고, python을 택해주면 된다.

차근차근 순서대로 해보자.

언어 선택하기를 누르고 python을 선택합시다.

두 개의 부분이었던 코드를 하나로 합쳐줍시다. 두 번째 코드를 복사해 첫 번째 코드와 결합시키면 됩니다.

* 처음부터 py파일로 하지 않았던 것은 구글 코랩에서 파일(.ipynb)을 다운받아 visual 코드에서 열고 그 코드를 직접 수정해보도록 수업이 본래 설계되어있었기 때문입니다. (이 게시물에서는 코드를 그대로 복사하는 형식이지만)

 

그리고 좌측상단 메뉴를 통해 py파일로 저장하면 됩니다.

 

이제, py파일이 저장된 위치를 감안해서 아래와 같이 코드를 입력해봅시다.

cd path/to/your/project

* 해당 py파일을 우클릭하고 [경로로 복사]를 누르면 "C:\Users\사용자\Downloads\finalfile.py"와 같이 복사됩니다.

그러므로 최종적으로는..

cd C:\Users\사용자\Downloads

와 같은 형태가 되겠습니다. (파일의 한 단계 위 경로까지로 설정)

너무 비어있다고요? 제 이름이라 그렇습니다 ㅎ

 

streamlit run <파이썬파일이름>.py

<파이썬파일이름> 부분에 파이썬 파일 이름을 입력하면.. (예시: streamlit run app.py)

 

email에서 출력이 멈췄다면 그냥 enter 한번 더 쳐주자.

접속할 수 있는 주소도 나오고, 자동으로 브라우저가 켜지기도 합니다.

 

네, 고생 끝에 성공하게 되었습니다!

이 사이트에서도 아까 코랩에서와 같이 똑같이 이용할 수 있습니다.

 

간혹 API 키 오류가 발생할 때가 있는데, 이것은 API 키가 만료되었기 때문에 발생합니다.

머신러닝 사이트 창을 닫았거나 (비로그인 상태에서 바로 창을 지웠으니 저장이 안돼 사라질 수 밖에 없죠. 로그인 한 상태에서 어떻게 되는지는 잘 모르겠습니다.) 기타 이유로 유효하지 않은 key 값인 경우 발생하는 것입니다.

 

python과 실시간 연계가 되기 때문에 코드를 수정하여 API 키를 바꾸고 저장하면, 정상작동하게 됩니다.

 

오늘 게시물은 여기까지입니다. 감사합니다.

스크래치를 이용한 블럭코딩 쪽도 있으나.. 단조로워서 다루진 않겠습니다.

(Label/conf를 나타내는 기능이나 추가로 데이터를 입력할 수 있는 기능 정도가 존재)

반응형