aliceblue11 commited on
Commit
d4d64af
·
verified ·
1 Parent(s): c41bcc7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -406
app.py CHANGED
@@ -142,7 +142,7 @@ def analyze_concepts(month):
142
  "seasons": ["늦가을", "겨울준비", "포근함"],
143
  "colors": ["#8B4513", "#A0522D", "#CD853F"],
144
  "mood": "포근하고 준비하는",
145
- "female_appeal": ["빼빼로데이", "겨울패션", "연말모임", "코지라이프"]
146
  },
147
  "12월": {
148
  "holidays": ["크리스마스"],
@@ -285,60 +285,6 @@ def analyze_concepts(month):
285
  result += f"특히 20-40대 여성에게는 '{data.get('female_appeal', ['특별한'])[0]}' 관련 이벤트가 "
286
  result += f"높은 참여도를 보일 것으로 예상됩니다."
287
 
288
- return result, concept_names "계절 공감대, 일상 연관성"
289
- })
290
-
291
- # 컨셉 5: 스페셜 데이 기반
292
- if data.get("special_days"):
293
- special = data["special_days"][0]
294
- concepts.append({
295
- "name": f"{special} 스페셜 위크",
296
- "theme": f"{special} 맞이 특별 혜택 이벤트",
297
- "score": 7.8,
298
- "reason": f"{special}의 특별함으로 프리미엄 이벤트 효과",
299
- "target": "20-40대 여성, 혜택 관심층",
300
- "colors": data.get("colors", ["#FFB6C1"]),
301
- "keywords": data.get("special_days", [])[:2] + ["혜택", "특별"],
302
- "participation_factor": "특별함 기대, 혜택 매력도"
303
- })
304
-
305
- # 컨셉 6: 커뮤니티 소통 기반
306
- concepts.append({
307
- "name": f"{month} 우리들의 이야기",
308
- "theme": "커뮤니티 멤버 간 소통과 공감 이벤트",
309
- "score": 7.0,
310
- "reason": "커뮤니티 결속력 강화와 지속적 참여 유도",
311
- "target": "기존 회원, 커뮤니티 활동 적극층",
312
- "colors": data.get("colors", ["#87CEEB"]),
313
- "keywords": ["소통", "공감", "스토리", "우리"],
314
- "participation_factor": "소속감, 진정성"
315
- })
316
-
317
- # 결과 텍스트 생성
318
- result = f"# 🎯 {month} 고도화된 컨셉 분석 (절기 포함)\n\n"
319
- result += f"**📊 분석 기준:** {data.get('mood', '특별한')} 분위기\n"
320
- result += f"**🎨 주요 색상:** {', '.join(data.get('colors', ['기본색상'])[:3])}\n"
321
- result += f"**🔥 핵심 트렌드:** {', '.join(data.get('trends', ['기본트렌드'])[:3])}\n"
322
- result += f"**🌿 해당 절기:** {', '.join(data.get('seasonal_terms', ['해당없음']))}\n\n"
323
-
324
- concept_names = []
325
-
326
- for i, concept in enumerate(concepts, 1):
327
- result += f"## {i}. {concept['name']}\n"
328
- result += f"**🏷️ 테마:** {concept['theme']}\n"
329
- result += f"**⭐ 참여도 점수:** {concept['score']}/10점\n"
330
- result += f"**💡 선정 이유:** {concept['reason']}\n"
331
- result += f"**🎯 주요 타겟:** {concept['target']}\n"
332
- result += f"**🔑 핵심 키워드:** {', '.join(concept['keywords'])}\n"
333
- result += f"**📈 참여 요인:** {concept['participation_factor']}\n"
334
- result += f"**🎨 추천 색상:** {', '.join(concept['colors'])}\n\n"
335
- result += "---\n\n"
336
-
337
- concept_names.append(concept['name'])
338
-
339
- result += f"**💬 총평:** {month}은 {data.get('mood', '특별한')} 특성을 가진 달로, "
340
- result += f"특히 '{data.get('trends', ['트렌드'])[0]}' 관련 이벤트가 높은 참여도를 보일 것으로 예상됩니다."
341
-
342
  return result, concept_names
