用 Python 统计"回传次数"反映保守程度
这是一个很有意思的分析思路。"回传次数"通常指在对话/交互中,把问题抛回给对方、请求确认、或反复确认信息的次数,次数越多,说明越谨慎、越保守(不敢直接下结论)。

下面给你一个完整的 Python 案例,覆盖数据建模 → 统计 → 量化保守度的流程。
场景定义
假设我们有一批客服/助手与用户的对话记录,定义:
-
回传(back-pass):把决策权/信息再抛回给对方的行为,典型关键词:
- "请您确认"
- "您是指……吗"
- "要不要再核实一下"
- "为了避免出错"
- "您看这样是否可以"
-
保守程度 ≈ 单位对话内回传次数(密度),可归一化到 0~1。
构造示例数据
import pandas as pd
import re
# 每条记录:一次会话的文本
data = [
{"session_id": 1, "text": "好的,已为您办理,请问还有其他需要吗?"},
{"session_id": 2, "text": "您是指3月5日的订单吗?请您确认一下金额,我再帮您处理,为避免出错。"},
{"session_id": 3, "text": "请您确认收货地址,我再核实一下,您看这样是否可以?需要再确认收件人吗?"},
{"session_id": 4, "text": "已修改完成。"},
{"session_id": 5, "text": "请问您确认要取消吗?为避免误操作,请您再确认一次,您看可以吗?"},
]
df = pd.DataFrame(data)
识别回传信号
# 回传语气/关键词库(可扩充)
BACKPASS_PATTERNS = [
r"请您确认", r"请确认", r"确认一下", r"再确认",
r"您是指", r"是不是", r"是否",
r"为避免", r"避免出错", r"误操作",
r"您看.*(可以|行|是否)",
r"要不要", r"需要.*吗",
r"核实",
]
def count_backpass(text: str) -> int:
"""统计一条文本中出现的回传信号次数"""
cnt = 0
for p in BACKPASS_PATTERNS:
cnt += len(re.findall(p, text))
return cnt
df["backpass_count"] = df["text"].apply(count_backpass)
df["text_len"] = df["text"].str.len()
print(df[["session_id", "backpass_count", "text_len"]])
量化"保守程度"
保守程度不只看绝对次数,还要看相对于文本长度的密度,否则话多也会显得保守。
# 1) 回传密度:每 100 字回传次数
df["backpass_density"] = df["backpass_count"] / df["text_len"] * 100
# 2) 归一化到 0~1(min-max)
def normalize(s):
if s.max() == s.min():
return s * 0
return (s - s.min()) / (s.max() - s.min())
df["conservatism"] = normalize(df["backpass_density"])
print(df[["session_id", "backpass_count",
"backpass_density", "conservatism"]].round(3))
输出大致:
| session_id | backpass_count | backpass_density | conservatism |
|---|---|---|---|
| 1 | 0 | 00 | 00 |
| 2 | 3 | 14 | 75 |
| 3 | 4 | 81 | 00 |
| 4 | 0 | 00 | 00 |
| 5 | 4 | 53 | 97 |
分组/多维分析(进阶)
如果是多轮对话,可以按说话人、时间、主题分组,看保守程度差异:
# 示例:假设有说话人标签
df["speaker"] = ["A", "B", "B", "A", "B"]
summary = df.groupby("speaker").agg(
平均回传次数=("backpass_count", "mean"),
平均保守度=("conservatism", "mean"),
会话数=("session_id", "count"),
).round(2)
print(summary)
还能画出时间趋势:
import matplotlib.pyplot as plt
plt.plot(df["session_id"], df["conservatism"], marker="o")
plt.xlabel("会话序号"); plt.ylabel("保守度")"回传次数反映的保守程度变化")
plt.ylim(0, 1.1)
plt.grid(alpha=0.3)
plt.show()
关键结论 & 注意事项
- 用密度而非绝对值:否则长文本天然吃亏。
- 关键词库要按领域定制:客服、医疗、金融的"保守信号"不同。
- 可加权:
"为避免误操作"比"是不是"更能说明保守,可给不同权重。 - 可结合语义模型:关键词法简单但漏召,进阶可用 BERT/LLM 判断"是否在回避决策"。
- 保守 ≠ 差:在高风险场景(金融、医疗)保守是优点,需结合业务解读。
一句话总结:保守程度 ≈ 回传信号密度 → 归一化,核心代码就三步:count_backpass → density → normalize。
如果你能告诉我数据的具体格式(对话日志?问卷?标注数据?)和"回传"的准确定义,我可以帮你把关键词库和算法改得更贴合你的场景。