0

0

基于家庭成员参会相似性动态生成个性化邀请文案

心靈之曲

心靈之曲

发布时间:2026-02-19 15:18:18

|

334人浏览过

|

来源于php中文网

原创

基于家庭成员参会相似性动态生成个性化邀请文案

本文介绍如何利用 pandas 和 jinja2,根据每个家庭内部成员在各场会议中的出席模式(即行间相似性),自动构建结构清晰、语法自然的英文邀请语句,并支持按家庭分组聚合与事件归并。

本文介绍如何利用 pandas 和 jinja2,根据每个家庭内部成员在各场会议中的出席模式(即行间相似性),自动构建结构清晰、语法自然的英文邀请语句,并支持按家庭分组聚合与事件归并。

在数据分析与自动化邮件/通知生成场景中,常需基于结构化数据(如家庭成员参会记录)生成符合自然语言习惯的个性化文本。本教程以“为每个家庭负责人生成定制化邀请文案”为任务目标,核心挑战在于:识别同一家庭内不同成员在各场会议中的出席一致性(即行间相似性),并据此分组归纳事件与参与者

我们采用以下技术路径实现:

Ink For All
Ink For All

AI写作和营销助手,精心设计的 UI

下载
  • 使用 groupby("family") 按家庭切分数据;
  • 对每组提取会议列(meeting1, meeting2, ...),通过布尔矩阵运算识别“出席组合相同”的事件;
  • 利用 @ 矩阵乘法将参会模式映射为成员列表字符串,再按模式聚类;
  • 借助 Jinja2 模板引擎渲染语法严谨的英文句子,自动处理逗号分隔与 “and” 连接(如 "abba, ben and berry");
  • 最终可选择性地将结果注入原 DataFrame 的指定行(仅家庭负责人)或广播至全家族行。

✅ 示例代码(完整可运行)

import pandas as pd
from jinja2 import Template

# 构造示例数据
df = pd.DataFrame({
    "family": [1, 1, 1, 2, 2, 3, 3],
    "fam_head": [True, None, None, None, True, None, True],
    "name": ["abba", "ben", "berry", "jack", "joe", "razia", "riri"],
    "meeting1": [1, 1, None, 1, 1, 1, None],
    "meeting2": [1, 1, None, None, None, None, 1],
    "meeting3": [1, 1, None, None, None, None, None],
    "meeting4": [1, 1, 1, 1, 1, 1, None],
}).convert_dtypes()

# 定义 Jinja2 模板(支持自然语言逻辑)
TPL = Template("""
Hi {{ head }}, delighted for {{ others }} to come.

{% for meetings, attendees in events.items() -%}
{% if not same_meeting -%}
{{ attendees }}: {{ meetings }}
{% endif -%}
{% endfor -%}
""".strip())

# 辅助函数:将列表转为 "A, B and C" 格式
import re
def comma_nd(inp):
    if isinstance(inp, str):
        return inp
    s = ", ".join(list(inp))
    return re.sub(r",(?!.*,)", " and", s)

# 主处理函数
MCOLS = df.filter(like="meeting").columns

def greet(g):
    # 提取家庭负责人姓名
    head_idx = g["fam_head"].idxmax()
    head = g.at[head_idx, "name"]

    # 构建 "others":除负责人外的成员,"you" 替换负责人名
    others_list = g.sort_values("fam_head")["name"].replace(head, "you").tolist()

    # 判断是否所有成员参会完全一致
    same_meeting = g.duplicated(MCOLS, keep=False).all()

    # 关键步骤:按参会模式分组事件
    tmp = g.set_index("name")[MCOLS].T.dropna(how="all")
    if tmp.empty:
        events = {}
    else:
        # 转布尔 + 矩阵乘法 → 每行(会议)对应出席者字符串
        bool_mat = tmp.fillna(0).astype(bool)
        attendee_strs = (bool_mat @ (tmp.columns + ", ")).str.strip(", ")

        # 按出席者组合(字符串)分组,合并会议名
        events = (attendee_strs.reset_index(name="attendees")
                  .groupby("attendees")["index"]
                  .agg(comma_nd)
                  .to_dict())

    return TPL.render(
        head=head,
        others=comma_nd(others_list),
        same_meeting=same_meeting,
        events=events
    ).strip()

# 应用分组处理
greetings = df.groupby("family", group_keys=False).apply(greet)

# 注入原 DataFrame(方式一:仅填入家庭负责人行)
df["greet_card"] = None
df.loc[df["fam_head"], "greet_card"] = greetings.to_numpy()

# 查看结果
print(df[["family", "fam_head", "name", "greet_card"]])

⚠️ 注意事项与最佳实践

  • 会议列识别:使用 df.filter(like="meeting") 是健壮做法;若列名不规则,建议显式传入 MCOLS = ["meeting1", "meeting2", ...]。
  • 空值处理:dropna(how="all") 排除全空会议行;fillna(0).astype(bool) 将非空值统一视为 True(出席),确保逻辑一致。
  • 自然语言边界:正则 r",(?!.*,)" 精准替换最后一个逗号为 " and",避免 "A, B, C and D" 错误为 "A and B and C and D"。
  • 性能提示:对超大家庭(>100人)或大量会议(>50列),矩阵乘法可能变慢,可改用 apply + frozenset 哈希替代。
  • 扩展性:模板支持添加日期、签名、链接等字段;只需在 TPL.render() 中传入额外变量即可。

该方案不仅解决了原始问题中“按相似性分组事件”的核心需求,更提供了一套可复用的文本生成范式——将结构化数据的语义关系,精准映射为人类可读的自然语言输出。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

75

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

4

2026.01.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

573

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

945

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

896

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号