๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป IT·๊ธฐ์ˆ ·ํ†ต๊ณ„

[API] OpenAI API ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ 2ํƒ„: ๊ฐœ์ฒด๋ช… ์ธ์‹ (NER)

by nowgeun 2023. 2. 4.
728x90

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” InstructGPT๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐœ์ฒด๋ช… ์ธ์‹ ์ž‘์—…์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. InstructGPT์˜ ์„ค์น˜ ๋ฐ OpenAI APIํ‚ค ๋ฐœ๊ธ‰ ๊ด€๋ จํ•ด์„œ๋Š” ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค:

2023.01.17 - [๐Ÿ’ป ํŒŒ์ด์ฌ] - [API] ChatGPT Python์œผ๋กœ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ (์ˆ˜์ •)

 

[API] ChatGPT Python์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ (์ˆ˜์ •)

[์ˆ˜์ • 2023.02.04] ๋ ˆ๋”ง์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธ€์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์š”์•ฝ์„ ํ•˜์ž๋ฉด ChatGPT์™€ text-davinci-003 ๋ชจ๋ธ์€ ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. text-davinci-003์€ InstructGPT์˜ ๋ชจ๋ธ๋กœ ์ง€์‹œ์‚ฌํ•ญ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ตœ์ ํ™”๊ฐ€ ๋œ

jakely.tistory.com

 

๊ฐœ์ฒด๋ช… ์ธ์‹ (Named Entity Recognition)

๊ฐœ์ฒด๋ช… ์ธ์‹์ด๋ž€ ๋น„์ •ํ˜• ํ…์ŠคํŠธ์—์„œ ์‚ฌ์ „์— ์ •์˜๋œ ์นดํ…Œ๊ณ ๋ฆฌ, ๋ถ„๋ฅ˜์˜ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „์— ์ •ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•„์š”ํ•œ ๊ฐœ์ฒด๋ช…์„ ๊ฐ€์ ธ์˜ด์œผ๋กœ์จ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ˜•ํ™”์‹œํ‚ค๋Š” ์ผ์ข…์˜ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ๋ฅผ ๋ณด์‹œ๋ฉด ์ข€ ๋” ์ดํ•ด๊ฐ€ ์ˆ˜์›”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค:

NER Example
๊ฐœ์ฒด๋ช… ์ธ์‹ ์˜ˆ์‹œ

์—ฌ๊ธฐ์„œ ์‚ฌ์ „์— ์ •์˜๋œ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” [์ธ๋ฌผ, ๋‚ ์งœ, ์ด๋ฒคํŠธ, ๊ธฐ์—…, ๊ธˆ์•ก] ์ด๋ฉฐ, ์ถ”์ถœ๋œ ๊ฐœ์ฒด๋ช…์€ "์ฒ ์ˆ˜", "์–ด์ œ", "CES 2023", "์‚ผ์„ฑ์ „์ž" "100๋งŒ ์›"์ž…๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ช… ์ธ์‹ ์ž‘์—…์„ ํ†ตํ•ด ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ ์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ์ „์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์นดํ…Œ๊ณ ๋ฆฌ ์ธ๋ฌผ ๋‚ ์งœ ์ด๋ฒคํŠธ ๊ธฐ์—… ๊ธˆ์•ก
๊ฐœ์ฒด๋ช… ์ฒ ์ˆ˜ ์–ด์ œ CES 2023 ์‚ผ์„ฑ์ „์ž 100๋งŒ์›

๋ณดํ†ต ๊ฐœ์ฒด๋ช… ์ธ์‹์„ ์œ„ํ•ด์„œ๋Š” Pororo์™€ ๊ฐ™์€ Python ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Konlpy์™€ ๊ฐ™์€ ํ•œ๊ตญ์–ด ํ† ํฌ๋‚˜์ด์ €์— ์‚ฌ์šฉ์ž ์‚ฌ์ „์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•™์Šต๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ DL ๋ชจ๋ธ์„ ๋Œ๋ฆฌ๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ข‹์€ ํŽธ์€ ์•„๋‹™๋‹ˆ๋‹ค...

๊ทธ๋Ÿผ InstructGPT๋ฅผ ํ™œ์šฉํ•ด์„œ NER์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

 

์†Œ์Šค์ฝ”๋“œ

import os
import openai

openai.api_key = 'OpenAI API Key'

def get_keywords(corpus, max_tokens=100):  
    
    if type(corpus) != str:
        raise TypeError
    else:
        pretext = "A table with extracted named entities from the document below:\n\n" 
        table = "\n\n| Event | Company | Product | Person | Date |"
        corpus =  pretext + corpus + table
        response = openai.Completion.create(
              model="text-davinci-003",
              prompt=corpus,
              temperature=0,
              max_tokens=max_tokens,
              top_p=1.0,
              frequency_penalty=0.0,
              presence_penalty=0.0
            )

        return table+ "\n" + response['choices'][0]['text'].strip()

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

๋ธ”๋ฃธ๋ฒ„๊ทธ์—์„œ ๊ฐ€์ ธ์˜จ ๊ธฐ์‚ฌ์˜ ์ผ๋ถ€๋ฅผ ๋ฐœ์ทŒํ•˜์—ฌ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜์ง€ ์•Š์€ ์„ฑ๋Šฅ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ
InstructGPT NER ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์• ๋งคํ•œ ๋ถ€๋ถ„์ด ์žˆ์ง€๋งŒ ํ‹€๋ฆฌ์ง€๋Š” ์•Š๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ณ , ํšŒ์‚ฌ๋„ ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ค„์ž„๋ง์€ ์ž˜ ์•Œ์•„๋“ฃ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. TSMC์™€ ๊ฐ™์€ ๋ถ€๋ถ„์€ Ticker์นดํ…Œ์ฝ”๋ฆฌ๋กœ ์„ค์ •์„ ํ•ด์•ผ ํ•˜๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œํ’ˆ ๋˜ํ•œ ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. Baseline ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ์ž์ฒด๋Š” ํ›Œ๋ฅญํ•˜๋‹ˆ fine-tuning๋งŒ ์‹œํ‚จ๋‹ค๋ฉด ์šฐ์ˆ˜ํ•œ NER ๋ชจ๋ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€