본문 바로가기

Python/Others

openAI API를 사용해서 오타 리스트 만들기

반응형

 

openAI API를 통한 오타 리스트 생성
이번에는 Python으로 openAI의 API를 사용해서 오타 리스트를 생성해 보고자 한다.
오타는 잘못 입력된 문자 또는 단어를 의미한다. 주로 급하게 입력하거나 주의력이 떨어져 발생하는 실수인데,
응답자에게 주관식으로 문자 형태 응답을 할 때 오타로 입력하는 경우가 자주 있다.
예를 들자면,
"Q1. XXX를 생각했을 때 가장 먼저 떠오르는 브랜드가 무엇입니까?"라는 문항으로 주관식 응답을 받는다고 할 때,
그다음 문항에서 "Q2. 알고 계시는 브랜드를 모두 선택해 주세요." 같은 문항으로 복수 문항을 추가로 응답받을 때가 있다.
이때 만약 주관식 문항(Q1)에서 나는 '삼성'을 응답을 했는데 복수 문항(Q2)에서 '삼성' 보기를 선택하지 않는다면 이건 잘못된 응답이다.

그래서 보통은 주관식 응답을 기준으로 그다음 문항에서 로직으로 주관식 응답한 것은 강제로 선택되게 구현을 한다.
근데 여기서 '삼성'이 아닌 '샴성' 처럼 오타로 입력하게 되는 경우도 잡아줘야 할 때가 있다.
'샴성' 말고도 오타의 종류는 더 있을 것이고, 글자 수에 따라 오타 종류는 천차만별일 것이다.

그래서 이번에 openAI API를 사용해서 오타 리스트를 만들어보고자 한다.
원래 키보드의 각각 위, 아래, 좌, 우에 있는 키를 기준으로 오타 리스트를 만들어보려 했다.
그래서 일단 딕셔너리를 만들려고 했는데... 이게 너무 귀찮은 것 아닌가...
그래서 이것은 일단 chatGPT에서 생성해달라고 하고 나머지 작업을 해보려 했다.

사실 오타 리스트를 생성하는 코드 자체를 아예 작성해달라고 했는데 이건 역시 어려웠나 보다...
질문을 여러 번 해봤으나 제대로 된 게 나오질 않았다.
그래서 우선 딕셔너리만 만들어두고 나중에 따로 작업해서 포스트를 작성해 볼 예정이다.
우선 그래도 딕셔너리를 만들어둔 김에 이 글에도 작성은 해두겠다.
(나중에 작업할 때는 알파벳별로 한글 키가 뭔지도 정리해야한다... shift 누를 때도...)
각 키별 주변 키 정리 (나중에 알아보자...)

# without number key 
keyboard_neighbors = {
    'q': ['w', 'a', 's'],
    'w': ['q', 'a', 's', 'd', 'e'],
    'e': ['w', 's', 'd', 'r', 'f'],
    'r': ['e', 'd', 'f', 't', 'g'],
    't': ['r', 'f', 'g', 'y', 'h'],
    'y': ['t', 'g', 'h', 'u', 'j'],
    'u': ['y', 'h', 'j', 'i', 'k'],
    'i': ['u', 'j', 'k', 'o', 'l'],
    'o': ['i', 'k', 'l', 'p'],
    'p': ['o', 'l'],
    'a': ['q', 'w', 's', 'z', 'x'],
    's': ['q', 'w', 'e', 'a', 'z', 'x', 'd', 'c'],
    'd': ['w', 'e', 'r', 's', 'x', 'c', 'f', 'v'],
    'f': ['e', 'r', 't', 'd', 'c', 'v', 'g', 'b'],
    'g': ['r', 't', 'y', 'f', 'v', 'b', 'h', 'n'],
    'h': ['t', 'y', 'u', 'g', 'b', 'n', 'j', 'm'],
    'j': ['y', 'u', 'i', 'h', 'n', 'm', 'k'],
    'k': ['u', 'i', 'o', 'j', 'm', 'l'],
    'l': ['i', 'o', 'p', 'k'],
    'z': ['a', 's', 'x'],
    'x': ['a', 's', 'd', 'z', 'c'],
    'c': ['s', 'd', 'f', 'x', 'v'],
    'v': ['d', 'f', 'g', 'c', 'b'],
    'b': ['f', 'g', 'h', 'v', 'n'],
    'n': ['g', 'h', 'j', 'b', 'm'],
    'm': ['h', 'j', 'k', 'n'],
}
	