343
 
344
  def generate_design_recommendations(concept_name, month):
@@ -413,79 +359,9 @@ def generate_design_recommendations(concept_name, month):
413
  result += f"**핵심 요소:** {', '.join(design['elements'])}\n\n"
414
 
415
  return result
416
- def analyze_period_and_recommend_concept(event_period, month):
417
- """이벤트 기간과 월에 맞는 최적 컨셉 추천"""
418
-
419
- import re
420
-
421
- # 기간에서 특별한 날짜 추출
422
- special_dates = {
423
- "01.01": "신정", "02.14": "밸런타인데이", "03.14": "화이트데이",
424
- "04.01": "만우절", "05.05": "어린이날", "06.06": "현충일",
425
- "07.07": "칠석", "08.15": "광복절", "09.15": "추석예상",
426
- "10.09": "한글날", "11.11": "빼빼로데이", "12.25": "크리스마스"
427
- }
428
-
429
- # 기간에서 월.일 패턴 찾기
430
- date_matches = re.findall(r'(\d{1,2})\.(\d{1,2})', event_period) if event_period else []
431
-
432
- period_special = None
433
- if date_matches:
434
- for month_num, day_num in date_matches:
435
- date_key = f"{month_num.zfill(2)}.{day_num.zfill(2)}"
436
- if date_key in special_dates:
437
- period_special = special_dates[date_key]
438
- break
439
-
440
- # 월별 + 기간별 맞춤 추천
441
- recommendations = {
442
- "1월": {
443
- "default": "미니멀 챌린지",
444
- "special": {
445
- "신정": "신년 다짐 챌린지",
446
- "설날": "새해맞이 감사"
447
- }
448
- },
449
- "2���": {
450
- "default": "셀프러브 위크",
451
- "special": {
452
- "밸런타인데이": "갈렌타인데이 축제"
453
- }
454
- },
455
- "3월": {
456
- "default": "봄맞이 감성",
457
- "special": {
458
- "화이트데이": "화이트데이 스페셜"
459
- }
460
- },
461
- "7월": {
462
- "default": "여름 바캉스",
463
- "special": {
464
- "칠석": "칠석 로맨스"
465
- }
466
- },
467
- "11월": {
468
- "default": "가을 감성",
469
- "special": {
470
- "빼빼로데이": "빼빼로데이 페스티벌"
471
- }
472
- },
473
- "12월": {
474
- "default": "연말 감성",
475
- "special": {
476
- "크리스마스": "크리스마스 스페셜"
477
- }
478
- }
479
- }
480
-
481
- month_key = month.replace('월', '월') if month else "1월"
482
- month_rec = recommendations.get(month_key, {"default": "특별한 순간", "special": {}})
483
-
484
- if period_special and period_special in month_rec["special"]:
485
- return month_rec["special"][period_special]
486
- else:
487
- return month_rec["default"]
488
- """최신 트렌드를 반영한 카피라이팅 생성 (예능/드라마/밈 활용)"""
489
 
490
  # 2024-2025 최신 트렌드 반영
491
  trendy_copies = {
@@ -496,13 +372,6 @@ def analyze_period_and_recommend_concept(event_period, month):
496
  "hashtags": ["#갓생살기", "#미니멀", "#정리의신", "#새해정리"],
497
  "reference": "정리의 신, 갓생 트렌드"
498
  },
499
- "플래너": {
500
- "sub1": "📅 '너 계획 있어?'라는 말에 당당하게!",
501
- "main": "플래너는 '플랜'을 '어'떻게 세우'나'의 줄임말이야 📝",
502
- "sub2": "2025년엔 진짜 계획적인 인간이 되어보자 🎯",
503
- "hashtags": ["#플래너챌린지", "#계획적인생", "#목표달성", "#자기계발"],
504
- "reference": "계획적 인생 트렌드"
505
- },
506
  "셀프러브": {
507
  "sub1": "💕 '나 자신과 연애 중'이라고 말할 수 있나요?",
508
  "main": "셀프러브는 '셀프'로 '러브'하는 거 맞아! 💖",
@@ -524,37 +393,23 @@ def analyze_period_and_recommend_concept(event_period, month):
524
  "hashtags": ["#바캉스", "#일상탈출", "#힐링여행", "#여름휴가"],
525
  "reference": "일상탈출, 힐링 문화"
526
  },
 
 
 
 
 
 
 
527
  "가을감성": {
528
  "sub1": "🍂 '가을엔 뭔가 감성이 충전되는 기분'",
529
  "main": "가을감성은 '가'슴이 '을'마나 따뜻해지는 '감성'이야 🧡",
530
  "sub2": "이 계절엔 모든 게 '에모'해져요 ☕",
531
- "hashtags": ["#가을감성", "#에모모드", "#감성충전", "#코지라이프"],
532
  "reference": "에모 트렌드, 감성 문화"
533
- },
534
- "크리스마스": {
535
- "sub1": "🎄 '올해 크리스마스는 어떻게 보내지?'",
536
- "main": "메리크리스마스? 메리하게 크리스마스! 🎅",
537
- "sub2": "연말엔 모든 게 '띵작'이 되는 마법이 있어요 ✨",
538
- "hashtags": ["#메리크리스마스", "#연말감성", "#띵작연말", "#홀리데이"],
539
- "reference": "연말 분위기, 띵작 표현"
540
- },
541
- "독서": {
542
- "sub1": "📚 '책 읽는 여자가 아름답다'는 말 있잖아요",
543
- "main": "독서는 '독'특한 '서'사를 만나는 시간이야! 📖",
544
- "sub2": "오늘부터 '북스타그램' 시작해볼까요? 📸",
545
- "hashtags": ["#독서모드", "#북스타그램", "#책읽는여자", "#독서의계절"],
546
- "reference": "북스타그램, 독서 문화"
547
- },
548
- "커피": {
549
- "sub1": "☕ '오늘 카페인 얼마나 섭취했지?'",
550
- "main": "카페는 '카'페인을 '페'어하게 즐기는 곳이야! ☕",
551
- "sub2": "오늘도 '카페인 중독자'의 하루가 시작돼요 💪",
552
- "hashtags": ["#카페투어", "#커피러버", "#카페인중독", "#감성카페"],
553
- "reference": "카페 문화, 커피 애호가 트렌드"
554
  }
555
  }
556
 
557
- # 계절별 기본 카피 (매칭되는 게 없을 때)
558
  seasonal_copies = {
559
  "1월": {
560
  "sub1": "🌟 '새해 새마음'이라는 말이 괜히 있는 게 아니야",
@@ -563,251 +418,5 @@ def analyze_period_and_recommend_concept(event_period, month):
563
  "hashtags": ["#새해새마음", "#2025레전드", "#갓생예약", "#새출발"],
564
  "reference": "새해 다짐 문화"
565
  },
566
- "기본": {
567
- "sub1": " 이런 특별한 순간을 놓칠 수 없죠!",
568
- "main": "지금 이 순간이 바로 '찐'이야! 💫",
569
- "sub2": "함께라면 뭐든 '레전드'가 될 수 있어요 🎉",
570
- "hashtags": ["#찐이야", "#레전드순간", "#함께해요", "#특별한시간"],
571
- "reference": "MZ세대 표현"
572
- }
573
- }
574
-
575
- # 컨셉명에서 키워드 추출하여 적절한 카피 선택
576
- selected_copy = None
577
- for keyword, copy_data in trendy_copies.items():
578
- if any(k in concept_name for k in keyword.split()) or keyword in concept_name:
579
- selected_copy = copy_data
580
- break
581
-
582
- # 월별 기본 카피 사용
583
- if not selected_copy:
584
- month_key = month.replace('월', '월')
585
- selected_copy = seasonal_copies.get(month_key, seasonal_copies["기본"])
586
-
587
- return selected_copy
588
-
589
- def generate_notice(concept, event_type, event_period, prize_benefits):
590
- """트렌디한 카피라이팅이 포함된 공지사항 생성"""
591
-
592
- if not concept:
593
- return "먼저 컨셉을 선택해주세요."
594
-
595
- # 이벤트 기간이 입력되지 않았으면 기본값 사용
596
- if not event_period or event_period.strip() == "":
597
- now = datetime.now()
598
- start_date = now.strftime("%Y.%m.%d")
599
- end_date = f"{now.year}.{now.month}.{now.day + 7}"
600
- period_text = f"{start_date} ~ {end_date}"
601
- else:
602
- period_text = event_period
603
-
604
- # 월 추출
605
- month = extract_month_from_period(period_text)
606
- if not month:
607
- month = f"{datetime.now().month}월"
608
-
609
- # 트렌디한 카피 생성
610
- copy_data = generate_trendy_copy(concept, month, period_text)
611
-
612
- # 디자인 추천 생성
613
- design_recommendations = generate_design_recommendations(concept, month)
614
-
615
- # 당첨 혜택이 입력되지 않았으면 기본값 사용
616
- if not prize_benefits or prize_benefits.strip() == "":
617
- default_benefits = """✨ 1등 (1명): 스타벅스 5만원 기프트카드
618
- 🎉 2등 (3명): 베스킨라빈스 아이스크림 쿠폰
619
- 💝 3등 (10명): 편의점 5천원 상품권
620
- 🌟 참가상 (50명): 모바일 치킨 쿠폰"""
621
- benefits_text = default_benefits
622
- else:
623
- benefits_text = prize_benefits
624
-
625
- # 해시태그 문자열 생성
626
- hashtags_text = " ".join(copy_data['hashtags'])
627
-
628
- notice = f"""{copy_data['sub1']}
629
-
630
- 💫 {copy_data['main']} 💫
631
-
632
- {copy_data['sub2']}
633
-
634
- 🎉 {concept} 🎉
635
-
636
- 📅 이벤트 기간: {period_text} 23:59
637
-
638
- {hashtags_text}
639
-
640
- {design_recommendations}
641
-
642
- ========================
643
- ✨ EVENT
644
- 특별한 {concept}을 준비했어요!
645
- 많은 분들의 적극적인 참여를 기다리고 있습니다 💕
646
-
647
- 이번 이벤트는 단순한 참여가 아닌,
648
- 우리만의 특별한 추억을 만들어가는 시간이에요 ✨
649
-
650
- 💡 **참고:** {copy_data.get('reference', '최신 트렌드')} 반영
651
- ========================
652
-
653
- 🎯 참여 방법
654
- 1️⃣ 이벤트 내용 확인하기
655
- 2️⃣ {event_type} 참여하기
656
- 3️⃣ 참여 완료!
657
-
658
- =================
659
- 🎁 당첨혜택
660
- {benefits_text}
661
-
662
- 📋 추첨: 참여자 중 무작위 추첨
663
- ========================
664
-
665
- 👥 이벤트 대상
666
- ✅ 커뮤니티 회원
667
- ✅ 만 18세 이상
668
- ✅ 이벤트 기간 내 참여자
669
- ========================
670
-
671
- ⚠️ 주의사항
672
- ※ 부적절한 참여는 제외됩니다
673
- ※ 중복 참여 불가
674
- ※ 당첨자는 본인 확인 필요
675
-
676
- ===========================
677
- 📞 문의: 1234-5678
678
- 💬 카카오톡: @event_community
679
-
680
- {hashtags_text}
681
-
682
- 💝 많은 참여 부탁드려요! 감사합니다 💝"""
683
-
684
- return notice
685
-
686
- def create_interface():
687
- """그라디오 인터페이스 생성"""
688
-
689
- with gr.Blocks(title="이벤트 공지사항 생성기") as demo:
690
-
691
- gr.Markdown("# 🎉 이벤트 공지사항 생성기")
692
- gr.Markdown("### 간편하게 이벤트 공지사항을 만들어보세요!")
693
-
694
- with gr.Row():
695
- with gr.Column():
696
- gr.Markdown("## 설정")
697
-
698
- event_period_input = gr.Textbox(
699
- label="이벤트 기간",
700
- placeholder="예: 2024.12.01 ~ 2024.12.07 (월이 자동 인식됩니다)",
701
- info="이벤트 기간을 입력하면 해당 월이 자동으로 선택됩니다"
702
- )
703
-
704
- month_dropdown = gr.Dropdown(
705
- choices=[f"{i}월" for i in range(1, 13)],
706
- label="이벤트 월 선택",
707
- value="1월",
708
- info="이벤트 기간��서 자동 인식되거나 직접 선택"
709
- )
710
-
711
- analyze_btn = gr.Button("컨셉 분석하기", variant="primary")
712
-
713
- concept_dropdown = gr.Dropdown(
714
- label="컨셉 선택",
715
- visible=False
716
- )
717
-
718
- event_type_dropdown = gr.Dropdown(
719
- choices=["댓글 달기", "게시글 작성", "좋아요 누르기"],
720
- label="이벤트 유형",
721
- value="댓글 달기"
722
- )
723
-
724
- gr.Markdown("## 🎁 당첨 혜택 설정")
725
-
726
- prize_benefits_input = gr.Textbox(
727
- label="당첨 혜택",
728
- placeholder="""예시:
729
- ✨ 1등 (1명): 아이폰 15 Pro
730
- 🎉 2등 (3명): 에어팟 프로
731
- 💝 3등 (10명): 스타벅스 1만원 기프트카드
732
- 🌟 참가상 (50명): 카페 아메리카노 쿠폰""",
733
- lines=6,
734
- info="당첨 혜택을 입력하지 않으면 기본 혜택이 적용됩니다"
735
- )
736
-
737
- generate_btn = gr.Button("공지사항 생성하기", variant="secondary", visible=False)
738
-
739
- with gr.Column():
740
- gr.Markdown("## 결과")
741
-
742
- concept_output = gr.Textbox(
743
- label="고도화된 분석 결과",
744
- lines=20,
745
- placeholder="먼저 '컨셉 분석하기' 버튼을 클릭하세요"
746
- )
747
-
748
- notice_output = gr.Textbox(
749
- label="생성된 공지사항",
750
- lines=20,
751
- placeholder="컨셉을 선택하고 '공지사항 생성하기' 버튼을 클릭하세요"
752
- )
753
-
754
- # 상태 변수
755
- concepts_state = gr.State([])
756
- selected_concept_state = gr.State("")
757
-
758
- def handle_period_change(period_text):
759
- """이벤트 기간 변경시 월 자동 인식"""
760
- detected_month = extract_month_from_period(period_text)
761
- if detected_month:
762
- return gr.update(value=detected_month)
763
- return gr.update()
764
-
765
- def handle_analyze(month):
766
- """분석 처리"""
767
- result, concepts = analyze_concepts(month)
768
- return (
769
- result,
770
- gr.update(choices=concepts, visible=True, value=concepts[0]),
771
- gr.update(visible=True),
772
- concepts
773
- )
774
-
775
- def handle_concept_change(concept, concepts):
776
- """컨셉 변경 처리"""
777
- return concept
778
-
779
- def handle_generate(concept, event_type, event_period, prize_benefits):
780
- """생성 처리"""
781
- notice = generate_notice(concept, event_type, event_period, prize_benefits)
782
- return notice
783
-
784
- # 이벤트 연결
785
- event_period_input.change(
786
- handle_period_change,
787
- inputs=[event_period_input],
788
- outputs=[month_dropdown]
789
- )
790
-
791
- analyze_btn.click(
792
- handle_analyze,
793
- inputs=[month_dropdown],
794
- outputs=[concept_output, concept_dropdown, generate_btn, concepts_state]
795
- )
796
-
797
- concept_dropdown.change(
798
- handle_concept_change,
799
- inputs=[concept_dropdown, concepts_state],
800
- outputs=[selected_concept_state]
801
- )
802
-
803
- generate_btn.click(
804
- handle_generate,
805
- inputs=[selected_concept_state, event_type_dropdown, event_period_input, prize_benefits_input],
806
- outputs=[notice_output]
807
- )
808
-
809
- return demo
810
-
811
- if __name__ == "__main__":
812
- demo = create_interface()
813
- demo.launch()
 
