event01 / app.py
aliceblue11's picture
Update app.py
c41bcc7 verified
raw
history blame
36.7 kB
import gradio as gr
from datetime import datetime
import re
def extract_month_from_period(period_text):
"""이벤트 기간에서 월 추출"""
if not period_text or period_text.strip() == "":
return None
# 날짜 패턴 찾기 (YYYY.MM.DD 또는 MM.DD 형식)
date_patterns = [
r'(\d{4})\.(\d{1,2})\.(\d{1,2})', # 2024.12.01
r'(\d{1,2})\.(\d{1,2})', # 12.01
r'(\d{1,2})월', # 12월
]
for pattern in date_patterns:
matches = re.findall(pattern, period_text)
if matches:
if len(matches[0]) == 3: # YYYY.MM.DD
month = int(matches[0][1])
elif len(matches[0]) == 2: # MM.DD
month = int(matches[0][0])
else: # 월
month = int(matches[0])
if 1 <= month <= 12:
return f"{month}월"
return None
def analyze_concepts(month):
"""20-40대 여성 맞춤 월별 컨셉 분석"""
# 월별 상세 데이터 (20-40대 여성 타겟 특화)
monthly_data = {
"1월": {
"holidays": ["신정", "설날"],
"special_days": ["미니멀 챌린지", "새해 리셋", "플래너 스타트"],
"seasonal_terms": ["소한", "대한", "입춘"],
"trends": ["미니멀", "자기계발", "플래너", "정리정돈", "헬스케어", "독서"],
"seasons": ["겨울", "신년", "새로운 시작"],
"colors": ["#FF6B6B", "#4ECDC4", "#45B7D1"],
"mood": "희망적이고 새로운 시작",
"female_appeal": ["미니멀", "자기계발", "셀프케어", "새해다짐"]
},
"2월": {
"holidays": ["밸런타인데이"],
"special_days": ["갈렌타인데이", "셀프러브", "사랑의 달"],
"seasonal_terms": ["입춘", "우수"],
"trends": ["셀프러브", "갈렌타인", "로맨스", "따뜻한 감성", "핑크 무드"],
"seasons": ["겨울 끝", "봄 준비", "로맨틱"],
"colors": ["#FF69B4", "#FFB6C1", "#DC143C"],
"mood": "로맨틱하고 감성적",
"female_appeal": ["셀프러브", "우정", "로맨스", "감성"]
},
"3월": {
"holidays": ["삼일절", "화이트데이"],
"special_days": ["여성의 날", "봄의 시작", "새학기"],
"seasonal_terms": ["경칩", "춘분"],
"trends": ["봄맞이", "벚꽃 시즌", "봄 패션", "새출발", "꽃구경"],
"seasons": ["봄", "벚꽃", "새싹"],
"colors": ["#FFB6C1", "#98FB98", "#87CEEB"],
"mood": "설렘가득하고 활기찬",
"female_appeal": ["봄 패션", "꽃구경", "새출발", "여성의 날"]
},
"4월": {
"holidays": ["만우절"],
"special_days": ["벚꽃 시즌", "봄나들이", "피크닉"],
"seasonal_terms": ["청명", "곡우"],
"trends": ["벚꽃축제", "봄피크닉", "아웃도어", "꽃놀이", "봄여행"],
"seasons": ["봄 절정", "꽃구경", "나들이"],
"colors": ["#98FB98", "#F0E68C", "#DDA0DD"],
"mood": "생기발랄하고 즐거운",
"female_appeal": ["벚꽃놀이", "피크닉", "봄여행", "감성사진"]
},
"5월": {
"holidays": ["근로자의날"],
"special_days": ["로즈데이", "가정의 달", "감사의 달"],
"seasonal_terms": ["입하", "소만"],
"trends": ["감사", "나들이", "로즈데이", "봄여행", "힐링"],
"seasons": ["신록", "야외활동", "따뜻함"],
"colors": ["#32CD32", "#FFB6C1", "#87CEEB"],
"mood": "따뜻하고 감사한",
"female_appeal": ["로즈데이", "감사표현", "힐링", "나들이"]
},
"6월": {
"holidays": ["현충일"],
"special_days": ["키스데이", "여름 준비", "다이어트"],
"seasonal_terms": ["망종", "하지"],
"trends": ["여름준비", "다이어트", "쿨링", "바캉스준비", "여름패션"],
"seasons": ["초여름", "더위", "여름준비"],
"colors": ["#00CED1", "#FFD700", "#FF6347"],
"mood": "시원하고 활동적인",
"female_appeal": ["여름 다이어트", "쿨링케어", "바캉스", "여름패션"]
},
"7월": {
"holidays": ["제헌절"],
"special_days": ["실버데이", "여름휴가", "바캉스"],
"seasonal_terms": ["소서", "대서", "초복", "중복"],
"trends": ["여름휴가", "바캉스", "휴가패션", "여행", "힐링"],
"seasons": ["여름", "휴가", "바캉스"],
"colors": ["#00BFFF", "#FFD700", "#FF6347"],
"mood": "역동적이고 자유로운",
"female_appeal": ["바캉스", "여행", "휴가패션", "힐링"]
},
"8월": {
"holidays": ["광복절"],
"special_days": ["그린데이", "여름 마무리", "휴가"],
"seasonal_terms": ["입추", "처서", "말복"],
"trends": ["여름휴가", "바다여행", "축제", "여름추억", "힐링"],
"seasons": ["한여름", "휴가절정", "추억"],
"colors": ["#00BFFF", "#FF6347", "#FFD700"],
"mood": "열정적이고 추억가득한",
"female_appeal": ["여름추억", "힐링", "여행", "감성사진"]
},
"9월": {
"holidays": ["추석"],
"special_days": ["포토데이", "뮤직데이", "가을시작"],
"seasonal_terms": ["백로", "추분"],
"trends": ["가을패션", "독서", "문화생활", "감성", "카페"],
"seasons": ["가을", "선선함", "감성"],
"colors": ["#FF8C00", "#DC143C", "#B8860B"],
"mood": "감성적이고 성숙한",
"female_appeal": ["가을패션", "카페", "독서", "감성사진"]
},
"10월": {
"holidays": ["한글날"],
"special_days": ["와인데이", "커피데이", "독서의 달"],
"seasonal_terms": ["한로", "상강"],
"trends": ["가을단풍", "독서", "카페문화", "와인", "감성"],
"seasons": ["단풍", "가을정취", "감성"],
"colors": ["#FF8C00", "#DC143C", "#B8860B"],
"mood": "감성적이고 여유로운",
"female_appeal": ["단풍구경", "카페", "와인", "독서"]
},
"11월": {
"holidays": ["빼빼로데이"],
"special_days": ["무비데이", "오렌지데이", "연말준비"],
"seasonal_terms": ["입동", "소설"],
"trends": ["빼빼로데이", "연말준비", "겨울패션", "따뜻함", "코지"],
"seasons": ["늦가을", "겨울준비", "포근함"],
"colors": ["#8B4513", "#A0522D", "#CD853F"],
"mood": "포근하고 준비하는",
"female_appeal": ["빼빼로데이", "겨울패션", "연말모임", "코지라이프"]
},
"12월": {
"holidays": ["크리스마스"],
"special_days": ["허그데이", "연말파티", "송년"],
"seasonal_terms": ["대설", "동지"],
"trends": ["크리스마스", "연말파티", "선물", "송년회", "겨울감성"],
"seasons": ["겨울", "연말", "크리스마스"],
"colors": ["#DC143C", "#228B22", "#FFD700"],
"mood": "축제같고 따뜻한",
"female_appeal": ["크리스마스", "연말모임", "선물", "겨울감성"]
}
}
data = monthly_data.get(month, {})
# 20-40대 여성 맞춤 컨셉 생성 (6가지)
concepts = []
# 컨셉 1: 여성 타겟 기념일/특별한 날 기반
if data.get("special_days"):
special = data["special_days"][0]
concepts.append({
"name": f"{special} 이벤트",
"theme": f"{special}를 테마로 한 20-40대 여성 맞춤 이벤트",
"score": 8.8,
"reason": f"20-40대 여성이 공감할 수 있는 {special} 테마로 높은 참여도 예상",
"target": "20-40대 여성, 트렌드 관심층",
"colors": data.get("colors", ["#FF69B4"]),
"keywords": [special] + data.get("female_appeal", [])[:2],
"participation_factor": "여성층 공감대, 특별함",
"is_recommended": True
})
# 컨셉 2: 트렌드 기반 (여성 친화적)
if data.get("trends"):
trend = data["trends"][0]
concepts.append({
"name": f"{trend} 챌린지",
"theme": f"20-40대 여성 트렌드 {trend} 참여형 이벤트",
"score": 8.5,
"reason": f"현재 여성층에게 인기 있는 {trend} 트렌드로 높은 관심도",
"target": "20-30대 트렌드 민감층, SNS 활용 여성",
"colors": data.get("colors", ["#4ECDC4"]),
"keywords": data.get("trends", [])[:3],
"participation_factor": "트렌드 화제성, SNS 확산성",
"is_recommended": False
})
# 컨셉 3: 절기 기반 (현대적 해석)
if data.get("seasonal_terms"):
term = data["seasonal_terms"][0]
concepts.append({
"name": f"{term} 모던 감성",
"theme": f"절기 {term}을 현대적으로 해석한 감성 이벤트",
"score": 7.5,
"reason": f"전통 절기를 현대 여성 감성으로 재해석한 참신함",
"target": "전연령 여성, 감성적 취향층",
"colors": data.get("colors", ["#8FBC8F"]),
"keywords": data.get("seasonal_terms", [])[:2] + ["모던", "감성"],
"participation_factor": "전통의 현대적 재해석, 감성적 어필",
"is_recommended": False
})
# 컨셉 4: 계절감 + 여성 어필 기반
if data.get("seasons"):
season = data["seasons"][0]
concepts.append({
"name": f"{season} 감성 모먼트",
"theme": f"{season} 계절을 만끽하는 여성 감성 이벤트",
"score": 8.0,
"reason": f"{season} 계절감과 여성 감성을 결합한 자연스러운 참여 유도",
"target": "20-40대 감성 중시 여성, 계절감 추구층",
"colors": data.get("colors", ["#98FB98"]),
"keywords": data.get("seasons", []) + data.get("female_appeal", [])[:2],
"participation_factor": "계절 감성, 여성 공감대",
"is_recommended": True
})
# 컨셉 5: 셀프케어/힐링 기반
concepts.append({
"name": f"{month} 셀프케어 위크",
"theme": "나를 위한 특별한 시간, 셀프케어 이벤트",
"score": 8.3,
"reason": "20-40대 여성의 핵심 관심사인 셀프케어로 강한 어필",
"target": "20-40대 여성, 셀프케어 관심층",
"colors": data.get("colors", ["#FFB6C1"]),
"keywords": ["셀프케어", "힐링", "나를 위한 시간", "웰빙"],
"participation_factor": "자기관리 욕구, 힐링 니즈",
"is_recommended": True
})
# 컨셉 6: 커뮤니티 소통 (여성 친화적)
concepts.append({
"name": f"{month} 언니들의 수다",
"theme": "20-40대 여성들의 진솔한 소통과 공감 이벤트",
"score": 7.8,
"reason": "여성 커뮤니티 특성을 살린 친밀한 소통으로 참여 유도",
"target": "기존 여성 회원, 커뮤니티 소통 선호층",
"colors": data.get("colors", ["#87CEEB"]),
"keywords": ["소통", "공감", "언니들", "진솔함"],
"participation_factor": "여성 커뮤니티 소속감, 친밀감",
"is_recommended": False
})
# 점수순 정렬 및 추천 컨셉 우선
concepts.sort(key=lambda x: (x.get("is_recommended", False), x["score"]), reverse=True)
# 추천 컨셉 찾기
recommended_concept = next((c for c in concepts if c.get("is_recommended", False)), concepts[0])
# 결과 텍스트 생성
result = f"# 🎯 {month} 20-40대 여성 맞춤 컨셉 분석\n\n"
result += f"## 🏆 이달의 추천 컨셉: {recommended_concept['name']}\n"
result += f"**⭐ 추천 이유:** {recommended_concept['reason']}\n"
result += f"**📊 예상 참여도:** {recommended_concept['score']}/10점\n\n"
result += "---\n\n"
result += f"**📊 분석 기준:** {data.get('mood', '특별한')} 분위기\n"
result += f"**🎨 주요 색상:** {', '.join(data.get('colors', ['기본색상'])[:3])}\n"
result += f"**🔥 여성 어필 트렌드:** {', '.join(data.get('female_appeal', ['기본트렌드'])[:3])}\n"
result += f"**🌿 해당 절기:** {', '.join(data.get('seasonal_terms', ['해당없음']))}\n\n"
concept_names = []
for i, concept in enumerate(concepts, 1):
is_recommended_mark = " 🏆 **추천**" if concept.get("is_recommended", False) else ""
result += f"## {i}. {concept['name']}{is_recommended_mark}\n"
result += f"**🏷️ 테마:** {concept['theme']}\n"
result += f"**⭐ 참여도 점수:** {concept['score']}/10점\n"
result += f"**💡 선정 이유:** {concept['reason']}\n"
result += f"**🎯 주요 타겟:** {concept['target']}\n"
result += f"**🔑 핵심 키워드:** {', '.join(concept['keywords'])}\n"
result += f"**📈 참여 요인:** {concept['participation_factor']}\n"
result += f"**🎨 추천 색상:** {', '.join(concept['colors'])}\n\n"
result += "---\n\n"
concept_names.append(concept['name'])
result += f"**💬 총평:** {month}{data.get('mood', '특별한')} 특성을 가진 달로, "
result += f"특히 20-40대 여성에게는 '{data.get('female_appeal', ['특별한'])[0]}' 관련 이벤트가 "
result += f"높은 참여도를 보일 것으로 예상됩니다."
return result, concept_names "계절 공감대, 일상 연관성"
})
# 컨셉 5: 스페셜 데이 기반
if data.get("special_days"):
special = data["special_days"][0]
concepts.append({
"name": f"{special} 스페셜 위크",
"theme": f"{special} 맞이 특별 혜택 이벤트",
"score": 7.8,
"reason": f"{special}의 특별함으로 프리미엄 이벤트 효과",
"target": "20-40대 여성, 혜택 관심층",
"colors": data.get("colors", ["#FFB6C1"]),
"keywords": data.get("special_days", [])[:2] + ["혜택", "특별"],
"participation_factor": "특별함 기대, 혜택 매력도"
})
# 컨셉 6: 커뮤니티 소통 기반
concepts.append({
"name": f"{month} 우리들의 이야기",
"theme": "커뮤니티 멤버 간 소통과 공감 이벤트",
"score": 7.0,
"reason": "커뮤니티 결속력 강화와 지속적 참여 유도",
"target": "기존 회원, 커뮤니티 활동 적극층",
"colors": data.get("colors", ["#87CEEB"]),
"keywords": ["소통", "공감", "스토리", "우리"],
"participation_factor": "소속감, 진정성"
})
# 결과 텍스트 생성
result = f"# 🎯 {month} 고도화된 컨셉 분석 (절기 포함)\n\n"
result += f"**📊 분석 기준:** {data.get('mood', '특별한')} 분위기\n"
result += f"**🎨 주요 색상:** {', '.join(data.get('colors', ['기본색상'])[:3])}\n"
result += f"**🔥 핵심 트렌드:** {', '.join(data.get('trends', ['기본트렌드'])[:3])}\n"
result += f"**🌿 해당 절기:** {', '.join(data.get('seasonal_terms', ['해당없음']))}\n\n"
concept_names = []
for i, concept in enumerate(concepts, 1):
result += f"## {i}. {concept['name']}\n"
result += f"**🏷️ 테마:** {concept['theme']}\n"
result += f"**⭐ 참여도 점수:** {concept['score']}/10점\n"
result += f"**💡 선정 이유:** {concept['reason']}\n"
result += f"**🎯 주요 타겟:** {concept['target']}\n"
result += f"**🔑 핵심 키워드:** {', '.join(concept['keywords'])}\n"
result += f"**📈 참여 요인:** {concept['participation_factor']}\n"
result += f"**🎨 추천 색상:** {', '.join(concept['colors'])}\n\n"
result += "---\n\n"
concept_names.append(concept['name'])
result += f"**💬 총평:** {month}{data.get('mood', '특별한')} 특성을 가진 달로, "
result += f"특히 '{data.get('trends', ['트렌드'])[0]}' 관련 이벤트가 높은 참여도를 보일 것으로 예상됩니다."
return result, concept_names
def generate_design_recommendations(concept_name, month):
"""재미있고 참여율 높은 디자인 추천"""
design_styles = {
"미니멀": {
"style": "심플 미니멀 디자인",
"description": "깔끔한 선과 여백을 활용한 세련된 디자인",
"engagement": "차분하면서도 고급스러운 느낌으로 신뢰감 상승",
"colors": ["화이트", "베이지", "소프트 그레이"],
"elements": ["기하학적 도형", "타이포그래피 중심", "여백 활용"]
},
"네온사인": {
"style": "레트로 네온사인 스타일",
"description": "80년대 네온사인을 연상시키는 화려한 디자인",
"engagement": "강렬한 임팩트로 눈길 끌기 + 레트로 감성으로 MZ세대 어필",
"colors": ["네온 핑크", "사이버 블루", "일렉트릭 퍼플"],
"elements": ["글로우 이펙트", "그라데이션", "미래적 폰트"]
},
"손그림": {
"style": "손그림 일러스트 스타일",
"description": "따뜻하고 친근한 손그림 느낌의 일러스트",
"engagement": "친근함과 정성스러운 느낌으로 감정적 유대감 형성",
"colors": ["파스텔 톤", "자연색상", "부드러운 색감"],
"elements": ["손글씨 폰트", "낙서 느낌", "유기적 형태"]
},
"Y2K": {
"style": "Y2K 레트로 퓨처 스타일",
"description": "2000년대 초반 미래적 감성의 화려한 디자인",
"engagement": "노스탤지어 + 독특함으로 화제성 극대화",
"colors": ["홀로그램", "메탈릭", "그라데이션"],
"elements": ["3D 오브젝트", "크롬 효과", "기하학 패턴"]
},
"코어": {
"style": "○○코어 트렌드 스타일",
"description": "coquette, cottagecore 등 인스타 트렌드 반영",
"engagement": "인스타 감성으로 SNS 공유욕구 자극",
"colors": ["빈티지 톤", "무드 컬러", "감성 색상"],
"elements": ["빈티지 텍스처", "감성 오브젝트", "무드 사진"]
},
"게임UI": {
"style": "게임 인터페이스 스타일",
"description": "RPG나 모바일 게임의 UI를 모티브로 한 디자인",
"engagement": "게임화 요소로 참여 재미도 증가 + 젊은층 어필",
"colors": ["비비드 컬러", "골드 액센트", "다크 모드"],
"elements": ["체력바", "레벨업", "아이템 아이콘"]
}
}
# 월별 추천 디자인 (계절과 분위기에 맞게)
monthly_design = {
"1월": ["미니멀", "Y2K"], "2월": ["코어", "손그림"],
"3월": ["손그림", "코어"], "4월": ["손그림", "네온사인"],
"5월": ["코어", "손그림"], "6월": ["네온사인", "Y2K"],
"7월": ["Y2K", "네온사인"], "8월": ["Y2K", "게임UI"],
"9월": ["코어", "미니멀"], "10월": ["코어", "손그림"],
"11월": ["미니멀", "손그림"], "12월": ["네온사인", "게임UI"]
}
month_key = month.replace('월', '월')
recommended_designs = monthly_design.get(month_key, ["미니멀", "손그림"])
result = "## 🎨 추천 디자인 스타일\n\n"
for i, design_key in enumerate(recommended_designs, 1):
design = design_styles[design_key]
result += f"### {i}. {design['style']} 🌟\n"
result += f"**설명:** {design['description']}\n"
result += f"**참여도 효과:** {design['engagement']}\n"
result += f"**추천 색상:** {', '.join(design['colors'])}\n"
result += f"**핵심 요소:** {', '.join(design['elements'])}\n\n"
return result
def analyze_period_and_recommend_concept(event_period, month):
"""이벤트 기간과 월에 맞는 최적 컨셉 추천"""
import re
# 기간에서 특별한 날짜 추출
special_dates = {
"01.01": "신정", "02.14": "밸런타인데이", "03.14": "화이트데이",
"04.01": "만우절", "05.05": "어린이날", "06.06": "현충일",
"07.07": "칠석", "08.15": "광복절", "09.15": "추석예상",
"10.09": "한글날", "11.11": "빼빼로데이", "12.25": "크리스마스"
}
# 기간에서 월.일 패턴 찾기
date_matches = re.findall(r'(\d{1,2})\.(\d{1,2})', event_period) if event_period else []
period_special = None
if date_matches:
for month_num, day_num in date_matches:
date_key = f"{month_num.zfill(2)}.{day_num.zfill(2)}"
if date_key in special_dates:
period_special = special_dates[date_key]
break
# 월별 + 기간별 맞춤 추천
recommendations = {
"1월": {
"default": "미니멀 챌린지",
"special": {
"신정": "신년 다짐 챌린지",
"설날": "새해맞이 감사"
}
},
"2월": {
"default": "셀프러브 위크",
"special": {
"밸런타인데이": "갈렌타인데이 축제"
}
},
"3월": {
"default": "봄맞이 감성",
"special": {
"화이트데이": "화이트데이 스페셜"
}
},
"7월": {
"default": "여름 바캉스",
"special": {
"칠석": "칠석 로맨스"
}
},
"11월": {
"default": "가을 감성",
"special": {
"빼빼로데이": "빼빼로데이 페스티벌"
}
},
"12월": {
"default": "연말 감성",
"special": {
"크리스마스": "크리스마스 스페셜"
}
}
}
month_key = month.replace('월', '월') if month else "1월"
month_rec = recommendations.get(month_key, {"default": "특별한 순간", "special": {}})
if period_special and period_special in month_rec["special"]:
return month_rec["special"][period_special]
else:
return month_rec["default"]
"""최신 트렌드를 반영한 카피라이팅 생성 (예능/드라마/밈 활용)"""
# 2024-2025 최신 트렌드 반영
trendy_copies = {
"미니멀": {
"sub1": "🌟 '나는 정리를 못하는 여자'는 이제 그만!",
"main": "미니멀은 '미'니로 '말'하는 거야, 작게 말해도 큰 변화! ✨",
"sub2": "올해는 진짜 '갓생'을 살아보자구요! 💪",
"hashtags": ["#갓생살기", "#미니멀", "#정리의신", "#새해정리"],
"reference": "정리의 신, 갓생 트렌드"
},
"플래너": {
"sub1": "📅 '너 계획 있어?'라는 말에 당당하게!",
"main": "플래너는 '플랜'을 '어'떻게 세우'나'의 줄임말이야 📝",
"sub2": "2025년엔 진짜 계획적인 인간이 되어보자 🎯",
"hashtags": ["#플래너챌린지", "#계획적인생", "#목표달성", "#자기계발"],
"reference": "계획적 인생 트렌드"
},
"셀프러브": {
"sub1": "💕 '나 자신과 연애 중'이라고 말할 수 있나요?",
"main": "셀프러브는 '셀프'로 '러브'하는 거 맞아! 💖",
"sub2": "오늘부터 내가 내 최고의 연인이 되는 거야 ✨",
"hashtags": ["#셀프러브", "#나를위한시간", "#갈렌타인", "#솔로라이프"],
"reference": "갈렌타인데이, 셀프케어 문화"
},
"봄맞이": {
"sub1": "🌸 '봄이 오네 봄이 와~' 기분이 들죠?",
"main": "봄맞이는 '봄'을 '맞'이하는 게 아니라 '맞다'이! 🌱",
"sub2": "이번 봄엔 정말 '꽃길'만 걸어보자구요 💐",
"hashtags": ["#봄맞이", "#꽃길걷기", "#새시작", "#벚꽃엔딩"],
"reference": "봄 관련 트렌드, 꽃길 표현"
},
"바캉스": {
"sub1": "🏖️ '일상 탈출'이 필요한 순간이에요!",
"main": "바캉스는 '바'로 떠나서 '캉'스럽게 쉬는 거야! ☀️",
"sub2": "올여름엔 진짜 '힐링'이 뭔지 보여주겠어 🌊",
"hashtags": ["#바캉스", "#일상탈출", "#힐링여행", "#여름휴가"],
"reference": "일상탈출, 힐링 문화"
},
"가을감성": {
"sub1": "🍂 '가을엔 뭔가 감성이 충전되는 기분'",
"main": "가을감성은 '가'슴이 '을'마나 따뜻해지는 '감성'이야 🧡",
"sub2": "이 계절엔 모든 게 '에모'해져요 ☕",
"hashtags": ["#가을감성", "#에모모드", "#감성충전", "#코지라이프"],
"reference": "에모 트렌드, 감성 문화"
},
"크리스마스": {
"sub1": "🎄 '올해 크리스마스는 어떻게 보내지?'",
"main": "메리크리스마스? 메리하게 크리스마스! 🎅",
"sub2": "연말엔 모든 게 '띵작'이 되는 마법이 있어요 ✨",
"hashtags": ["#메리크리스마스", "#연말감성", "#띵작연말", "#홀리데이"],
"reference": "연말 분위기, 띵작 표현"
},
"독서": {
"sub1": "📚 '책 읽는 여자가 아름답다'는 말 있잖아요",
"main": "독서는 '독'특한 '서'사를 만나는 시간이야! 📖",
"sub2": "오늘부터 '북스타그램' 시작해볼까요? 📸",
"hashtags": ["#독서모드", "#북스타그램", "#책읽는여자", "#독서의계절"],
"reference": "북스타그램, 독서 문화"
},
"커피": {
"sub1": "☕ '오늘 카페인 얼마나 섭취했지?'",
"main": "카페는 '카'페인을 '페'어하게 즐기는 곳이야! ☕",
"sub2": "오늘도 '카페인 중독자'의 하루가 시작돼요 💪",
"hashtags": ["#카페투어", "#커피러버", "#카페인중독", "#감성카페"],
"reference": "카페 문화, 커피 애호가 트렌드"
}
}
# 계절별 기본 카피 (매칭되는 게 없을 때)
seasonal_copies = {
"1월": {
"sub1": "🌟 '새해 새마음'이라는 말이 괜히 있는 게 아니야",
"main": "2025년은 '이십이오'라고 읽으면 '이십이 오'케이! ✨",
"sub2": "올해는 정말 '레전드 한 해'가 될 거예요 🚀",
"hashtags": ["#새해새마음", "#2025레전드", "#갓생예약", "#새출발"],
"reference": "새해 다짐 문화"
},
"기본": {
"sub1": "✨ 이런 특별한 순간을 놓칠 수 없죠!",
"main": "지금 이 순간이 바로 '찐'이야! 💫",
"sub2": "함께라면 뭐든 '레전드'가 될 수 있어요 🎉",
"hashtags": ["#찐이야", "#레전드순간", "#함께해요", "#특별한시간"],
"reference": "MZ세대 표현"
}
}
# 컨셉명에서 키워드 추출하여 적절한 카피 선택
selected_copy = None
for keyword, copy_data in trendy_copies.items():
if any(k in concept_name for k in keyword.split()) or keyword in concept_name:
selected_copy = copy_data
break
# 월별 기본 카피 사용
if not selected_copy:
month_key = month.replace('월', '월')
selected_copy = seasonal_copies.get(month_key, seasonal_copies["기본"])
return selected_copy
def generate_notice(concept, event_type, event_period, prize_benefits):
"""트렌디한 카피라이팅이 포함된 공지사항 생성"""
if not concept:
return "먼저 컨셉을 선택해주세요."
# 이벤트 기간이 입력되지 않았으면 기본값 사용
if not event_period or event_period.strip() == "":
now = datetime.now()
start_date = now.strftime("%Y.%m.%d")
end_date = f"{now.year}.{now.month}.{now.day + 7}"
period_text = f"{start_date} ~ {end_date}"
else:
period_text = event_period
# 월 추출
month = extract_month_from_period(period_text)
if not month:
month = f"{datetime.now().month}월"
# 트렌디한 카피 생성
copy_data = generate_trendy_copy(concept, month, period_text)
# 디자인 추천 생성
design_recommendations = generate_design_recommendations(concept, month)
# 당첨 혜택이 입력되지 않았으면 기본값 사용
if not prize_benefits or prize_benefits.strip() == "":
default_benefits = """✨ 1등 (1명): 스타벅스 5만원 기프트카드
🎉 2등 (3명): 베스킨라빈스 아이스크림 쿠폰
💝 3등 (10명): 편의점 5천원 상품권
🌟 참가상 (50명): 모바일 치킨 쿠폰"""
benefits_text = default_benefits
else:
benefits_text = prize_benefits
# 해시태그 문자열 생성
hashtags_text = " ".join(copy_data['hashtags'])
notice = f"""{copy_data['sub1']}
💫 {copy_data['main']} 💫
{copy_data['sub2']}
🎉 {concept} 🎉
📅 이벤트 기간: {period_text} 23:59
{hashtags_text}
{design_recommendations}
========================
✨ EVENT
특별한 {concept}을 준비했어요!
많은 분들의 적극적인 참여를 기다리고 있습니다 💕
이번 이벤트는 단순한 참여가 아닌,
우리만의 특별한 추억을 만들어가는 시간이에요 ✨
💡 **참고:** {copy_data.get('reference', '최신 트렌드')} 반영
========================
🎯 참여 방법
1️⃣ 이벤트 내용 확인하기
2️⃣ {event_type} 참여하기
3️⃣ 참여 완료!
=================
🎁 당첨혜택
{benefits_text}
📋 추첨: 참여자 중 무작위 추첨
========================
👥 이벤트 대상
✅ 커뮤니티 회원
✅ 만 18세 이상
✅ 이벤트 기간 내 참여자
========================
⚠️ 주의사항
※ 부적절한 참여는 제외됩니다
※ 중복 참여 불가
※ 당첨자는 본인 확인 필요
===========================
📞 문의: 1234-5678
💬 카카오톡: @event_community
{hashtags_text}
💝 많은 참여 부탁드려요! 감사합니다 💝"""
return notice
def create_interface():
"""그라디오 인터페이스 생성"""
with gr.Blocks(title="이벤트 공지사항 생성기") as demo:
gr.Markdown("# 🎉 이벤트 공지사항 생성기")
gr.Markdown("### 간편하게 이벤트 공지사항을 만들어보세요!")
with gr.Row():
with gr.Column():
gr.Markdown("## 설정")
event_period_input = gr.Textbox(
label="이벤트 기간",
placeholder="예: 2024.12.01 ~ 2024.12.07 (월이 자동 인식됩니다)",
info="이벤트 기간을 입력하면 해당 월이 자동으로 선택됩니다"
)
month_dropdown = gr.Dropdown(
choices=[f"{i}월" for i in range(1, 13)],
label="이벤트 월 선택",
value="1월",
info="이벤트 기간에서 자동 인식되거나 직접 선택"
)
analyze_btn = gr.Button("컨셉 분석하기", variant="primary")
concept_dropdown = gr.Dropdown(
label="컨셉 선택",
visible=False
)
event_type_dropdown = gr.Dropdown(
choices=["댓글 달기", "게시글 작성", "좋아요 누르기"],
label="이벤트 유형",
value="댓글 달기"
)
gr.Markdown("## 🎁 당첨 혜택 설정")
prize_benefits_input = gr.Textbox(
label="당첨 혜택",
placeholder="""예시:
✨ 1등 (1명): 아이폰 15 Pro
🎉 2등 (3명): 에어팟 프로
💝 3등 (10명): 스타벅스 1만원 기프트카드
🌟 참가상 (50명): 카페 아메리카노 쿠폰""",
lines=6,
info="당첨 혜택을 입력하지 않으면 기본 혜택이 적용됩니다"
)
generate_btn = gr.Button("공지사항 생성하기", variant="secondary", visible=False)
with gr.Column():
gr.Markdown("## 결과")
concept_output = gr.Textbox(
label="고도화된 분석 결과",
lines=20,
placeholder="먼저 '컨셉 분석하기' 버튼을 클릭하세요"
)
notice_output = gr.Textbox(
label="생성된 공지사항",
lines=20,
placeholder="컨셉을 선택하고 '공지사항 생성하기' 버튼을 클릭하세요"
)
# 상태 변수
concepts_state = gr.State([])
selected_concept_state = gr.State("")
def handle_period_change(period_text):
"""이벤트 기간 변경시 월 자동 인식"""
detected_month = extract_month_from_period(period_text)
if detected_month:
return gr.update(value=detected_month)
return gr.update()
def handle_analyze(month):
"""분석 처리"""
result, concepts = analyze_concepts(month)
return (
result,
gr.update(choices=concepts, visible=True, value=concepts[0]),
gr.update(visible=True),
concepts
)
def handle_concept_change(concept, concepts):
"""컨셉 변경 처리"""
return concept
def handle_generate(concept, event_type, event_period, prize_benefits):
"""생성 처리"""
notice = generate_notice(concept, event_type, event_period, prize_benefits)
return notice
# 이벤트 연결
event_period_input.change(
handle_period_change,
inputs=[event_period_input],
outputs=[month_dropdown]
)
analyze_btn.click(
handle_analyze,
inputs=[month_dropdown],
outputs=[concept_output, concept_dropdown, generate_btn, concepts_state]
)
concept_dropdown.change(
handle_concept_change,
inputs=[concept_dropdown, concepts_state],
outputs=[selected_concept_state]
)
generate_btn.click(
handle_generate,
inputs=[selected_concept_state, event_type_dropdown, event_period_input, prize_benefits_input],
outputs=[notice_output]
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch()