This commit is contained in:
SengokuCola
2025-04-30 18:49:49 +08:00
parent 0f1198e64e
commit bbbbe41476
2 changed files with 17 additions and 15 deletions

View File

@@ -269,7 +269,7 @@ class EmojiManager:
"""
try:
self._ensure_db()
time_start = time.time()
_time_start = time.time()
# 获取所有表情包
all_emojis = self.emoji_objects
@@ -287,38 +287,40 @@ class EmojiManager:
# 计算与每个emotion标签的相似度取最大值
max_similarity = 0
best_matching_emotion = "" # 记录最匹配的 emotion 喵~
best_matching_emotion = "" # 记录最匹配的 emotion 喵~
for emotion in emotions:
# 使用编辑距离计算相似度
distance = self._levenshtein_distance(text_emotion, emotion)
max_len = max(len(text_emotion), len(emotion))
similarity = 1 - (distance / max_len if max_len > 0 else 0)
if similarity > max_similarity: # 如果找到更相似的喵~
if similarity > max_similarity: # 如果找到更相似的喵~
max_similarity = similarity
best_matching_emotion = emotion # 就记下这个 emotion 喵~
best_matching_emotion = emotion # 就记下这个 emotion 喵~
if best_matching_emotion: # 确保有匹配的情感才添加喵~
emoji_similarities.append((emoji, max_similarity, best_matching_emotion)) # 把 emotion 也存起来喵~
if best_matching_emotion: # 确保有匹配的情感才添加喵~
emoji_similarities.append((emoji, max_similarity, best_matching_emotion)) # 把 emotion 也存起来喵~
# 按相似度降序排序
emoji_similarities.sort(key=lambda x: x[1], reverse=True)
# 获取前10个最相似的表情包
top_emojis = emoji_similarities[:10] if len(emoji_similarities) > 10 else emoji_similarities # 改个名字,更清晰喵~
top_emojis = (
emoji_similarities[:10] if len(emoji_similarities) > 10 else emoji_similarities
) # 改个名字,更清晰喵~
if not top_emojis:
logger.warning("未找到匹配的表情包")
return None
# 从前几个中随机选择一个
selected_emoji, similarity, matched_emotion = random.choice(top_emojis) # 把匹配的 emotion 也拿出来喵~
selected_emoji, similarity, matched_emotion = random.choice(top_emojis) # 把匹配的 emotion 也拿出来喵~
# 更新使用次数
self.record_usage(selected_emoji.hash)
time_end = time.time()
_time_end = time.time()
logger.info( # 使用匹配到的 emotion 记录日志喵~
logger.info( # 使用匹配到的 emotion 记录日志喵~
f"为[{text_emotion}]找到表情包: {matched_emotion},({similarity:.4f})"
)
return selected_emoji.path, f"[ {selected_emoji.description} ]"

View File

@@ -38,10 +38,10 @@ def safe_json_loads(json_str: str, default_value: T = None) -> Union[Any, T]:
result = ast.literal_eval(json_str)
# 确保结果是字典(因为我们通常期望参数是字典)
if isinstance(result, dict):
return result
return result
else:
logger.warning(f"ast.literal_eval 解析成功但结果不是字典: {type(result)}, 内容: {result}")
return default_value
logger.warning(f"ast.literal_eval 解析成功但结果不是字典: {type(result)}, 内容: {result}")
return default_value
except (ValueError, SyntaxError, MemoryError, RecursionError) as ast_e:
logger.error(f"使用 ast.literal_eval 解析失败: {ast_e}, 字符串: {json_str[:100]}...")
return default_value
@@ -203,8 +203,8 @@ def process_llm_tool_calls(
# 1. 检查 arguments 是否存在且是字符串
if args_value is None or not isinstance(args_value, str):
logger.warning(f"{log_prefix}工具调用[{i}]的'function'字段缺少'arguments'字符串: {func_details}")
continue
logger.warning(f"{log_prefix}工具调用[{i}]的'function'字段缺少'arguments'字符串: {func_details}")
continue
# 2. 尝试安全地解析 arguments 字符串
parsed_args = safe_json_loads(args_value, None)