142
  "seasons": ["늦가을", "겨울준비", "포근함"],
143
  "colors": ["#8B4513", "#A0522D", "#CD853F"],
144
  "mood": "포근하고 준비하는",
145
+ "female_appeal": ["빼빼로데이", "겨울패션", "연말모임", "코지"]
146
  },
147
  "12월": {
148
  "holidays": ["크리스마스"],
 
285
  result += f"특히 20-40대 여성에게는 '{data.get('female_appeal', ['특별한'])[0]}' 관련 이벤트가 "
286
  result += f"높은 참여도를 보일 것으로 예상됩니다."
287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  return result, concept_names
289
 
290
  def generate_design_recommendations(concept_name, month):
 
359
  result += f"**핵심 요소:** {', '.join(design['elements'])}\n\n"
360
 
361
  return result
362
+
363
+ def generate_trendy_copy(concept_name, month, event_period):
364
+ """최신 트렌드를 반영한 카피라이팅 생성"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
 
366
  # 2024-2025 최신 트렌드 반영
367
  trendy_copies = {
 
372
  "hashtags": ["#갓생살기", "#미니멀", "#정리의신", "#새해정리"],
373
  "reference": "정리의 신, 갓생 트렌드"
374
  },
 
 
 
 
 
 
 
375
  "셀프러브": {
376
  "sub1": "💕 '나 자신과 연애 중'이라고 말할 수 있나요?",
377
  "main": "셀프러브는 '셀프'로 '러브'하는 거 맞아! 💖",
 
393
  "hashtags": ["#바캉스", "#일상탈출", "#힐링여행", "#여름휴가"],
394
  "reference": "일상탈출, 힐링 문화"
395
  },
396
+ "그린데이": {
397
+ "sub1": "💚 '그린'하면 생각나는 게 뭐예요?",
398
+ "main": "그린데이는 '그'냥 '린'스하지 말고 새롭게! 💚",
399
+ "sub2": "이번 여름엔 '그린'한 추억 만들어요 🌿",
400
+ "hashtags": ["#그린데이", "#여름추억", "#힐링", "#자연"],
401
+ "reference": "그린데이, 자연친화 트렌드"
402
+ },
403
  "가을감성": {
404
  "sub1": "🍂 '가을엔 뭔가 감성이 충전되는 기분'",
405
  "main": "가을감성은 '가'슴이 '을'마나 따뜻해지는 '감성'이야 🧡",
406
  "sub2": "이 계절엔 모든 게 '에모'해져요 ☕",
407
+ "hashtags": ["#가을감성", "#에모모드", "#감성충전", "#코지"],
408
  "reference": "에모 트렌드, 감성 문화"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
  }
410
  }
411
 
412
+ # 계절별 기본 카피
413
  seasonal_copies = {
414
  "1월": {
415
  "sub1": "🌟 '새해 새마음'이라는 말이 괜히 있는 게 아니야",
 
418
  "hashtags": ["#새해새마음", "#2025레전드", "#갓생예약", "#새출발"],
419
  "reference": "새해 다짐 문화"
420
  },
421
+ "8월": {
422
+ "sub1": "🏖️ '일상 탈출'이 필요한 순간이에요!",