用Python打造智能姓名生成器:从数据分离到AI赋能
目录
- 项目概述与功能清单
- 环境准备与工具选择
- 项目架构设计
- 核心代码实现
- AI古文解析模块
- 交互界面开发
- 使用示例与效果展示
- 扩展思路与优化建议
1. 项目概述与功能清单
核心功能
- 数据管理
- CSV文件存储姓氏/名字库
- 支持用户导入/导出数据
- 交互界面
- 姓名生成与实时预览
- 已选名单管理(增删改查)
- 排除词输入框(黑名单过滤)
- AI赋能
- 从古文中提取字词及注解
- 自动生成姓名寓意解析
- 扩展功能
- 五行/笔画筛选
- 生成结果导出为PDF/Excel
2. 环境准备与工具选择
必要工具包
# 基础库
pip install pandas # 数据管理
pip install numpy # 数据处理
# 图形界面
pip install customtkinter # 现代化UI库(或使用标准tkinter)
# AI相关
pip install transformers # Hugging Face模型库
pip install jieba # 中文分词
pip install requests # 网络请求
pip install bs4 # 网页解析(用于古文爬取)
# 文件处理
pip install python-docx # Word导出
pip install reportlab # PDF导出
推荐开发工具
- IDE: VSCode / PyCharm
- 版本控制: Git + GitHub
- 文档: Markdown + Typora
3. 项目架构设计
name-generator/
├── data/ # 数据存储
│ ├── surnames.csv # 姓氏库
│ ├── male_names.csv # 男性名字库
│ ├── female_names.csv # 女性名字库
│ └── ancient_texts/ # 古文原文存储
│
├── core/ # 核心逻辑
│ ├── generator.py # 姓名生成算法
│ ├── ai_parser.py # AI古文解析
│ └── utils.py # 工具函数
│
├── gui/ # 界面模块
│ ├── main_window.py # 主窗口
│ └── components/ # 可复用UI组件
│
├── outputs/ # 生成结果
│ ├── pdf/ # PDF导出
│ └── excel/ # Excel导出
│
└── config.json # 配置文件(如模型路径)
4. 核心代码实现
数据层(data_loader.py)
import pandas as pd
from pathlib import Path
class DataLoader:
def __init__(self, data_dir="data"):
self.data_dir = Path(data_dir)
def load_surnames(self):
return pd.read_csv(self.data_dir / "surnames.csv")["surname"].tolist()
def load_names(self, gender):
filename = f"{gender}_names.csv"
return pd.read_csv(self.data_dir / filename)["name"].tolist()
def save_custom_data(self, data, filename):
df = pd.DataFrame(data, columns=["item"])
df.to_csv(self.data_dir / filename, index=False)
生成逻辑(generator.py)
import random
from typing import List
class NameGenerator:
def __init__(self, surnames: List[str], names: List[str]):
self.surnames = surnames
self.names = names
self.blacklist = set() # 排除词列表
def set_blacklist(self, blacklist: List[str]):
self.blacklist = set(blacklist)
def generate(self, gender=None, num=5):
filtered_names = [n for n in self.names if n not in self.blacklist]
return [
random.choice(self.surnames) + random.choice(filtered_names)
for _ in range(num)
]
5. AI古文解析模块
核心功能实现(ai_parser.py)
from transformers import pipeline
import jieba
import requests
from bs4 import BeautifulSoup
class AncientTextAnalyzer:
def __init__(self):
self.model = pipeline("text2text-generation", model="uer/gpt2-chinese-lyric")
self.keywords = set()
def extract_keywords(self, text):
# 使用jieba提取高频词
words = jieba.lcut(text)
self.keywords = {w for w in words if len(w) == 1} # 提取单字
return self.keywords
def get_meaning(self, character):
# 调用汉字API获取释义(示例)
url = f"https://hanziyuan.net/api/character/{character}"
try:
res = requests.get(url).json()
return res.get("meaning", "暂无注解")
except:
return "网络请求失败"
def generate_name_meaning(self, name):
# 生成寓意文案
prompt = f"请用古文风格解释名字'{name}'的寓意:"
return self.model(prompt, max_length=50)[0]['generated_text']
def feed_text(self, text):
# 投喂古文并解析
self.extract_keywords(text)
return {
"characters": list(self.keywords),
"meanings": {c: self.get_meaning(c) for c in self.keywords}
}
古文数据采集示例
def crawl_gutenberg_poetry():
"""从古诗文网抓取数据"""
url = "https://www.gushiwen.org/"
html = requests.get(url).text
soup = BeautifulSoup(html, "html.parser")
poems = [div.text for div in soup.select(".contson")]
return "\n".join(poems)
6. 交互界面开发
主窗口设计(main_window.py)
import customtkinter as ctk
from tkinter import messagebox
class MainWindow(ctk.CTk):
def __init__(self):
super().__init__()
self.title("AI智能起名系统")
self.geometry("800x600")
# 左侧配置面板
self.setup_left_panel()
# 右侧展示面板
self.setup_right_panel()
def setup_left_panel(self):
frame = ctk.CTkFrame(self, width=250)
frame.pack(side="left", fill="y")
# 排除词输入
self.blacklist_entry = ctk.CTkEntry(frame, placeholder_text="输入要排除的字(逗号分隔)")
self.blacklist_entry.pack(pady=10)
# AI古文输入
self.ai_text = ctk.CTkTextbox(frame, height=150)
self.ai_text.pack(pady=10)
ctk.CTkButton(frame, text="解析古文", command=self.parse_text).pack()
def setup_right_panel(self):
# 姓名展示列表
self.name_list = ctk.CTkScrollableFrame(self)
self.name_list.pack(side="right", fill="both", expand=True)
# 操作按钮
self.export_btn = ctk.CTkButton(self, text="导出结果", command=self.export)
self.export_btn.pack(side="bottom")
def parse_text(self):
text = self.ai_text.get("1.0", "end")
analyzer = AncientTextAnalyzer()
result = analyzer.feed_text(text)
messagebox.showinfo("解析完成", f"提取到{len(result['characters']}个可用字")
def export(self):
# 实现导出逻辑
pass
已选名单管理组件
class SelectedNamesPanel(ctk.CTkFrame):
def __init__(self, parent):
super().__init__(parent)
self.names = []
self.listbox = ctk.CTkListbox(self)
self.listbox.pack(fill="both", expand=True)
# 操作按钮
btn_frame = ctk.CTkFrame(self)
ctk.CTkButton(btn_frame, text="删除", command=self.delete).pack(side="left")
ctk.CTkButton(btn_frame, text="清空", command=self.clear).pack(side="left")
btn_frame.pack()
def delete(self):
selected = self.listbox.curselection()
if selected:
del self.names[selected[0]]
self.update_list()
def update_list(self):
self.listbox.delete(0, "end")
for name in self.names:
self.listbox.insert("end", name)
7. 使用示例与效果展示
操作流程演示
# 启动应用
if __name__ == "__main__":
app = MainWindow()
app.mainloop()
输入排除字
在左侧面板输入伟,强,芳
,系统将自动过滤包含这些字的候选名。投喂古文
粘贴《诗经》片段至古文输入框,点击解析后AI提取出清、昭、穆、雅
等字。生成姓名
点击生成按钮,右侧展示候选名单:林清晏 周昭然 陆穆宁 沈雅舟
查看寓意
双击名字弹出解析窗口:林清晏
清者明澈如水,晏者安然若山,此名寄寓心境澄明、生活安宁之愿。导出结果
支持导出为结构化Excel文件,包含姓名、五行属性和寓意注解。
8. 扩展思路与优化建议
功能扩展
- 五行筛选器
添加下拉菜单选择金木水火土属性,结合笔画数逻辑过滤结果 - API扩展
接入公安部姓名查重API,避免高频重名 - 多语言支持
使用googletrans
库实现中英双语注解生成
性能优化
# 添加缓存提升AI响应速度
from functools import lru_cache
@lru_cache(maxsize=1000)
def get_meaning_cached(char):
return self.get_meaning(char)
用户体验增强
- 实时预览
输入排除字时动态刷新候选列表 - 历史记录
使用sqlite3
保存用户操作记录 - 音律检查
调用pypinyin
检测姓名读音平仄搭配
结语
通过本项目的实践,可掌握:
- 现代化Python GUI开发技巧
- 基于Transformer模型的NLP应用方法
- 生产级应用的数据架构设计
出于创作的需要,开始开发本项目,目前仍在改进中,内容难免有疏漏,欢迎在评论区留言指导交流😊