news 2026/9/17 15:10:55

python-pptx解析烫发课件:构建可检索知识骨架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python-pptx解析烫发课件:构建可检索知识骨架

简介:这份烫发基本理论PPT学习课件面向美发专业学员与一线发型师,用于梳理烫发涉及的化学与物理原理,解决对还原剂、定型剂作用机制及不同发质处理缺乏系统认知的问题。压缩包内仅含1个pptx文件,大小约159KB,轻量便于在课堂讲授或自学时直接打开使用。课件围绕烫发水认识展开,分别讲解阿摩尼亚、乙硫醇酸等还原剂与溴化钠、过氧化氢等定型剂的成分分工,并对比冷烫与热烫的操作差异;同时覆盖陶瓷烫、数码烫等热塑烫特点,以及从色度判断抗拒性、正常、受损等发质类型,软化程度百分比、视觉触觉缠绕三种软化测试方法、软化时间控制与间歇性加热策略。目前已有84人学习该资源,适合希望把烫发流程从药水反应到发质评估串成完整知识链的入门与进阶读者。

1. 烫发基本理论这份学习课件解决的其实是「键怎么断、怎么接」

沙龙里最让人头疼的返工,往往不是卷杠卷歪了,而是软化没走到位、加热又过了头。这份《烫发基本理论》学习课件只有 17 页,却把这件事从第 3 页就说死了:物理缠绕负责制造形状,化学药剂负责切断头发内部的二硫化物键,再让单硫键在新位置上重新配对,课件给出的关键数字是约 45% 的二硫化物键被切断——不到一半,却决定了头发是永久变卷还是三天回直。

它真正适合三类人:带新人的发型师需要一套能复述的话术骨架,而不是凭手感;门店培训主管需要把「软化到差不多」这种口头经验换成可核对的百分比表格;做美业培训系统或知识库的工程师,需要把 PPT 拆成结构化字段喂给检索和问答。课件里塞进了还原剂与定型剂的成分分工、冷烫与热烫的反应差异、八档发质色度、八档软化区间、三种软化测试方法和一套间歇加热节奏,信息密度比页数看起来高得多。

2. 用 python-pptx 把 17 页课件拆成可检索的知识骨架

2.1 为什么课件要先结构化,再拿去讲课

PPT 是给人念的,不是给机器算的。同一页上「乙硫醇酸—切断头发中最坚实的二硫化物键」和「芳香剂—遮盖阿摩尼亚的臭味」是并列关系,但它们在业务流程里的权重完全不同:前者决定成败,后者只影响体验。逐页抽取文本并按主题打标签,做的是把线性幻灯片还原成「成分—反应—发质—参数」四类字段,这样后面无论是做检索、做问答卡片还是做门店 SOP,都不用再回去翻原文。

常见做法是先落到一个中间层 JSON,再往上长业务逻辑。中间层保持原样不动——页码、原始行、空行都不删,方便追溯;上层再按主题聚类。这样一旦发现某条参数理解错了,改的是映射规则,不用重新解析 PPT。

2.2 安装依赖与逐页抽取正文

pip install python-pptx
from pathlib import Path import json from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE SRC = Path("烫发基本理论PPT学习教案.pptx") prs = Presentation(SRC) def walk(shapes): """递归展开组合形状,否则被分组的文本框会整块漏掉""" for sh in shapes: if sh.shape_type == MSO_SHAPE_TYPE.GROUP: yield from walk(sh.shapes) else: yield sh def lines_of(slide): buf = [] for sh in walk(slide.shapes): if getattr(sh, "has_table", False): # 表格优先判断 for row in sh.table.rows: cells = [c.text.replace("\n", " ").strip() for c in row.cells] if any(cells): buf.append(" | ".join(cells)) elif sh.has_text_frame: for para in sh.text_frame.paragraphs: text = "".join(r.text for r in para.runs).strip() if text: buf.append(text) return buf pages = [{"page": i, "lines": lines_of(s)} for i, s in enumerate(prs.slides, 1)] Path("perming_pages.json").write_text( json.dumps(pages, ensure_ascii=False, indent=2), encoding="utf-8") print(f"slide={len(pages)} line={sum(len(p['lines']) for p in pages)}")