openAI API 키 발급
우선 openAI의 API키를 발급받는다. (🔗)
API 요금
요금은 사용량만큼 결제되는 방식이다.
가격은 1000 토큰당 0.002달러이며, 1000토큰은 영어로 약 750단어이다.
가격이 너무 저렴해서 바로 등록을 했다.
(현재 4월 1일까지 $18 free trial을 제공한다.)
오타 리스트 생성
우선 엑셀에 브랜드 이름으로만 간단하게 정리를 해봤다.
LG같은 2글자 영어 브랜드는 어떻게 해주나 싶어서 LG만 영어로 넣었다.


import openai
import pandas as pd

# 간단하게만 해볼 예정이라 pandas로만 진행

API_KEY = "openAI에서 발급받은 KEY"
openai.api_key = API_KEY

df = pd.read_excel('typo.xlsx')

# 응답 결과를 출력하는 함수로 작성
def get_message(prompt) : 
    # gpt-3.5-turbo를 사용
    model = "gpt-3.5-turbo"
    
    # 프롬프트는 내가 요구하는 목적과 조건, 예시를 담아서 작성을 했다.
    # 이렇게 작성하는 방법 말고 있을 거 같은데 그건 나중에 알아보는 걸로....
    # 오타는 2~10개까지 작성해달라고 했다.
    prompt = f'''
    (Purpose): Output typo list based on keyboard.
    (Condition 1): Write only the results without explanation, introduction, pre text, post text, or additional explanation.
    (Condition 2): Write a minimum of 2 and a maximum of 10.
    example) :
    USER : 네이버
    ANSWER : ['녜이버', '메이버', '네니버', '네이벼']

    USER : 다음
    ANSWER : ['디음', '더음', '다늠', '다름']

    "{prompt}" Please print out the typo list\n\n###\n\n
    '''
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]

    response = openai.ChatCompletion.create(
        model=model,
        messages=messages
    )
    answer = response['choices'][0]['message']['content']
    return answer

# 결과를 dataframe에 typo 컬럼을 추가하여 저장
for idx in list(df.index) :
    df.loc[idx, 'typo'] = get_message(df.loc[idx, 'brand'])
	

오오 원하던 형태대로 출력을 해줬다!
근데 삼성은 뭔가 너무 이상하게 된 거 같고 최대 10개라고 했는데, 10개까지 작성된 리스트가 없다...
그래서 prompt에서 최소 10개 출력하고 querty 키보드 기준에서의 오타라는 문장을 추가해서 한 번 더 시도해보았다.



음 마음에 안 드는 것들도 존재하지만 그래도 나름 쓸 만하게 작성을 해주는 것 같다.
(마이크로소프트는 진짜 잘해준 것 같다;)
그래도 사람이 하나하나 리스트를 작성하는 것보단 이렇게 뽑아 놓고 검수하는 것이 더 편한 건 분명하다.
지금은 일단 간단하게 만들어봤지만 나중에 더 수정 보완해서 만들어봐야겠다.

