import re from typing import List from datetime import datetime from collections import OrderedDict from translatepy import Translator # 번역 라이브러리 예시 class TitleGenerator: def __init__(self, forbidden_word_manager, naver_parser, kipris_api, gpt_client): self.forbidden_word_manager = forbidden_word_manager self.naver_parser = naver_parser self.kipris_api = kipris_api self.gpt_client = gpt_client self.translator = Translator() # 번역 라이브러리 초기화 def translate_product_name(self, original_name: str) -> str: """텍스트를 한국어로 번역하는 메서드""" try: result = self.translator.translate(original_name, "ko") return result.result if result else original_name except Exception as e: print(f"번역 중 오류 발생: {e}") return original_name def is_word_forbidden(self, word: str) -> bool: """금지어 매니저를 통해 단어가 금지어인지 확인""" return self.forbidden_word_manager.is_word_forbidden(word) def search_trademark(self, word: str) -> dict: """키프리스 API로 단어를 검색하는 메서드""" return self.kipris_api.search_trademark(word) def is_valid_word(self, word: str) -> bool: """숫자로만 이루어진 단어 또는 영어와 숫자로만 이루어진 단어를 검증하는 함수.""" return not (word.isdigit() or re.fullmatch(r'[A-Za-z0-9]+', word)) def extract_special_words(self, original_name: str) -> list: """원본 상품명에서 숫자로만 이루어진 단어와 영어와 숫자로만 이루어진 단어를 추출하는 함수.""" return [word for word in original_name.split() if word.isdigit() or re.fullmatch(r'[A-Za-z0-9]+', word)] def filter_invalid_words(self, words: list) -> list: """영어만 이루어진 단어와 영어와 숫자로 이루어진 단어를 제외하는 함수.""" return [word for word in words if not re.fullmatch(r'[A-Za-z0-9]+', word)] def process_top_titles(self, top_titles: list) -> list: """top_titles에서 유효하지 않은 단어(영어만 이루어진 단어와 영어와 숫자로 이루어진 단어)를 제외하는 함수.""" filtered_titles = [] for title in top_titles: filtered_words = self.filter_invalid_words(title.split()) filtered_titles.append(' '.join(filtered_words)) return filtered_titles def generate_product_title(self, original_name: str, keyword_name: str) -> str: """상품명을 생성하는 메서드""" # 1. 원본 상품명 번역 및 관련성 판단 translated_name = self.translate_product_name(original_name) print(f'translated_name : {translated_name}') is_related = self.gpt_client.is_related_product(translated_name, keyword_name) if not is_related: return "관련성이 없습니다." # 2. 키워드 상품명으로 검색 및 단어 리스트 생성 search_result = self.naver_parser.search_and_parse(keyword_name.split()[:4]) print(f'naver_parser search_result : {search_result}') # top_titles = search_result["top_products"] top_titles = [item['title'] for item in search_result["top_products"]] print(f'top_titles : {top_titles}') top_titles = self.process_top_titles(top_titles) keyword_title = list(set( word for title in [keyword_name] + top_titles # top_titles는 이미 문자열 리스트 for word in title.split() )) print(f'keyword_title : {keyword_title}') # 3. 숫자나 영어와 숫자로만 이루어진 단어 필터링 keyword_title = [word for word in keyword_title if self.is_valid_word(word)] print(f'keyword_title after filtering invalid words : {keyword_title}') # 4. 금지어 필터링 keyword_title = [word for word in keyword_title if not self.is_word_forbidden(word)] print(f'keyword_title after forbidden filter : {keyword_title}') # 4. 고유명사 추출 및 Kipris 검색 후 금지어 등록 kipris_word = self.gpt_client.extract_proper_nouns(keyword_title) print(f'kipris_word : {kipris_word}') # 고유명사 추출 결과가 keyword_title의 단어와 겹치는지 확인 if not any(word in kipris_word for word in keyword_title): print("No proper nouns found in the keyword_title. Skipping Kipris search.") final_keywords = keyword_title # 고유명사가 없으면 keyword_title 그대로 사용 else: final_keywords = [] for word in kipris_word: result_list = self.search_trademark(word) print(f'kipris_word for search_trademark result: {result_list}') is_registered = False for result in result_list: if result.get("application_status") in ["등록", "공개"]: is_registered = True self.forbidden_word_manager.register_word( word=word, has_trademark=True, category_code=result.get("category_code", ""), category_description=result.get("category_description", ""), registrant=result.get("registrant", ""), registration_date=result.get("registration_date", "") ) print(f'registered forbidden word: {word}') if not is_registered: final_keywords.append(word) print(f'added to final_keywords: {word}') # 5. 최종 keyword_title에서 kipris_word 제거 keyword_title = [word for word in keyword_title if word in final_keywords] print(f'final keyword_title after Kipris search: {keyword_title}') # 6. 최종 단어 리스트에서 '숫자 또는 영어와 숫자로만 이루어진 단어' 제외 keyword_title = [word for word in keyword_title if word in final_keywords] print(f'final keyword_title after Kipris search: {keyword_title}') # 7. 원본 상품명에서 숫자 또는 영어와 숫자로만 이루어진 단어 추출 및 포함 special_words = self.extract_special_words(original_name) print(f'special_words from original_name: {special_words}') keyword_title.extend(special_words) # 8. 중복 제거 후 최종 리스트 생성 keyword_title = list(set(keyword_title)) print(f'final keyword_title including special words: {keyword_title}') # 9. 최종 상품명 생성 product_title = self.gpt_client.generate_product_name(words=keyword_title, original_name=original_name, top_titles=top_titles) print(f'final product_title: {product_title}') return product_title from gpt_client import GPTClient from mongoDBManager import MongoDBManager from forbiddenWD_Manager import ForbiddenWordManager from naver_parser import NaverParser from kiprisAPI import Kipris_API if __name__ == "__main__": # 객체 생성 db_manager = MongoDBManager(db_url='mongodb://root:1234@cckb9998.synology.me:27017/') forbidden_manager = ForbiddenWordManager(db_manager) naver_parser = NaverParser() kipris_api = Kipris_API(apikey='X9Tz3JqC/JcCwxnNewA6qdloIN6QFIitVBgS1a2KVDYk1AmddaDTvzr6+t3dyLZV3gh2TPXdNhxsRQwaKP673Q==') gpt_client = GPTClient(api_key="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") # TitleGenerator 객체 생성 title_generator = TitleGenerator(forbidden_manager, naver_parser, kipris_api, gpt_client) # 상품명 생성 product_title = title_generator.generate_product_title("10升15升压力桶W-77加长杆喷枪水包水砂多彩油漆乳胶漆涂料喷漆枪", "페인트후끼") print("생성된 상품명:", product_title) # DB 연결 종료 db_manager.close_connection()