walk()处理的是组合形状,课件里「烫发水一剂」那一页的成分列表极可能被作者打包成一个组,不递归就会得到一片空白。判断顺序上必须把has_table放在has_text_frame前面,因为表格形状走text_frame拿不到单元格内容。ensure_ascii=False保证中文原样落盘,indent=2是为了让后续 diff 能看出改了什么。

2.3 按主题给页面打标签

import json, re from pathlib import Path from collections import defaultdict pages = json.loads(Path("perming_pages.json").read_text(encoding="utf-8")) TOPIC = { "还原剂": ["阿摩尼亚", "乙硫醇酸", "芳香剂", "缓冲剂", "湿润剂"], "定型剂": ["溴化钠", "溴酸钠", "过氧化氢"], "冷烫": ["冷烫", "水卷法", "药卷法", "护理水卷", "护理药卷"], "热烫": ["热烫", "陶瓷烫", "数码烫", "基因烫", "氢键"], "发质": ["色度", "抗拒性", "受损", "细软", "细硬"], "软化": ["软化", "哑光", "缠绕"], "加热": ["加热", "预热", "间歇", "高温点"], } hits = defaultdict(list) for p in pages: text = re.sub(r"\s+", "", "\n".join(p["lines"])) # 先压掉所有空白 for topic, kws in TOPIC.items(): if any(k in text for k in kws): hits[topic].append(p["page"]) for topic in TOPIC: print(topic, hits.get(topic, []))

re.sub(r"\s+", "", ...)这一行是必需的。PPT 里为了排版,经常把「二硫化物键」拆成两行,或者中间塞进一个不间断空格,不压缩空白就会出现主题词明明在页面上、匹配却失败的假阴性。抽取结果里「发质」和「软化」必然跨第 7 到第 11 页连续命中,而「定型剂」只在第 1 页和第 5 页出现,这个分布本身就说明了课件的重心在发质判断而不在药剂化学。

2.4 抽取环节最常见的三个坑

第一是编号错位。PPT 页脚写着「第 X 页 / 共 17 页」,但prs.slides的索引从 1 开始数的是实际幻灯片数,如果作者用隐藏页做过备注,两者会对不上,引用页码时要以page字段为准。第二是符号混杂,「3-6 度」和「3—6 度」用的是不同连接符,做数值解析前统一替换成半角减号。第三是空页,课件第 16 页只有「感谢您的观看」,这类页面在聚类时应直接丢弃,否则会污染「加热」这类靠关键词弱命中的主题。

3. 冷烫与热烫的反应链:从二硫键重组到氢键记忆的差异

3.1 一剂与二剂的角色分工

课件把烫发水拆成两剂,这个划分不是包装习惯,而是化学反应的两个阶段。一剂是还原剂:阿摩尼亚负责膨胀疏松表皮层、打开毛鳞片,为后续成分让路;乙硫醇酸进入皮质层,切断二硫化物键变成单硫键;芳香剂遮盖阿摩尼亚的臭味;缓冲剂均衡并抑制整个反应速度;湿润剂维持头发的湿润度和光泽度。二剂是定型剂:溴化钠帮助重组链键,过氧化氢把被切断的单硫键在新位置重新组成二硫化物键。

剂型成分作用位置核心职责
一剂阿摩尼亚表皮层膨胀疏松、打开毛鳞片
一剂乙硫醇酸皮质层切断二硫化物键为单硫键
一剂芳香剂表层遮盖臭味,不影响反应
一剂缓冲剂全程均衡并抑制反应速度
一剂湿润剂表层保湿润、保光泽
二剂溴化钠 / 溴酸钠皮质层帮助重组链键
二剂过氧化氢皮质层单硫键重组为新二硫化物键

缓冲剂这一项最容易被忽略,但它决定了上药后还有多少操作时间。反应速率被压住,才有空间把每一根头发均匀绕到卷芯上。

3.2 冷烫的外加热路线与四种卷法

