matching.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # matching.py
  2. import datetime
  3. import re
  4. class TitleMatcher:
  5. def __init__(self):
  6. # 完整的颜色映射表
  7. self.color_map = {
  8. # 红色系
  9. "红色": "红色", "红": "红色", "大红": "红色", "深红": "红色", "浅红": "浅红色",
  10. "粉红": "粉红色", "粉色": "粉红色", "粉": "粉红色", "玫红": "玫红色",
  11. # 橙色系
  12. "橙色": "橙色", "橙": "橙色", "橘色": "橙色", "橘黄": "橙黄色", "桔色": "橙色",
  13. # 黄色系
  14. "黄色": "黄色", "黄": "黄色", "金黄": "金黄色", "浅黄": "浅黄色", "深黄": "深黄色",
  15. "橘黄": "橙黄色",
  16. # 绿色系
  17. "绿色": "绿色", "绿": "绿色", "墨绿": "墨绿色", "深绿": "深绿色", "浅绿": "浅绿色",
  18. "翠绿": "翠绿色", "草绿": "草绿色", "青绿": "青绿色", "军绿": "军绿色",
  19. # 青色系
  20. "青色": "青色", "青": "青色", "蓝绿": "青绿色", "青蓝": "青蓝色", "淡青": "淡青色",
  21. # 蓝色系
  22. "蓝色": "蓝色", "蓝": "蓝色", "深蓝": "深蓝色", "浅蓝": "浅蓝色", "天蓝": "天蓝色",
  23. "宝蓝": "宝蓝色", "湖蓝": "湖蓝色", "藏青": "藏青色",
  24. # 紫色系
  25. "紫色": "紫色", "紫": "紫色", "深紫": "深紫色", "浅紫": "浅紫色", "紫罗": "紫罗兰",
  26. "紫红": "紫红色",
  27. # 黑白灰系
  28. "黑色": "黑色", "黑": "黑色", "白色": "白色", "白": "白色", "灰色": "灰色", "灰": "灰色",
  29. "深灰": "深灰色", "浅灰": "浅灰色", "银灰": "银灰色", "银": "银色",
  30. # 色系描述
  31. "浅色": "浅色", "深色": "深色", "彩色": "多彩", "暖色": "暖色", "冷色": "冷色",
  32. "单色": "单色", "多色": "多彩"
  33. }
  34. # 风格映射表
  35. self.style_map = {
  36. # 人群定位
  37. "年轻人": "青春", "青年": "青春", "学生": "青春", "00后": "青春", "90后": "青春",
  38. "老年": "稳重", "老人": "稳重", "中年": "成熟", "商务人士": "商务", "男性": "硬朗",
  39. "女性": "柔美", "儿童": "可爱", "小朋友": "可爱", "女孩": "柔美", "男孩": "活力",
  40. # 风格描述
  41. "简约": "简约", "简单": "简约", "简洁": "简约", "清爽": "简约", "干净": "简约",
  42. "现代": "现代", "现代化": "现代", "当代": "现代", "时尚": "时尚", "时髦": "时尚",
  43. "潮流": "时尚", "流行": "时尚", "商务": "商务", "商业": "商务", "正式": "商务",
  44. "专业": "专业", "活力": "活力", "活泼": "活力", "动感": "活力", "温馨": "温馨",
  45. "温暖": "温馨", "柔和": "温馨", "科技": "科技", "科技感": "科技", "未来": "科技",
  46. "自然": "自然", "清新": "自然", "环保": "自然", "极简": "极简", "经典": "经典",
  47. "传统": "经典", "复古": "复古", "欧式": "欧式", "中式": "中式", "日式": "日式",
  48. "卡通": "卡通", "可爱": "可爱", "甜美": "甜美", "酷炫": "酷炫", "奢华": "奢华"
  49. }
  50. # 类型映射表
  51. self.type_map = {
  52. "模板": "模板", "皮肤": "皮肤", "主题": "主题", "风格": "风格",
  53. "设计": "设计", "界面": "界面", "网站": "网站", "样式": "样式",
  54. "一套": "模板", "个": "模板", "款": "模板", "张": "模板"
  55. }
  56. # 情感词(用于优化标题)
  57. self.positive_words = ["好看", "漂亮", "美观", "美丽", "优雅", "舒服", "舒适",
  58. "喜欢", "不错", "好", "棒", "赞", "精美", "优质"]
  59. self.intensity_words = ["最好", "首选", "特别喜欢", "非常", "很", "特别", "超", "超级"]
  60. def generate_title(self, user_text):
  61. """生成标题的主方法"""
  62. print(f"📝 用户输入: {user_text}")
  63. # 1. 提取关键词信息
  64. extracted_info = self._extract_keywords(user_text)
  65. # 2. 生成标题
  66. title = self._compose_title(extracted_info)
  67. print(f"✅ 生成标题: {title}")
  68. return title
  69. def _extract_keywords(self, user_text):
  70. """提取关键词信息"""
  71. # 清理文本
  72. cleaned_text = self._clean_text(user_text)
  73. # 提取各类关键词
  74. found_color = self._extract_color(cleaned_text)
  75. found_style = self._extract_style(cleaned_text)
  76. found_type = self._extract_type(cleaned_text)
  77. has_positive = self._has_positive_words(cleaned_text)
  78. return {
  79. 'color': found_color,
  80. 'style': found_style,
  81. 'type': found_type,
  82. 'has_positive': has_positive,
  83. 'has_any_keyword': bool(found_color or found_style)
  84. }
  85. def _extract_color(self, text):
  86. """提取颜色关键词"""
  87. for color_keyword in self.color_map:
  88. if color_keyword in text:
  89. return self.color_map[color_keyword]
  90. return None
  91. def _extract_style(self, text):
  92. """提取风格关键词"""
  93. for style_keyword in self.style_map:
  94. if style_keyword in text:
  95. return self.style_map[style_keyword]
  96. return None
  97. def _extract_type(self, text):
  98. """提取类型关键词"""
  99. for type_keyword in self.type_map:
  100. if type_keyword in text:
  101. return self.type_map[type_keyword]
  102. return "模板" # 默认返回模板
  103. def _has_positive_words(self, text):
  104. """检查是否有积极词汇"""
  105. return any(word in text for word in self.positive_words)
  106. def _clean_text(self, text):
  107. """清理文本"""
  108. # 移除标点符号,用空格替换
  109. text = re.sub(r'[,。!?、;:"“”‘\'’()【】《》<>{}【】]', ' ', text)
  110. # 合并多个空格
  111. text = re.sub(r'\s+', ' ', text)
  112. return text.strip()
  113. def _compose_title(self, info):
  114. """组合生成标题"""
  115. # 如果没有任何关键词,返回日期标题
  116. if not info['has_any_keyword']:
  117. return self._generate_date_title()
  118. color = info['color']
  119. style = info['style']
  120. template_type = info['type']
  121. has_positive = info['has_positive']
  122. # 根据提取到的信息组合标题
  123. if color and style:
  124. base_title = f"{color}{style}{template_type}"
  125. elif color and not style:
  126. base_title = f"{color}主题{template_type}"
  127. elif style and not color:
  128. base_title = f"{style}风格{template_type}"
  129. else:
  130. base_title = f"精选{template_type}"
  131. # 添加修饰词(如果有积极词汇)
  132. if has_positive and len(base_title) < 10:
  133. base_title = f"优质{base_title}"
  134. # 确保长度合理
  135. if len(base_title) > 15:
  136. base_title = base_title[:13] + "..."
  137. return base_title
  138. def _generate_date_title(self):
  139. """生成带日期的默认标题"""
  140. current_date = datetime.datetime.now()
  141. # 格式:月日推荐模板,如:1224推荐模板
  142. date_str = current_date.strftime("%m月%d日")
  143. return f"{date_str}推荐模板"
  144. # 全局匹配器实例
  145. title_matcher = TitleMatcher()