본문 바로가기

Python

[Python] 맛집 리뷰를 위한 AI 제목생성기

728x90
반응형
SMALL

블로그 글 작성할 때 미션만 클리어하기 위해 키워드 + 음식점 이름으로 작성하고는 했는데

상위 노출을 위해 최적화된 제목을 작성하는 것을 도와주는 프로그램을 만들어봅시다.

Chat-GPT와 여러 대화 끝에 프로그램을 완성시키고 따라서 코딩해 봅니다 ^.^ 말로 하는 프로그래밍.

 

 

0. 라이브러리 설치

pip install transformers

- 라이브러리 설치 가상환경에서도 안 되고 그냥도 안 되어가지고 너무 힘들었는데 다운그레이드하니까 해결됨.

- 처음에 웹앱으로 만들어줘서 웹으로 만들어줘서 안 되는 줄 알았는데 3.13이 너무 최신버전이라 안 되는 거였음.

- 3.8으로 버전 낮추니까 너무 클린하고 쾌적하게 잘 됩니다.

 

 

1. GPT-2 모델 및 토크나이저 로드
from transformers import GPT2LMHeadModel, GPT2Tokenizer

# 모델 로드 함수
def load_model():
    model_name = "gpt2"
    model = GPT2LMHeadModel.from_pretrained(model_name)
    tokenizer = GPT2Tokenizer.from_pretrained(model_name)
    return model, tokenizer

model, tokenizer = load_model()

- GPT-2 모델을 사용하여 텍스트 생성 작업

- GPT2LMHeadModel과 GPT2Tokenizer는 Hugging Face 라이브러리에서 제공하는 사전 훈련된 모델

 

 

2. 제목 생성 함수
def generate_title(keyword, restaurant_name, max_length=50, num_titles=5):
    """키워드와 음식점 이름을 기반으로 GPT-2로 제목 생성"""
    input_text = f"키워드: {keyword}\n음식점: {restaurant_name}\n제목:"
    input_ids = tokenizer.encode(input_text, return_tensors="pt")

    # 모델을 사용하여 텍스트 생성
    outputs = model.generate(
        input_ids,
        max_length=max_length,
        num_return_sequences=num_titles,
        temperature=0.7,  # 텍스트 창의성을 조절
        top_p=0.9,       # 확률 기반 필터링
        do_sample=True   # 샘플링을 활성화하여 랜덤성 부여
    )

    # 생성된 제목 디코딩
    titles = [tokenizer.decode(output, skip_special_tokens=True).split("제목:")[-1].strip() for output in outputs]
    return titles

- 키워드와 음식점 이름을 입력받고, 이를 기반으로 GPT-2 모델을 사용하여 제목을 생성

- 생성된 제목을 리스트 형식으로 반환

 

 

3. SEO 점수 계산 함수
def calculate_seo_score(title, keyword, restaurant_name):
    """SEO 점수를 계산하는 함수"""
    # SEO 점수를 계산하는 여러 기준이 포함됩니다.
    keyword_score = 1.0 if title.lower().startswith(keyword.lower()) else 0.5
    restaurant_score = 1.0 if restaurant_name.lower() in title.lower() else 0.5
    length_score = 1.0 if 40 <= len(title) <= 60 else 0.5
    click_word_score = 1.0 if any(word in title for word in ["추천", "리뷰", "TOP", "필독"]) else 0.5
    seo_score = round((keyword_score + restaurant_score + length_score + click_word_score) / 4, 2)
    return seo_score

- SEO 점수를 계산하여 제목이 얼마나 검색 최적화에 적합한지 평가

- 제목의 길이, 키워드, 포함 여부, 클릭 유도 단어 등을 고려하여 SEO 점수를 계산.

 

 

4. Tkinter UI 생성
import tkinter as tk
from tkinter import messagebox

def on_generate_button_click():
    keyword = entry_keyword.get()
    restaurant_name = entry_restaurant.get()
    num_titles = int(slider_num_titles.get())

    if keyword.strip() and restaurant_name.strip():
        titles = generate_title(keyword, restaurant_name, num_titles=num_titles)
        result_text.delete(1.0, tk.END)
        for idx, title in enumerate(titles, start=1):
            seo_score = calculate_seo_score(title, keyword, restaurant_name)
            result_text.insert(tk.END, f"{idx}. 제목: {title} (SEO 점수: {seo_score})\n")
    else:
        messagebox.showwarning("입력 오류", "키워드와 음식점 이름을 모두 입력해주세요!")

root = tk.Tk()
root.title("음식점 제목 생성기")

label_keyword = tk.Label(root, text="키워드를 입력하세요")
label_keyword.pack()
entry_keyword = tk.Entry(root)
entry_keyword.pack()

label_restaurant = tk.Label(root, text="음식점 이름을 입력하세요")
label_restaurant.pack()
entry_restaurant = tk.Entry(root)
entry_restaurant.pack()

label_num_titles = tk.Label(root, text="생성할 제목 수")
label_num_titles.pack()
slider_num_titles = tk.Scale(root, from_=1, to=10, orient=tk.HORIZONTAL)
slider_num_titles.set(5)
slider_num_titles.pack()

button_generate = tk.Button(root, text="제목 생성", command=on_generate_button_click)
button_generate.pack()

result_text = tk.Text(root, height=10, width=50)
result_text.pack()

root.mainloop()

- Tkinter를 사용

- 사용자가 입력한 키워드와 음식점 이름을 바탕으로 제목을 생성하고 SEO 점수를 표시.

 

 

5. 실행

- 실행도 가상환경 활성화부터.

- (가상환경이름) 이런 식으로 붙어있으면 활성화된 거 랬음. python 파일이름.py로 실행.

 

 

가상환경 사용해 봤으니 이런 것도 있구나 하고 깨달아봄.

 어우 GPT-2 친구는 바보라는 것을 깨달았습니다.

 

 

728x90
반응형
LIST