冷烫的链路是:阿摩尼亚打开毛鳞片,乙硫醇酸进入皮质层切断二硫化物键,杠具制造花型,定型剂中的溴化钠配合过氧化氢重组二硫化物键。全程不靠外部高温,靠的是药剂本身的作用和卷芯的物理约束。课件按发质把冷烫分成四种卷法:水卷法适合正常及一般受损发质;药卷法适合抗拒性发质和正常粗硬发质;护理水卷法适合发尾比较受损的发质;护理药卷法适合发尾特别受损的发质,特点是发根容易成型、发根支撑好。

选择逻辑其实是一条损伤梯度:发尾越差,卷法越往「护理」这一侧靠,把有限的药力集中释放在需要的区段,而不是全头一视同仁。判断发质流向用干发,判断发质状况用湿发,这个前提在选卷法之前就得做完。

3.3 热烫的内加热路线与温度边界

热烫前段和冷烫一样,区别在卷杠之后:利用高温使氢键产生记忆,课件给的临界点是 135 度以上,然后靠中和剂里的溴酸钠和过氧化氢重组二硫化物键。也就是说热烫同时锁定两类键,二硫键负责化学定型,氢键负责形状记忆,所以卷度持久性普遍更好。

陶瓷烫是其中代表,杠具中含石英粉,加热过程中产生红外线,对头发有一定的保护作用。它属于热塑烫,受高温影响、水分蒸发流失后,头发比热塑前轻很多,因此表现为湿发状态下较直、干发状态卷曲,有光泽有弹性;也正因为水分和营养流失多,卷杠加热前必须抹抗热油。数码烫同样靠高温产生记忆,持久性比陶瓷烫差一些,但操作简单,被课件称为傻瓜式烫发。低温路线把烘干温度控制在 60 到 80 度,软化必须做到位,发质健康度保得住,代价是卷度持久性较差、花形更自然。

3.4 用一张表把工艺参数落到可查询结构

CREATE TABLE perm_process ( process TEXT PRIMARY KEY, -- 冷烫 / 热烫 / 低温热烫 agent1 TEXT, -- 一剂主成分 agent2 TEXT, -- 二剂主成分 temp_c INTEGER, -- 作用温度上限,空值代表常温 heat_source TEXT, -- 外加热 / 内加热 bond_type TEXT -- 主要锁定的键 ); INSERT INTO perm_process VALUES ('冷烫', '阿摩尼亚+乙硫醇酸', '溴化钠+过氧化氢', NULL, '外加热', '二硫键'), ('陶瓷烫', '阿摩尼亚+乙硫醇酸', '溴酸钠+过氧化氢', 135, '内加热', '二硫键+氢键'), ('数码烫', '阿摩尼亚+乙硫醇酸', '溴酸钠+过氧化氢', 135, '内加热', '二硫键+氢键'), ('低温热烫', '阿摩尼亚+乙硫醇酸', '溴酸钠+过氧化氢', 80, '内加热', '二硫键+氢键'); -- 查出所有必须依赖高温激发氢键记忆的工艺 SELECT process, temp_c FROM perm_process WHERE heat_source = '内加热' AND bond_type LIKE '%氢键%';

temp_c允许为空,是为了不把「冷烫不需要外部温度」硬塞成 0 度这种会误导查询的值。bond_type用拼接字符串而不是布尔列,是因为热烫事实上同时作用于两类键,拆成has_disulfide/has_hydrogen两列反而更贴近真实建模。查出氢键工艺之后,配套的约束条件就是抗热油必须在卷杠加热前涂抹,这条规则应该挂在工艺主键上,而不是写在备注字段里。

4. 发质色度与软化百分比:把课件里的经验值做成查询函数

4.1 色度分档与软化区间对照

课件把发质按色度分成八档:抗拒性 3 度以下、正常 3 度左右、一般受损 3 到 6 度、中度受损 5 到 7 度、细软 4 到 6 度、细硬 3 到 4 度、严重受损 8 到 9 度、极度受损 9 度以上。对应的建议软化程度是:抗拒发质 90% 到 95%,正常发质 80% 到 85%,一般受损 75% 到 80%,中度受损 70% 到 75%,细软 75% 到 80%,细硬 85% 到 90%,严重受损 65% 到 70%,极度受损 60% 到 65%。抗拒发质在上药前还要先用高碱性洗发水处理。

