From 568400aa323bc9edd378a5d30528688bcae43aed Mon Sep 17 00:00:00 2001 From: jinye_huang Date: Sun, 27 Apr 2025 10:38:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=A8=A1=E7=B3=8A=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poster_gen_config.json | 8 +- .../content_generator.cpython-312.pyc | Bin 23146 -> 20226 bytes .../tweet_generator.cpython-312.pyc | Bin 29976 -> 34372 bytes utils/tweet_generator.py | 118 +++++++++++++++++- 4 files changed, 116 insertions(+), 10 deletions(-) diff --git a/poster_gen_config.json b/poster_gen_config.json index ff564f6..fcf4f03 100644 --- a/poster_gen_config.json +++ b/poster_gen_config.json @@ -1,7 +1,7 @@ { "date": "4月29日,4月30日, 4月28日, 5月1日", - "num": 10, - "variants": 5, + "num": 5, + "variants": 1, "topic_temperature": 0.2, "topic_top_p": 0.3, "topic_presence_penalty": 1.5, @@ -42,13 +42,13 @@ { "type": "Object", "file_path": [ - "./resource/Object/笔架山居森林度假酒店.txt" + "./resource/Object/美的鹭湖鹭栖台酒店.txt" ] }, { "type": "Description", "file_path": [ - "./resource/Object/笔架山居森林度假酒店.txt" + "./resource/Object/美的鹭湖鹭栖台酒店.txt" ] }, { diff --git a/utils/__pycache__/content_generator.cpython-312.pyc b/utils/__pycache__/content_generator.cpython-312.pyc index bab567e22cfea5e3218479e47a1c6f705141802c..380394277c2b030699b81367b1d8bd4210bed718 100644 GIT binary patch delta 1110 zcmb7?Ye zAJ)In>9mNpo5yt<_ch$o?{MLVaKKfME%3%wkR2vr(!zyRz2q8ZGK4TXY=a_qekOlC z?HV^eSBD(xj$%0KmZ8mEN`By6c7z2jQZH%2aqVCCtFtrD zaH)sI)zSaW#t5Ay^Z&>OXTgUOCpPqFmwGYY3bkd6IAsgmDht^&75W?K71`3Z?UfLT zDjTAkHa9EmLM222rR6{I74Z5hGy<|Y_Sd{KTi}@QZie%|>oK`M?RopKb?Hk>2pZ;H z*yZ;I%Fw_JbHGUw>M1l%IQf8Aop7sJT&4*+$Wv8Cda!^DN#-gSKQv9lVi#Xkt{L(c z(fFASQ_-^mp0a7e*yJZN<5{BL(kQx73{$&t#~>YOb0^wIxKsH60>SMtxtv-OoaxZe z<=tq^h$Q2FQ8Cd`6Prpk7AMcV+~2jh7^}2#F$R9E43Da1!bc6Dt9D4nl$v_DH=dpp zaIKS)9&fGAg0&@9I9pw5wWf42E>)!q(P|4qaeYh&V;*B}OdrENq7sS=R65Z=~x3xy-LymPLem2hO4-BCz)?Wy1b92(%uDHEKgQX&b_Us@@WK_1h= zpvY6g)OsiI%Qs;av@O4Y1<0y@h|^)X{tK4i@rtWrFU#Z%LmzZBEV1un;b8_~IKj}( zaEjqHylH69Zo<5IY!N|=aV;KMyZ#&T@%djnp`|g`v6HE0Ge`_w4CA#K*&b0?+R6fk dPPo}vj4#1xV-CIwKN{C%1O+_nD`HHV{2R8%67T>3 delta 3752 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 delta 3097 zcmah~TTENY8J;=E2W)P}fG=Q-4+di!+ki3mWFZieY)T->hLB<)gk=md@r4|lO<~7N z(x7Trq6(|&Lsv;u?ORlM>H4Mn(5=#J+o)Bwu9|KUn@xf?Qk!1=ke5{}wf{N9z($dZ z`DecQ=b!)kFLTcMbd~$zUvbfI3k&lQ{Mn-g7e8HjzsQ6)-ggWy^I=USFOY{3K|~eK zj}!z76fA@bBSnEC1?Pmdk>Y?(!MWj*NNJ!(+N^~nYP^m$rjg$bg0BR?tfT~DYu!!h`R$>4# zf|!CLDG!P>1*Bp{6{sd1#0+*eQW?xsY%ReWQU!KauoHtOQVp{$SW9X^YJ;^iWyHQR zrV7}JY*+_|FB>~R=LB)VfqD=(hzG9l61s}#<)|E4eJ*jtdKH_mp>OkHd9v?|PEj-5IK+03B!#K#gb@y;9Ku-AAXtHCJI zn6;ZbDigAeAx%!wNu6`Y89rvNaU_gc1L}AMr9N?z-5u5&cS*8ciDD`wU2-rzuTd9J zckizXbh|#0yX)DN4X7WjaT798x@~Zwpy_rBn5Ae>@;w z4f;RPHdFVj3Udiw6H+a8PSk=jXX%%pgZ=x7GucYa4YTbLv;N4sYDY5;ktG|GO|&s?mT!sw zs8WYx`)j#|S9572vCFY1J+w&@Xw%Lris9+<$@TNSPJJ(Np38EQ<1g>Q?HiS|bIG^Q zK)yviWPqHYz7XCRTz}CuxH@B54|4&g^Hk)~Jf)CtLb~wq8i&Zq>}4RfSwv3V;*-rg zdydn4k8jdX{Zbe8!(-eG3ADWIwuI)(ZsBP&(`NF9(xIOW=q)Ye3>hY8Z|!@VthT67 zl!KelEa$8rq0QgSnOf#17`ytsgd?vwwD-XD`4EIz_+QF7L#V`Bcr!C zxd!ZSM_j&u(u>+}^nzP`9o`M~XHX6DLCjY;j7AZL-_|-Ki zhxr}z6?_GKhaW{(uxldqhjEXld#UH#loSm`XS>9~7zxcRipL{Uv+#imNx|tvOj;D9 zv4l7iTZj@dCMk=ly-oJ@Md$LCDzP{p+{*6{#;2vwd?FN!ZfRyh;o#)_RN~@N!%^k% z6gXIj1CdDf>_pj2oRMM?aXJ>A2|*OYOP#wB?en-}8J`bMhh{=SB8H+bPKe990d|Q? z9lK|TVq#<}F@5pXj7mr|kWlQ+ImlCVEHyax`ILh3*n%`2oP;unPC32T9Q%TCxEfqo z`X01oY3N+)%%w#hf06oKv=rmU)OO5>ndS0lxHa{U%T<^qU%12dJZK$xsMg-lzNbxBjHUzO^k^i5 z;Jb60gQ@%t?m0r5Gu)=OER%x_rmI7nm10^|zG^hqsxs*N|PTM07 zOwmnG)9+2LrzY!#~G_0wsxn4VrrJKug_qHO+cLtP~*u*j4J?-ittC)20K?k9n2 z0uRWHh7$_oAeZ`({*31aa@d8dAFKZTJdD}NYZsUALPo!+^GNtA*)LzCJfhTb903 zm>#wY<2{;(U25?5CFePB6~6ST<+0OzzCw6ZApm}4JEED);~%;8lLG%(5CA_e)Jz`a z9~&ws+xf@sf{c4K7Y^`G)UFF{{F638#@(8!9$`DzJJls@cL`HH?EZJX<n6i9d6S1>i;pkHrT@swgNXHBA2I(^)~cpsQczOMYA70#H1dGh zN7oNk{axM{X2P+lg!GB5{#sEa7Usi2sfrb^Sn@o;3jZk1vGx^vYH}qPFTcZM@lHzy z$@8Ymli_9X#O}-pGJxj08#1{HRHKFi8I1z-kkg&XS6~5Z>&z4?un0ByGFk-|qt>pB zPJt!J-;pU*U>WkYW%LR(pr+Q0@g05=I84ajo+($<6{xvAV^&}#YVF8a6j+5?+A~%K fiZWfb0&U3Kl&Mi*tqko7tV53a=MEW47D)AfyXF$x diff --git a/utils/tweet_generator.py b/utils/tweet_generator.py index 4471985..4c0692b 100644 --- a/utils/tweet_generator.py +++ b/utils/tweet_generator.py @@ -10,6 +10,7 @@ from datetime import datetime import sys import traceback import logging # Add logging +import re # sys.path.append('/root/autodl-tmp') # No longer needed if running as a module or if path is set correctly # 从本地模块导入 # from TravelContentCreator.core.ai_agent import AI_Agent # Remove project name prefix @@ -548,13 +549,88 @@ def generate_posters_for_topic(topic_item: dict, # Construct and check INPUT image paths input_img_dir_path = os.path.join(image_base_dir, object_name) if not os.path.exists(input_img_dir_path) or not os.path.isdir(input_img_dir_path): - logging.warning(f"Warning: Modify Image directory not found or not a directory: '{input_img_dir_path}'. Skipping posters for this topic.") - return False + # 模糊匹配:如果找不到完全匹配的目录,尝试查找包含关键词的目录 + logging.info(f"尝试对图片目录进行模糊匹配: {object_name}") + found_dir = None + + # 1. 尝试获取image_base_dir下的所有目录 + try: + all_dirs = [d for d in os.listdir(image_base_dir) + if os.path.isdir(os.path.join(image_base_dir, d))] + logging.info(f"找到 {len(all_dirs)} 个图片目录可用于模糊匹配") + + # 2. 提取对象名称中的关键词 + # 例如:"美的鹭湖鹭栖台酒店+盈香心动乐园" -> ["美的", "鹭湖", "酒店", "乐园"] + # 首先通过常见分隔符分割(+、空格、_、-等) + parts = re.split(r'[+\s_\-]', object_name) + keywords = [] + for part in parts: + # 只保留长度大于1的有意义关键词 + if len(part) > 1: + keywords.append(part) + + # 尝试匹配更短的语义单元(例如中文的2-3个字的词语) + # 对于中文名称,可以尝试提取2-3个字的短语 + for i in range(len(object_name) - 1): + keyword = object_name[i:i+2] # 提取2个字符 + if len(keyword) == 2 and all('\u4e00' <= c <= '\u9fff' for c in keyword): + keywords.append(keyword) + + # 3. 对每个目录进行评分 + dir_scores = {} + for directory in all_dirs: + score = 0 + dir_lower = directory.lower() + # 为每个匹配的关键词增加分数 + for keyword in keywords: + if keyword.lower() in dir_lower: + score += 1 + + # 如果得分大于0(至少匹配一个关键词),记录该目录 + if score > 0: + dir_scores[directory] = score + + # 4. 选择得分最高的目录 + if dir_scores: + best_match = max(dir_scores.items(), key=lambda x: x[1]) + found_dir = best_match[0] + logging.info(f"模糊匹配成功!匹配目录: {found_dir},匹配分数: {best_match[1]}") + + # 更新图片目录路径 + input_img_dir_path = os.path.join(image_base_dir, found_dir) + logging.info(f"使用模糊匹配的图片目录: {input_img_dir_path}") + else: + logging.warning(f"模糊匹配未找到任何包含关键词的目录") + except Exception as e: + logging.warning(f"模糊匹配过程中出错: {e}") + + # 如果仍然无法找到有效目录,则返回错误 + if not found_dir or not os.path.exists(input_img_dir_path) or not os.path.isdir(input_img_dir_path): + logging.warning(f"Warning: 即使通过模糊匹配也无法找到图片目录: '{input_img_dir_path}'. Skipping posters for this topic.") + return False # Locate Description File using resource_dir_config parameter info_directory = [] description_file_path = None found_description = False + + # 准备关键词列表用于模糊匹配 + # 与上面图片目录匹配类似,提取对象名称的关键词 + parts = re.split(r'[+\s_\-]', object_name) + keywords = [] + for part in parts: + if len(part) > 1: + keywords.append(part) + + # 尝试提取中文短语作为关键词 + for i in range(len(object_name) - 1): + keyword = object_name[i:i+2] + if len(keyword) == 2 and all('\u4e00' <= c <= '\u9fff' for c in keyword): + keywords.append(keyword) + + logging.info(f"用于描述文件模糊匹配的关键词: {keywords}") + + # 尝试精确匹配 for dir_info in resource_dir_config: if dir_info.get("type") == "Description": for file_path in dir_info.get("file_path", []): @@ -562,15 +638,45 @@ def generate_posters_for_topic(topic_item: dict, description_file_path = file_path if os.path.exists(description_file_path): info_directory = [description_file_path] - logging.info(f"Found and using description file from config: {description_file_path}") + logging.info(f"找到并使用精确匹配的描述文件: {description_file_path}") found_description = True else: - logging.warning(f"Warning: Description file specified in config not found: {description_file_path}") + logging.warning(f"Warning: 配置中指定的描述文件未找到: {description_file_path}") break if found_description: - break + break + + # 如果精确匹配失败,尝试模糊匹配 if not found_description: - logging.info(f"Warning: No matching description file found for object '{object_name}' in config resource_dir (type='Description').") + logging.info(f"未找到'{object_name}'的精确匹配描述文件,尝试模糊匹配...") + best_score = 0 + best_file = None + + for dir_info in resource_dir_config: + if dir_info.get("type") == "Description": + for file_path in dir_info.get("file_path", []): + file_name = os.path.basename(file_path) + score = 0 + + # 计算关键词匹配分数 + for keyword in keywords: + if keyword.lower() in file_name.lower(): + score += 1 + + # 如果当前文件得分更高,更新最佳匹配 + if score > best_score and os.path.exists(file_path): + best_score = score + best_file = file_path + + # 如果找到了最佳匹配文件 + if best_file: + description_file_path = best_file + info_directory = [description_file_path] + logging.info(f"模糊匹配找到描述文件: {description_file_path},匹配分数: {best_score}") + found_description = True + + if not found_description: + logging.warning(f"未找到对象'{object_name}'的匹配描述文件。") # Generate Text Configurations for All Variants try: