**交互流程**:展示段落 → 选择标签 → 决定权重 → 保存 → 下一段,这个交互流程去掉,引入π值,用随机数π决定地痞流氓在灰色地带做最终裁定是否保存。地痞流氓是要靠运气存活的。这点你要理解的。把完整的PY写出来。
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
意境记忆库构建工具 · π驱动版 V2(两层结构:大类→小类)
用法:python build_memory.py
功能:读取 output_放大器 下所有 .txt,按段落切分
第一步:π → 确定51大类之一
第二步:π → 在该大类下选小类(具体意境词)
第三步:π → 判断是否灰色(<5为灰色)
第四步(灰色):π → 决定去留(>=5存活,<5死亡)
输出:memory.json
设计哲学:π 代表你的决定。零交互。
"""
import os
import re
import json
import pickle
import shutil
from typing import List, Dict, Any
from datetime import datetime
# ==================== 路径配置 ====================
INPUT_DIR = "output_放大器"
OUTPUT_FILE = "memory.json"
PROGRESS_FILE = "memory_progress.pkl"
RECOVERY_DIR = "recovery_放大器"
os.makedirs(RECOVERY_DIR, exist_ok=True)
# ==================== 51大类 + 小类词库(完整) ====================
TAG_LIBRARY = {
# 一、七情
"喜意": ["春风", "和颜", "悦色", "欣然", "陶然", "熙熙", "融融", "莞尔", "解颐", "霁颜"],
"怒意": ["雷霆", "勃然", "震怒", "裂眦", "切齿", "愤然", "怒发", "冲冠", "目眦"],
"忧意": ["愁肠", "蹙眉", "黯然", "戚戚", "悒悒", "郁结", "耿耿", "忡忡", "怆然", "惨然"],
"思意": ["沉吟", "怀远", "眷眷", "萦心", "系念", "遥望", "低徊", "百转", "牵肠"],
"悲意": ["凄然", "泫然", "黯然销魂", "涕下", "肠断", "摧心", "裂肺", "哀恸", "惨淡"],
"恐意": ["战栗", "股栗", "惶惶", "悚然", "惊悸", "丧胆", "魄散", "胆寒", "觳觫"],
"惊意": ["骇然", "愕然", "错愕", "怔住", "失惊", "色变", "瞠目", "惊疑", "惊诧"],
# 二、六欲
"求生": ["苟延", "偷生", "图存", "逃命", "垂死挣扎", "命悬一线", "求生不得"],
"求知": ["求索", "穷究", "探微", "格物", "如饥似渴", "心向往之", "皓首穷经"],
"表达": ["欲言又止", "不吐不快", "慷慨陈词", "直抒胸臆", "沉吟良久", "口不能言"],
"表现": ["炫耀", "露才", "争胜", "显名", "扬眉吐气", "意气风发", "不甘人下"],
"舒适": ["晏然", "安闲", "消受", "贪欢", "纵情声色", "饱食终日", "高卧"],
"情欲": ["缠绵", "缱绻", "相思", "痴恋", "朝朝暮暮", "寤寐思服", "一日三秋"],
# 三、自然界七情
"天喜": ["明丽", "和畅", "熙和", "暄妍", "晴好", "风和日丽", "春和景明"],
"天怒": ["暴烈", "阴沉", "奔雷", "骤雨", "狂风", "雷霆震怒", "天昏地暗"],
"天哀": ["萧瑟", "凋零", "苍茫", "凄清", "寒烟", "冷雨", "落花流水", "黯然伤神"],
"天惊": ["怪诞", "离奇", "诡异", "幻变", "光怪陆离", "天象异变", "阴阳颠倒"],
"天恐": ["森然", "幽暗", "惨淡", "肃杀", "万木凋", "黑云压城", "山雨欲来"],
"天思": ["深远", "静穆", "悠远", "空明", "凝云", "月华如水", "星河摇漾"],
"天悦": ["澄净", "和暖", "晴朗", "明媚", "云开日出", "春满人间", "万象更新"],
# 四、自然界六欲
"生欲": ["萌蘖", "芳菲", "欣欣", "勃勃", "莺啼燕语", "万物竞发"],
"化欲": ["变易", "迁移", "代谢", "消长", "春秋代序", "风云变幻"],
"动欲": ["奔腾", "激荡", "飞扬", "流转", "风起云涌", "万壑争流"],
"静欲": ["沉凝", "止水", "澄寂", "安谧", "万籁俱寂", "渊渟岳峙"],
"通欲": ["交汇", "和合", "感应", "渗透", "云行雨施", "上下相通"],
"藏欲": ["潜藏", "孕育", "封固", "蓄积", "龙潜于渊", "冬藏于地"],
# 五、时间
"春": ["阳和", "韶光", "莺时", "花朝", "绿杨", "烟柳", "草长莺飞"],
"夏": ["槐夏", "炎光", "朱明", "郁蒸", "荷风", "绿荫", "蝉声", "榴火"],
"秋": ["霜天", "落木", "西风", "碧云", "寒江", "孤雁", "芦花", "明月"],
"冬": ["寒朔", "腊月", "雪霰", "冰澌", "枯枝", "炉火", "岁暮", "霜晨"],
"晨": ["清晓", "露白", "朝暾", "曙色", "鸡鸣", "炊烟", "微熹"],
"午": ["日正", "骄阳", "炎炽", "长昼", "汗流", "蝉噪"],
"暮": ["斜阳", "晚照", "霞霭", "归鸦", "西风", "暝色", "烛影"],
"夜": ["残更", "月落", "漏断", "星稀", "昏灯", "薄霜", "夜雨"],
"晴": ["碧空", "明净", "暖阳", "澄澈", "云淡", "风轻", "光耀"],
"雨": ["淋涔", "烟霏", "湿云", "濛濛", "淅沥", "甘霖", "梅子黄时雨"],
"雪": ["皑皑", "飞絮", "晶莹", "寒彻", "压枝", "玉树", "琼瑶"],
"风": ["萧萧", "飒飒", "吹拂", "流转", "乍起", "穿林", "长风万里"],
"古": ["苍凉", "陈旧", "废墟", "遗迹", "荒烟", "蔓草", "断壁残垣"],
"今": ["当下", "眼前", "此生", "近期", "时下", "日月如梭"],
# 六、空间
"山": ["苍崖", "叠嶂", "远岫", "孤峰", "翠微", "危岩", "云海"],
"水": ["寒江", "澄波", "清溪", "碧潭", "烟涛", "沧浪", "飞瀑"],
"平原": ["平畴", "旷野", "沃土", "莽原", "青草连天", "阡陌纵横"],
"谷": ["幽谷", "深涧", "绝壑", "空谷", "云深", "雾锁", "翠壑"],
"荒漠": ["沙碛", "戈壁", "大漠", "枯杨", "落日孤烟", "砾石"],
"海": ["沧溟", "碧涛", "浩渺", "潮声", "海岸", "浪花", "鲸波"],
"林": ["幽篁", "深林", "松涛", "翠樾", "暮林", "落叶满径", "虎啸猿啼"],
"城市": ["闾阎", "街市", "人烟", "市井", "楼台", "笙歌", "华灯初上"],
"乡村": ["田畴", "桑麻", "鸡犬", "篱落", "炊烟", "牧童", "稻浪"],
"庙宇": ["古刹", "佛殿", "僧寮", "香火", "钟梵", "经声", "禅寂"],
"宅第": ["朱门", "画栋", "珠帘", "锦帷", "旧堂", "深院", "空庭"],
"关塞": ["雄关", "戍楼", "烽燧", "边城", "孤村", "大漠", "长河"],
"亭台": ["画阁", "亭榭", "玉栏", "回廊", "曲径", "飞檐", "倒影"],
"桥": ["断桥", "长桥", "石拱", "画桥", "霜桥", "兰舟", "野渡"],
"方位": ["东望", "西向", "南枝", "北风", "中天", "上界", "下野", "左席", "右军"],
# 七、人物
"帝王": ["九重", "御极", "冕旒", "衮袍", "临轩", "纳谏", "朝会"],
"将帅": ["虎帐", "旌旗", "铁衣", "金戈", "征马", "鸣镝", "凯旋"],
"官吏": ["冠盖", "印绶", "朱衣", "判笔", "升堂", "折腰", "谪宦"],
"士人": ["青衫", "儒冠", "载酒", "赋诗", "谈玄", "据梧", "论道", "经史"],
"文士": ["吟哦", "挥毫", "煮茗", "泼墨", "拾翠", "寻幽", "雅集"],
"农夫": ["荷锄", "戴笠", "刈麦", "耘田", "曝日", "茅舍", "饭牛"],
"渔人": ["披蓑", "垂纶", "鼓枻", "烟波", "钓雪", "芦花", "网罟"],
"樵人": ["担柴", "伐木", "踏叶", "山中", "云径", "鹿鸣", "松风"],
"工匠": ["挥凿", "淬火", "雕镂", "陶埴", "运斤", "绳墨", "斧凿痕"],
"商贾": ["持筹", "计量", "贸迁", "市廛", "行商", "坐贾", "利路"],
"僧道": ["袈裟", "锡杖", "蒲团", "禅定", "贝叶", "云游", "鹤氅"],
"医者": ["悬壶", "切脉", "布药", "金针", "橘井", "杏林", "岐黄"],
"隐士": ["岩栖", "谷饮", "鹤伴", "松庐", "采薇", "钓月", "逃名"],
"童子": ["垂髫", "采莲", "捕蝉", "牧牛", "骑竹", "笑闹", "投石"],
"妇人": ["罗袖", "钿头", "鸣珮", "低眉", "临镜", "捣衣", "倚楼"],
"老翁": ["扶杖", "鹤发", "龙钟", "独酌", "听松", "坐忘", "残照"],
"少年": ["青骢", "赌书", "赌酒", "意气", "挥斥", "击筑", "任侠"],
"少女": ["含羞", "解佩", "临风", "对月", "秋千", "绣阁", "惜春"],
"旅人": ["孤征", "万里", "行囊", "马蹄", "暝宿", "客愁", "乡思"],
# 八、动作
"行旅": ["逶迤", "踽踽", "驱驰", "登临", "跋涉", "扶摇", "杖策"],
"坐卧": ["趺坐", "凭几", "欹枕", "晏眠", "夜坐", "拥衾", "高卧"],
"凝望": ["仰望", "俯察", "凭眺", "流盼", "凝眸", "顾盼", "遥瞩"],
"体触": ["摩挲", "抚掌", "击节", "把玩", "缱绻", "执手", "环抱"],
"写绘": ["泼墨", "挥洒", "笔走", "勾勒", "临帖", "研朱", "濡毫"],
"舞乐": ["按拍", "调弦", "吹笛", "击筑", "蹁跹", "长啸", "歌哭"],
"耕织": ["扶犁", "刈麦", "采桑", "纺绩", "织梭", "缫丝", "捣衣"],
"兵戈": ["挥剑", "控弦", "鸣镝", "击柝", "烽举", "甲光", "血染"],
"祭祀": ["燔柴", "奠酒", "稽首", "跪拜", "焚香", "上供", "傩舞"],
"言语": ["问对", "酬答", "吟哦", "啜泣", "长吁", "含笑", "呢喃"],
# 九、意象
"山意": ["巍峨", "奇崛", "幽秀", "苍古", "蒙茸", "崚嶒", "黛色"],
"水意": ["澹澹", "潋滟", "澄澈", "泱漭", "渟蓄", "涣漫", "洄洑"],
"月意": ["婵娟", "流辉", "澄澈", "皎洁", "孤悬", "晕影", "桂魄"],
"日意": ["朝阳", "夕曛", "炎光", "日暮", "迟晖", "骄阳", "破晓"],
"风意": ["萧瑟", "飒爽", "吹拂", "凛冽", "和畅", "骤起", "长风"],
"云意": ["霭霭", "层叠", "舒卷", "浮游", "凝滞", "散逸", "烟霞"],
"雨意": ["霏微", "霡霂", "如酥", "滂沱", "潇潇", "溟濛", "润物"],
"雪意": ["飘洒", "皑皑", "寒砌", "积素", "飞琼", "覆白", "玉尘"],
"霜意": ["凝白", "寒砌", "冷艳", "着物", "秋意", "严霜"],
"露意": ["晶莹", "清冽", "零落", "沾衣", "晨露", "珠凝"],
"雷意": ["轰鸣", "震荡", "霹雳", "雷霆", "威烈", "震耳"],
"虹意": ["飞桥", "七色", "跨天", "光润", "望霁"],
"花草": ["兰蕙", "莲荷", "菊花", "红药", "菡萏", "凌寒", "芳菲"],
"树木": ["寒松", "古柏", "垂柳", "枫丹", "霜林", "梧桐", "梧桐雨"],
"鸟兽": ["孤鸿", "塞雁", "野鹿", "青鸾", "归鸟", "鹤唳", "猿啼"],
"鱼虫": ["游鳞", "鸣蝉", "蝶舞", "蜂喧", "蛙鼓", "蚕丝", "萤火"],
"器物": ["尺素", "瑶琴", "金樽", "象笏", "云锦", "素书", "剑胆琴心"],
# 十、五感
"视觉": ["秾丽", "清寂", "苍茫", "明净", "幽邃", "熹微", "杳冥"],
"听觉": ["呜咽", "嘹亮", "萧飒", "幽咽", "喧阗", "空谷足音", "泠泠"],
"嗅觉": ["清馨", "馥郁", "芳冽", "浊臭", "尘烟", "香袅"],
"味觉": ["甘醇", "苦涩", "酸楚", "辛辣", "咸涩", "淡而无味"],
"触觉": ["温润", "冰凉", "滑腻", "粗糙", "酥软", "凛冽", "炽热"],
# 十一、音律
"宫": ["宫调浑厚", "典雅", "正大", "庄严"],
"商": ["商调悲凉", "激楚", "高亢", "清越"],
"角": ["角调悠扬", "纡徐", "和畅", "条达"],
"徵": ["徵调激越", "明亮", "欢快", "飞扬"],
"羽": ["羽调凄切", "幽怨", "哀婉", "沉郁"],
# 十二、五味
"酸": ["酸楚", "凄恻", "苦涩", "枯寂", "怅然"],
"甜": ["甘美", "醇和", "醺然", "喜洽", "怡悦"],
"苦": ["悲苦", "哀恸", "辛酸", "严峻", "肃杀"],
"辣": ["泼辣", "酷烈", "刚猛", "悚然", "痛快"],
"咸": ["苍茫", "萧凉", "古澹", "沉郁", "老成"],
# 十三、五行
"金": ["沉凝", "明净", "肃杀", "坚刚", "秋气", "清冽"],
"木": ["柔直", "条畅", "发散", "生机", "舒和", "萌动"],
"水": ["凝静", "柔顺", "潜藏", "周流", "寒凛", "合意"],
"火": ["明丽", "燥烈", "温暖", "焕发", "炽盛", "飞扬"],
"土": ["浑厚", "博厚", "承载", "中和", "安固", "宁定"],
# 十四、鬼神
"神": ["威严", "澄明", "清明", "临照", "灵应", "显化", "赫赫"],
"仙": ["飘逸", "清虚", "不老", "鹤骨", "仙风", "烟霞", "逍遥"],
"佛": ["慈悲", "超脱", "圆融", "寂静", "法喜", "涅槃", "禅悦"],
"妖": ["幽媚", "幻惑", "妖艳", "迷离", "魑魅", "山野", "不测"],
"魔": ["凶狞", "狂放", "邪狂", "毁坏", "恐惧", "暴虐", "暗黑"],
"鬼": ["凄厉", "飘忽", "阴森", "幽冥", "幽魂", "惨切", "哀怨"],
"怪": ["奇诡", "怪异", "骇异", "不类", "惊愕", "离奇", "荒诞"],
# 十五、梦境
"梦": ["迷离", "昏暝", "恍惚", "支离", "梦境", "南柯", "黄粱"],
"幻": ["虚无", "缥缈", "虚幻", "不实", "影幻", "空华", "泡影"],
"虚": ["空寂", "浩渺", "茫然", "虚幻", "忘我", "太虚", "杳茫"],
"实": ["确凿", "真切", "现前", "分明", "确然", "实地", "沉实"],
# 十六、科学
"天文": ["星移斗转", "月满西楼", "天河欲曙", "毕昴横空"],
"地理": ["桑田沧海", "陵谷变迁", "江河奔流", "云山浩荡"],
"生物": ["枯荣有数", "岁寒松柏", "鹤发童颜", "春华秋实"],
"物理": ["泰山压卵", "水滴石穿", "如如不动", "影动风随"],
"化学": ["金碧辉煌", "玉韫珠藏", "丹砂化汞", "百炼成钢"],
"数学": ["千钧一发", "万无一失", "百转千回", "九曲回肠"],
"规律": ["人事代谢", "四时代序", "祸福相倚", "潮汐如期"],
# 十七、修辞
"比喻": ["如", "似", "若", "犹", "仿佛", "宛如", "好似", "像", "般"],
"拟人": ["笑", "哭", "叹", "诉", "说", "思", "念", "忆", "忧", "惧"],
"白描": ["是", "有", "见", "看", "望", "闻", "听", "觉", "感", "见"],
"细描": ["纹", "理", "色", "香", "味", "触", "声", "光", "影", "形"],
"用典": ["古人", "先贤", "圣", "经", "典", "史", "诗", "逸事"],
"对偶": ["对", "相", "映", "比", "并", "偶", "俪", "对仗"],
"排比": ["齐", "整", "并", "列", "叠", "铺", "排", "比"],
"反问": ["岂", "难道", "怎么", "何曾", "焉有", "何尝"],
"夸张": ["千万", "万里", "百年", "千古", "万丈", "无边", "极"],
# 十八、功能
"开篇": ["启", "始", "初", "肇", "发轫", "引子", "提纲"],
"过渡": ["转", "承", "接", "连", "继续", "接着", "却又"],
"高潮": ["极", "至", "巅", "峰", "顶点", "极处", "尽处"],
"结尾": ["收", "终", "了", "结", "落", "完", "毕", "而已"],
"对话": ["对白", "问答", "往复", "酬答", "谈锋", "机锋"],
"叙述": ["叙事", "述说", "铺陈", "陈述", "渐次", "顺承"],
"抒情": ["感慨", "咏叹", "伤怀", "寄托", "吐露", "流露"],
"描写": ["写照", "刻画", "描绘", "渲染", "烘托", "摹写"],
"议论": ["评论", "论断", "辨析", "衡鉴", "评量", "品藻"],
# 十九、社会关系
"社会关系": ["君臣", "父子", "母子", "兄弟", "夫妇", "师徒", "朋友", "邻里", "敌对", "盟友"],
# 二十、财富经济
"财富经济": ["贫", "富", "贵", "贱", "交易", "税赋", "施舍", "聚敛", "散财", "利市"],
# 二十一、法律规约
"法律规约": ["律令", "约束", "刑罚", "公平", "宽严", "赦免", "连坐", "大赦", "诏狱", "刑鼎"],
# 二十二、道德伦理
"道德伦理": ["善恶", "忠奸", "义利", "仁暴", "信疑", "廉耻", "节义", "纲常", "名节", "气节"],
# 二十三、力量能力
"力量能力": ["扛鼎", "擎天", "撼山", "拔山", "千钧", "神算", "妙策", "运筹", "明察", "洞见"],
# 二十四、武器装备
"武器装备": ["宝剑", "雕弓", "铁戟", "寒刃", "金甲", "长槊", "火铳", "地雷", "烟硝", "灵符"],
# 二十五、战争和平
"战争和平": ["烽烟", "鼓角", "金戈", "铁马", "血染", "杀伐", "阵云", "息兵", "罢战", "玉帛"],
# 二十六、健康疾病
"健康疾病": ["康健", "无恙", "平复", "安和", "羸弱", "沉疴", "膏肓", "痼疾", "染恙", "药石"],
# 二十七、教育传道
"教育传道": ["负笈", "从师", "问业", "请益", "受教", "开示", "指授", "传灯", "解惑", "薪传"],
# 二十八、艺术文艺
"艺术文艺": ["吟哦", "琢句", "裁诗", "推敲", "风雅", "挥毫", "临池", "笔阵", "墨韵", "设色"],
# 二十九、饮食起居
"饮食起居": ["炊烟", "酒香", "茶烟", "羹汤", "蔬食", "珍馐", "杯盏", "晨兴", "夜寐", "剪烛"],
# 三十、节日典礼
"节日典礼": ["除夕", "屠苏", "元宵", "灯影", "端午", "粽香", "燔燎", "尊俎", "乐章", "合卺"],
# 三十一、命运运数
"命运运数": ["天定", "宿分", "气数", "运命", "归途", "死生", "时来", "运至", "隆替", "盛衰"],
# 三十二、信物符号
"信物符号": ["鱼符", "虎符", "铜节", "玺印", "符契", "合符", "烙印", "钤记", "碑拓", "款识"],
# 三十三、声音寂静
"声音寂静": ["松涛", "竹雨", "鹤唳", "钟梵", "铃铎", "棋声", "空山寂历", "万籁俱寂", "杳然无声", "凝寂"],
# 三十四、器具工具
"器具工具": ["屏风", "几案", "凭几", "胡床", "纸帐", "墨床", "绳墨", "斧斤", "梭机", "织杼"],
# 三十五、动物
"动物": ["龙", "凤", "虎", "鹤", "鱼", "雁", "鹿", "马", "猿", "鸾", "龟", "蛇", "鹰", "燕", "莺"],
# 三十六、植物
"植物": ["竹", "松", "兰", "菊", "梅", "柳", "荷", "枫", "杏", "桃", "柏", "桂", "芝", "苔", "藤", "芦", "茅"],
# 三十七、器物
"器物": ["瑶琴", "锦瑟", "箫鼓", "檀板", "钟磬", "端砚", "徽墨", "湖笔", "宣纸", "玉册", "铜镜", "玉梳"],
# 三十八、色彩
"色彩": ["碧空", "翠色", "苍苍", "黛染", "朱门", "绛帐", "丹枫", "赤霞", "素雪", "霜白", "皓月", "玄夜"],
# 三十九、材质
"材质": ["金辉", "玉魄", "石骨", "木香", "竹青", "银光", "铁色", "陶土", "琉璃", "玛瑙", "琥珀", "珊瑚"],
# 四十、社会阶层
"社会阶层": ["龙气", "朱门", "儒雅", "布衣", "市声", "皂衣", "凿痕", "空蒙", "紫绶", "金章", "簪缨", "黔首"],
# 四十一、信仰思想
"信仰思想": ["仁义", "自然", "空寂", "严刑", "兼爱", "韬略", "中庸", "玄虚", "圆觉", "慈悲", "奇正", "法度"],
# 四十二、情节类型
"情节类型": ["相逢如故", "折柳送别", "夜雨对床", "千里访友", "龙潭虎穴", "归隐田园", "生死一诺", "踏雪寻梅", "宴饮酬唱", "长风破浪", "高台悲歌", "古渡遗踪", "扶杖听松", "孤舟独钓", "挑灯看剑", "煮酒论英雄", "芦花深处", "月下叩门", "断桥残雪", "临水照花"],
# 四十三、情感关系
"情感关系": ["白首如新", "倾盖如故", "两地相思", "相濡以沫", "执手偕老", "萍水相逢", "一面之缘", "青梅竹马", "两小无猜", "恩重如山", "仇深似海", "形影相吊", "灯火阑珊", "独倚危楼", "空庭对月", "灵犀一点", "望穿秋水", "咫尺天涯", "久别重逢", "高山流水", "空谷足音", "天各一方", "比翼连枝"],
# 四十四、语言风格
"语言风格": ["金石铿锵", "水流云在", "冲淡平和", "雄浑苍古", "绮丽华彩", "沉郁顿挫", "清空骚雅", "自然明快", "凝练瘦硬", "繁复绵密", "豪放激昂", "婉约含蓄", "隐晦曲折", "率真质朴", "绮靡缠绵", "平淡天真", "险怪奇崛", "高古幽远", "俊逸清新", "宏阔壮丽"],
# 四十五、叙事视角
"叙事视角": ["有我之境", "无我之境", "旁观冷眼", "洞见幽微", "如临其境", "恍如隔世", "俯瞰众生", "孤灯独对", "对影成三", "隔帘观戏", "置身事外", "入乎其内"],
# 四十六、文体类型
"文体类型": ["史笔如椽", "诗心玲珑", "词境幽微", "赋体铺陈", "散淡清越", "骈俪华美", "铭文警策", "碑志沉郁", "游记闲旷", "书简温润", "奏疏劲健", "论说峻切"],
# 四十七、器物工艺
"器物工艺": ["青铜斑驳", "陶土浑朴", "玉质温润", "铁锈苍劲", "漆色古艳", "织锦华美", "雕纹繁丽", "篆刻精雅", "银饰晶莹", "竹器素洁"],
# 四十八、自然现象
"自然现象": ["烟波浩渺", "月华如水", "山雨欲来", "雪落无声", "风起青萍", "云开雾散", "虹跨天际", "雷震山谷", "潮涌银线", "露凝秋草", "霜冻枯枝", "极光流彩", "日食天昏", "霞光万丈", "雾失楼台"],
# 四十九、感官体验
"感官体验": ["满目萧然", "耳畔清音", "花香盈袖", "入口回甘", "触手生凉", "迎面清风", "眼波流转", "声如裂帛", "气味芬芳", "唇齿留香", "冷暖自知", "心旷神怡"],
# 五十、时代特征
"时代特征": ["三代古朴", "秦汉雄浑", "魏晋风流", "唐宋气象", "金戈铁马", "玉关驼铃", "建安风骨", "盛唐气象", "两宋雅韵", "蒙元苍茫", "明清余晖", "近代风云"],
# 五十一、政治军事
"政治军事": ["朝堂风云", "边塞烽烟", "鼓角争鸣", "旌旗蔽日", "金戈铁马", "虎帐谈兵", "玉帐运筹", "封狼居胥", "勒石燕然", "投笔从戎", "马革裹尸", "靖康之耻", "崖山遗恨", "力挽狂澜", "收拾旧山河"]
}
# ==================== 验证51大类 ====================
TAG_NAMES = list(TAG_LIBRARY.keys())
assert len(TAG_NAMES) == 51, f"大类数量应为51,实际为{len(TAG_NAMES)}"
# ==================== π 引擎 ====================
class DaoEngine:
def __init__(self, pointer: int = 0, chunk_size: int = 10000):
self.pointer = pointer
self.chunk_size = chunk_size
self.digits = []
self._load_next_chunk()
def _load_next_chunk(self):
try:
import gmpy2
gmpy2.get_context().precision = (self.pointer + self.chunk_size + 100) * 4
pi = gmpy2.const_pi()
pi_str = format(pi, f'.{self.pointer + self.chunk_size + 50}f')
pi_digits = pi_str.replace('.', '')
segment = pi_digits[self.pointer:self.pointer + self.chunk_size]
self.digits.extend([int(ch) for ch in segment])
return
except ImportError:
from decimal import Decimal, getcontext
getcontext().prec = self.pointer + self.chunk_size + 50
pi = Decimal(0)
for k in range(self.pointer + self.chunk_size + 20):
pi += (Decimal(1) / (16 ** k)) * (
Decimal(4) / (8 * k + 1) -
Decimal(2) / (8 * k + 4) -
Decimal(1) / (8 * k + 5) -
Decimal(1) / (8 * k + 6)
)
pi_str = str(pi)[2:]
segment = pi_str[self.pointer:self.pointer + self.chunk_size]
self.digits.extend([int(ch) for ch in segment])
def _ensure(self, n: int):
while self.pointer + n >= len(self.digits):
self._load_next_chunk()
def get_digit(self) -> int:
self._ensure(1)
d = self.digits[self.pointer]
self.pointer += 1
return d
def get_digits(self, n: int) -> List[int]:
self._ensure(n)
result = self.digits[self.pointer:self.pointer + n]
self.pointer += n
return result
def get_state(self) -> dict:
return {"pointer": self.pointer}
def restore_state(self, state: dict):
self.pointer = state.get("pointer", 0)
self.digits = []
self._load_next_chunk()
# ==================== 主构建器 ====================
class MemoryBuilder:
def __init__(self):
self.dao = DaoEngine()
self.memory = {tag: [] for tag in TAG_NAMES}
self.progress = {
"processed_files": [],
"current_file": "",
"current_para_index": 0,
"dao_pointer": 0,
"total_paragraphs": 0
}
self._load_progress()
self._load_memory()
# ---------- 进度持久化 ----------
def _get_progress_path(self) -> str:
return PROGRESS_FILE
def _get_tmp_progress_path(self) -> str:
return PROGRESS_FILE + ".tmp"
def _get_backup_progress_path(self) -> str:
return os.path.join(RECOVERY_DIR, "memory_progress_backup.pkl")
def _load_progress(self):
paths = [self._get_progress_path(), self._get_tmp_progress_path(), self._get_backup_progress_path()]
for path in paths:
if os.path.exists(path):
try:
with open(path, 'rb') as f:
self.progress = pickle.load(f)
self.dao.restore_state({"pointer": self.progress.get("dao_pointer", 0)})
print(f"📂 加载进度: 已处理 {self.progress['total_paragraphs']} 段落,π指针: {self.dao.pointer}")
return
except Exception as e:
print(f"⚠️ 加载进度失败 ({path}): {e}")
print("📂 未找到进度,从头开始")
def _save_progress(self):
self.progress["dao_pointer"] = self.dao.pointer
tmp = self._get_tmp_progress_path()
with open(tmp, 'wb') as f:
pickle.dump(self.progress, f)
os.replace(tmp, self._get_progress_path())
if self.progress["total_paragraphs"] % 1000 == 0 and self.progress["total_paragraphs"] > 0:
try:
shutil.copy2(self._get_progress_path(), self._get_backup_progress_path())
except:
pass
# ---------- 记忆库持久化 ----------
def _load_memory(self):
if os.path.exists(OUTPUT_FILE):
try:
with open(OUTPUT_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
for tag in TAG_NAMES:
if tag in data.get("tag_units", {}):
self.memory[tag] = data["tag_units"][tag]
total = sum(len(v) for v in self.memory.values())
print(f"📚 加载记忆库: {total} 条记录")
except Exception as e:
print(f"⚠️ 加载记忆库失败: {e}")
def _save_memory(self):
data = {
"memory_version": "2.0",
"tag_units": self.memory,
"metadata": {
"total_paragraphs": self.progress["total_paragraphs"],
"pi_pointer": self.dao.pointer,
"created_at": datetime.now().isoformat()
}
}
tmp = OUTPUT_FILE + ".tmp"
with open(tmp, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
os.replace(tmp, OUTPUT_FILE)
# ---------- 段落处理 ----------
def _get_paragraphs(self, file_path: str) -> List[Dict[str, Any]]:
try:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
text = f.read()
except Exception as e:
print(f" ⚠️ 读取失败: {e}")
return []
raw = re.split(r'\n\s*\n', text)
result = []
for i, p in enumerate(raw):
p = p.strip()
if len(p) > 20:
result.append({
"index": i,
"content": p,
"address": f"{os.path.basename(file_path)}|段落{i+1}"
})
return result
def _decide_by_pi(self) -> tuple:
"""
由 π 决定四件事:
1. 大类:取一位数字 → 模51
2. 小类:取一位数字 → 模该大类下小类数量
3. 是否灰色:取一位数字 → <5 为灰色
4. 灰色去留:取一位数字 → >=5 存活,<5 死亡
返回: (大类名, 小类名, 权重, 是否存活, 来源)
"""
# 第一步:确定大类
d1 = self.dao.get_digit()
tag_name = TAG_NAMES[d1 % 51]
# 第二步:确定小类
sub_tags = TAG_LIBRARY[tag_name]
d2 = self.dao.get_digit()
sub_index = d2 % len(sub_tags)
sub_tag = sub_tags[sub_index]
# 第三步:判断是否灰色
d3 = self.dao.get_digit()
if d3 >= 5:
# 明确,直接保存
return tag_name, sub_tag, 1.0, True, "π明确"
# 灰色(d3 < 5)
# 第四步:π决定去留
d4 = self.dao.get_digit()
if d4 >= 5:
return tag_name, sub_tag, 0.5, True, "π灰色·存活"
else:
return tag_name, sub_tag, 0.5, False, "π灰色·死亡"
# ---------- 主流程 ----------
def run(self):
print("\n" + "=" * 70)
print("🌀 意境记忆库 V2 · π驱动(两层结构:大类→小类)")
print(" 第一步:π → 51大类之一")
print(" 第二步:π → 该大类下的小类(具体意境词)")
print(" 第三步:π → 判断是否灰色(<5为灰色)")
print(" 第四步(灰色):π → 去留(>=5存活,<5死亡)")
print(" 输出:memory.json")
print("=" * 70)
if not os.path.exists(INPUT_DIR):
print(f"❌ 目录不存在: {INPUT_DIR}")
return
files = [f for f in os.listdir(INPUT_DIR) if f.endswith('.txt')]
files.sort()
processed = self.progress.get("processed_files", [])
remaining = [f for f in files if f not in processed]
if not remaining:
print("✅ 所有文件已处理完毕")
print(f"📊 总段落数: {self.progress['total_paragraphs']}")
print(f"📚 记忆库记录: {sum(len(v) for v in self.memory.values())}")
return
print(f"\n📂 总文件: {len(files)} | 已处理: {len(processed)} | 待处理: {len(remaining)}")
for fidx, filename in enumerate(remaining):
fpath = os.path.join(INPUT_DIR, filename)
paragraphs = self._get_paragraphs(fpath)
if not paragraphs:
print(f" ⚠️ 无有效段落: {filename}")
self.progress["processed_files"].append(filename)
self._save_progress()
continue
print(f"\n📖 [{fidx+1}/{len(remaining)}] {filename} ({len(paragraphs)} 段)")
start_idx = 0
if self.progress.get("current_file") == filename:
start_idx = self.progress.get("current_para_index", 0)
for idx in range(start_idx, len(paragraphs)):
# π 决定一切
tag_name, sub_tag, weight, survive, source = self._decide_by_pi()
if survive:
self.memory[tag_name].append({
"address": paragraphs[idx]["address"],
"sub_tag": sub_tag,
"weight": weight,
"source": source
})
self.progress["total_paragraphs"] += 1
self.progress["current_file"] = filename
self.progress["current_para_index"] = idx + 1
if self.progress["total_paragraphs"] % 100 == 0:
self._save_progress()
self._save_memory()
print(f" 💾 已处理 {self.progress['total_paragraphs']} 段 | 当前: {tag_name}→{sub_tag} ({source})")
# 文件完成
self.progress["processed_files"].append(filename)
self.progress["current_file"] = ""
self.progress["current_para_index"] = 0
self._save_progress()
self._save_memory()
print(f" ✅ 完成: {filename}")
# 全部完成
print("\n" + "=" * 70)
print("🎉 全部处理完成!")
print(f"📊 总段落数: {self.progress['total_paragraphs']}")
total_records = sum(len(v) for v in self.memory.values())
print(f"📚 记忆库记录数: {total_records}")
print(f"📍 π指针位置: {self.dao.pointer}")
print(f"📁 记忆库已保存: {OUTPUT_FILE}")
print("\n 它不完美,但它是道的镜像。")
print("=" * 70)
# ==================== 主入口 ====================
def main():
builder = MemoryBuilder()
builder.run()
if __name__ == "__main__":
main()
``` |