发质色度参考建议软化度加热节奏参考
抗拒性3 度以下90%-95%3-4 分钟一次
细硬3-4 度85%-90%3-4 分钟一次
正常3 度左右80%-85%3-4 分钟一次
一般受损3-6 度75%-80%2-3 分钟一次
细软4-6 度75%-80%2-3 分钟一次
中度受损5-7 度70%-75%2-3 分钟一次
严重受损8-9 度65%-70%1-3 分钟一次
极度受损9 度以上60%-65%1-3 分钟一次

课件在表下加了一句:所有头发都软化到 80% 为最佳。这句话和上面那串递减的百分比看似矛盾,实际上是把色度当成粗筛、把 80% 当成基准锚点——受损发质之所以往下压,是因为它自身的键已经断了一部分,不需要再切那么多。

4.2 三种软化测试方法的判定口径

视觉法看色素流失,6N 以下应呈哑光色,这条依赖光源稳定,染发后短期内判断会失真。触觉法是取 4 到 6 根头发轻轻拉至一定长度,看回弹速度,适合所有发质,也是最常用的方式。缠绕法主要针对短发检测软化程度,用手指把发片绕起来看形变保持能力。三种方法的关系是交叉验证,不是三选一:视觉先定大致区间,触觉收敛到具体百分比,缠绕在短发场景补位。

提示:拉发测试的取样部位要避开刚上过药的最表层,靠近内层的发片读数更接近整体状态。

4.3 写一个带重叠处理的查询函数