근데 이번에 사용한 GPT 버전은 GPT-3.5이다.
그렇다면 ... GPT-4는 얼마나 작성을 더 잘해줄까...?
GPT-4는 아직 API를 사용 못 하니 chatGPT에 있는 GPT-4를 통해 해보았다.
단, 여기선 추가적인 조건은 작성하지 않고 QWERTY 키보드 기준으로만 작성해달라고 했다.
Question
QWERTY 키보드 기준으로 '삼성'에서 발생할 수 있는 오타 종류를 10가지 정도 작성해줘.
Answer
(GPT-4)
QWERTY 키보드 기준으로 '삼성'에서 발생할 수 있는 10가지 오타는 다음과 같습니다.
1. 삼스ㅡ: '성' 대신 '스ㅡ'를 입력한 경우입니다. (키보드에서 'ㅇ'의 왼쪽에 있는 'ㅡ'를 입력)
2. 삼스ㄴ: '성' 대신 '스ㄴ'를 입력한 경우입니다. (키보드에서 'ㅇ'의 아래에 있는 'ㄴ'를 입력)
3. 삼승: '성' 대신 '승'을 입력한 경우입니다. (키보드에서 'ㅅ'의 왼쪽에 있는 'ㅇ'를 입력)
4. 삼셍: '성' 대신 '셍'을 입력한 경우입니다. (키보드에서 'ㅅ'의 오른쪽에 있는 'ㅈ'를 입력)
5. 샘성: '삼' 대신 '샘'을 입력한 경우입니다. (키보드에서 'ㅁ'의 왼쪽에 있는 'ㄴ'를 입력)
6. 삽성: '삼' 대신 '삽'을 입력한 경우입니다. (키보드에서 'ㅁ'의 왼쪽에 있는 'ㄴ'를 입력)
7. 삼샹: '성' 대신 '샹'을 입력한 경우입니다. (키보드에서 'ㅅ'의 위에 있는 'ㅎ'를 입력)
8. 삼슥: '성' 대신 '슥'을 입력한 경우입니다. (키보드에서 'ㅇ'의 오른쪽에 있는 'ㅎ'를 입력)
9. 삼웅: '성' 대신 '웅'을 입력한 경우입니다. (키보드에서 'ㅅ'의 아래에 있는 'ㅈ'와 'ㅇ'의 왼쪽에 있는 'ㅡ'를 입력)
10. 삼엉: '성' 대신 '엉'을 입력한 경우입니다. (키보드에서 'ㅅ'의 아래에 있는 'ㅈ'와 'ㅇ'의 아래에 있는 'ㄴ'를 입력)

이처럼, QWERTY 키보드 기준으로 인접한 키를 사용하여 '삼성'이라는 단어에서 발생할 수 있는 오타들을 확인할 수 있습니다.
뭔가 영...마음에 안 든다...
설명도 뭔가 이상하다...
역시 한글은 아직 정확한 것 같진 않다...
그렇다면 영어는 어떻게 해줄까?
Question
Please write about 10 types of typos in the text 'Samsung'
Answer
(GPT-4)
Based on the QWERTY keyboard layout, here are 10 types of typos that could occur in the text 'Samsung':
1. Samdung: 's' instead of 'd' (the key to the right of 's')
2. Sanmung: 'a' instead of 'n' (the key to the right of 'a')
3. Samsinf: 'g' instead of 'f' (the key to the left of 'g')
4. Samsyng: 'u' instead of 'y' (the key to the left of 'u')
5. Wamsung: 'a' instead of 'w' (the key above 'a')
6. Samwung: 's' instead of 'w' (the key above 's')
7. Samsjng: 'u' instead of 'j' (the key to the right of 'u')
8. Sa,sung: 'm' instead of ',' (the key to the right of 'm')
9. Samsunh: 'g' instead of 'h' (the key to the right of 'g')
10. Samsubg: 'n' instead of 'b' (the key below 'n')

These examples illustrate various typos that could occur in the text 'Samsung' when considering adjacent keys on a QWERTY keyboard.
한글에 비하면 오타가 충분히 나올법한 것들로 작성해 준 것 같다. (다만 설명은 약간 이상한 거 같다...?)
설명은 무시하고 영어 기반의 오타는 확실히 쓸만해 보인다.

정말 AI의 발전으로 업무든 뭐든 여러 가지가 편해지고 앞으로의 성장도 기대가 되면서도 정말 무섭다.
발전 속도가 이렇게 빨라도 되는 건가?

아무튼 변화를 지켜만 보지 않고 발 빠르게 따라가야 할 것 같다.
반응형

loading