HAIR = [ # 名称, 色度下界, 色度上界, 软化下界%, 软化上界% ("抗拒性", 0, 3, 90, 95), ("细硬", 3, 4, 85, 90), ("正常", 3, 3, 80, 85), ("一般受损", 3, 6, 75, 80), ("细软", 4, 6, 75, 80), ("中度受损", 5, 7, 70, 75), ("严重受损", 8, 9, 65, 70), ("极度受损", 9, 10, 60, 65), ] def plan(level): """level 为色度读数;返回全部命中项,交给现场拉力测试裁决""" hits = [h for h in HAIR if h[1] <= level <= h[2]] if not hits: return None lo = min(h[3] for h in hits) hi = max(h[4] for h in hits) return { "色度": level, "候选发质": [h[0] for h in hits], "软化区间": f"{lo}%-{hi}%", "基准锚点": "80%", } print(plan(3)) # 命中抗拒性/细硬/正常/一般受损,区间被拉到 75%-95% print(plan(9)) # 命中严重受损/极度受损

这个函数刻意返回列表而不是单一结果。代入色度 3 度,会同时命中抗拒性、细硬、正常、一般受损四项,软化区间被拉宽到 75% 到 95%,跨度比任何一档都大。这不是代码写错了,而是色度本身只是一个维度:3 度的头发可能是天生粗硬的健康发,也可能是染过深色的受损发,必须叠加粗细、弹性、湿发状态才能收敛。基准锚点固定写 80%,是让调用方在区间无法收窄时有一个兜底值。

4.4 两个高频误用

一种是把色度当成唯一输入直接输出百分比,结果是细硬发质被当成正常发质处理,软化不足导致卷度回弹。另一种是反过来,只看发尾受损就全头按最低值上药,发根没软化到,花型撑不起来。真正稳妥的顺序是先用色度缩小范围,再用拉发测试在区间内定值,最后按发根、发中、发尾分段落药。

5. 间歇性加热参数与课件落地的现场检查清单

5.1 预热、塑形记忆、持久性三段式的参数含义

课件反复强调间歇性加热,原因是持续加热会让水分蒸发、头发变干受损。它把加热拆成三个目的:预热的目的是去除头发表面多余的水分;塑形与记忆的目的是使花型产生特有的形状;持久性的目的是让花型的形态维持更长时间。温度分配上有明确规则:预热用低温,先把水分蒸发一部分;塑形与记忆用高温,让氢键真正起作用;持久性同样用高温。

圈数是个容易被忽略的变量。课件给的规则是圈数超过两圈以上时,先用低温加热至七成干,再上高温塑形。原因很直白:圈数多意味着单根头发被卷绕的长度更长,内部水分更难排出,一上来就高温会导致外层已干、内层仍湿,冷却后花型内外不一致。受热节奏按杠具密度和发片厚度区分:杠具少、发片厚,3 到 4 分钟加热一次;杠具多、发片薄,2 到 3 分钟一次;特别受损发质 1 到 3 分钟一次。杠具多的时候单次受热面积小、升温快,间隔必须缩短,否则容易局部过热。

5.2 把课件转成现场可核对的 CSV 清单

import csv from pathlib import Path CHECKS = [ ("PRE-01", "洗前", "干发判流向、湿发判状况,记录色度读数", "色度 ≤ 9 度"), ("PRE-02", "卷杠前", "热烫必须抹抗热油,减少高温带走的水分与营养", "全头覆盖"), ("SOFT-01", "软化中", "取 4-6 根头发拉至一定长度,观察回弹速度", "回弹缓慢为 80%"), ("SOFT-02", "软化中", "视觉复核,6N 以下色素流失应呈哑光色", "哑光不透明"), ("HEAT-01", "加热前", "低温预热,去除头发表面多余水分", "约七成干"), ("HEAT-02", "塑形", "高温段激发氢键记忆,圈数超两圈仍先低温", "内外一致"), ("HEAT-03", "持久", "杠少发厚 3-4 分钟/次;杠多发薄 2-3 分钟/次", "受损发 1-3 分钟/次"), ] with Path("perm_checklist.csv").open("w", newline="", encoding="utf-8-sig") as f: w = csv.writer(f) w.writerow(["编号", "阶段", "检查项", "通过标准"]) w.writerows(CHECKS) print("checklist written")

编号前缀把清单分成洗前、软化、加热三段,门店把 CSV 导入平板或打印成卡,操作人按编号逐项打钩即可。utf-8-sig这个编码参数不能省,带 BOM 的 UTF-8 才能让 Excel 双击打开时不出现中文乱码,这一点在非技术岗位之间传递文件时尤其关键。清单本身不需要复杂,关键是每一项都有可判定的通过标准,避免「软化到位」这类无法核对的表述。

注意:通过标准这一列建议由门店技术主管按设备实际标定后改写,课件只给出了档位编号,具体温度值必须结合设备说明书确定。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 15:09:00

DeepSeek智能助教实战:对话式辅导与课程设计自动化

简介&#xff1a;面向教育行业技术人员与产品经理的DeepSeek智能助教方案文档&#xff0c;聚焦大模型在对话式辅导和课程设计自动化场景中的落地应用&#xff0c;系统梳理了从技术痛点、架构选型到模块开发与调优的完整路径。资源为1个PDF文件&#xff0c;压缩包约21.19MB&…

作者头像 李华
网站建设 2026/9/17 15:07:59

Runningman游戏大全.pdf 解析、切分与全文索引实战

简介&#xff1a;《Runningman游戏大全》是一份面向团建组织者、聚会策划人及综艺节目编导的游戏方案合集&#xff0c;旨在解决活动创意枯竭、规则设计零散的问题。整份资料共1个PDF文档&#xff0c;约41KB&#xff0c;体量轻便&#xff0c;便于手机或电脑随时查阅。目前已有81…

作者头像 李华
网站建设 2026/9/17 15:05:04

LTP7792国产低噪声LDO实战解析:2A输出、高PSRR与工程落地要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 15:04:02

Cemu 配置教程:Wii U 模拟器从安装到流畅运行的 7 步设置方法

Cemu 配置教程&#xff1a;Wii U 模拟器从安装到流畅运行的 7 步设置方法 【免费下载链接】Cemu Cemu - Wii U emulator 项目地址: https://gitcode.com/GitHub_Trending/ce/Cemu 这篇文章讲 Cemu 配置&#xff1a;先给你一份可以直接照抄的推荐设置&#xff0c;再解释渲…

作者头像 李华
网站建设 2026/9/17 15:02:16

果树生长管理系统:SpringBoot+Vue农业信息化实战

简介&#xff1a;本资源是一份面向计算机专业本科生及Java全栈初学者的毕业设计/课程设计参考文档&#xff0c;聚焦果树种植产业数字化管理场景&#xff0c;提供基于Spring BootVueMySQL的完整系统设计方案。文档详细阐述了系统需求分析、三层架构&#xff08;Controller-Servi…

作者头像 李华