脚本如何分类存储语录内容

wen 实用脚本 30

本文目录导读:

脚本如何分类存储语录内容

  1. 核心存储结构(推荐 JSON 格式)
  2. 分类逻辑设计(脚本中的关键函数)
  3. 进阶方案(数据库型)
  4. 脚本示例(Python JSON 版)
  5. 存储介质建议
  6. 伪代码(完整流程)
  7. 常见面试追问及回答要点

针对“脚本如何分类存储语录内容”这个问题,我们可以从结构化存储内容分类逻辑两个核心维度来构建方案,以下是一套实用且可扩展的解决方案:


核心存储结构(推荐 JSON 格式)

脚本的核心是数据与逻辑分离,使用 JSON 作为存储格式,既易读又便于程序解析。

{
  "metadata": {
    "version": "1.0",
    "source": "某部电影/某本书/用户原创",
    "created_at": "2024-05-20"
  },
  "categories": {
    "励志": {
      "subcategories": {
        "奋斗": [
          {"id": "quote_001", "text": "路虽远,行则将至。", "author": "《荀子》", "tags": ["坚持", "行动"]},
          {"id": "quote_002", "text": "...", ...}
        ],
        "自信": [
          {"id": "quote_003", "text": "...", ...}
        ]
      }
    },
    "情感": {
      "subcategories": {
        "爱情": [{...}],
        "友情": [{...}]
      }
    },
    "哲理": {
      "plain": [
        {"id": "quote_050", "text": "存在即合理。", "author": "黑格尔", "tags": ["哲学", "理性"]}
      ]
    }
  },
  "tags_index": {
    "坚持": ["quote_001", "quote_010", "quote_022"],
    "行动": ["quote_001", "quote_015"]
  }
}

优势

  • 层级清晰:大类 → 子类 → 具体语录
  • 标签索引:实现快速交叉检索(如:查找所有含“行动”标签的语录)
  • 元数据独立:方便版本管理和溯源

分类逻辑设计(脚本中的关键函数)

在脚本中,你需要实现以下几个核心操作:

添加语录(带自动分类逻辑)

def add_quote(quote_text, author, primary_category, sub_category=None, tags=None):
    """
    1. 校验主分类是否存在(如不存在则创建)
    2. 校验子分类是否存在(如不存在则创建,或放入'other')
    3. 生成唯一 ID(如时间戳+序号)
    4. 存入对应分类数组
    5. 更新 tags_index
    6. 保存至文件
    """
    pass

检索分类下的所有内容

def get_quotes_by_category(category, sub_category=None):
    """
    返回指定分类(及子分类)下的所有语录列表
    """
    pass

多标签交叉查询

def search_by_tags(required_tags, mode="AND"):
    """
    mode="AND": 返回同时包含所有标签的记录
    mode="OR": 返回包含任一标签的记录
    """
    pass

增量更新(防止覆盖)

写文件时不要全量重写,而是:

  • 读取原文件 → 更新内存结构 → 写回文件(或使用数据库,见下文)。

进阶方案(数据库型)

如果语录量较大(> 1000条)或需要频繁修改,建议使用 SQLite(无需安装,Python内置支持)。

表结构设计

-- 分类表
CREATE TABLE categories (
    id INTEGER PRIMARY KEY,
    name TEXT UNIQUE NOT NULL,
    parent_id INTEGER DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id)
);
-- 语录表
CREATE TABLE quotes (
    id TEXT PRIMARY KEY,
    text TEXT NOT NULL,
    author TEXT,
    category_id INTEGER NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id)
);
-- 标签表(多对多关系)
CREATE TABLE tags (
    id INTEGER PRIMARY KEY,
    name TEXT UNIQUE NOT NULL
);
CREATE TABLE quote_tags (
    quote_id TEXT,
    tag_id INTEGER,
    PRIMARY KEY (quote_id, tag_id)
);

优势

  • 支持复杂查询(如:按分类统计数量、按时间排序)
  • 事务支持,防止数据损坏
  • 易于扩展(如增加“来源书籍”、“优先级”字段)

脚本示例(Python JSON 版)

一个简洁的增删改查脚本骨架:

import json
import uuid
from datetime import datetime
class QuoteManager:
    def __init__(self, file_path="quotes.json"):
        self.file_path = file_path
        self.data = self._load()
    def _load(self):
        try:
            with open(self.file_path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            return {"metadata": {}, "categories": {}, "tags_index": {}}
    def _save(self):
        with open(self.file_path, 'w', encoding='utf-8') as f:
            json.dump(self.data, f, ensure_ascii=False, indent=2)
    def add(self, text, author, category, sub_category=None, tags=None):
        if category not in self.data["categories"]:
            self.data["categories"][category] = {}
        if sub_category:
            if sub_category not in self.data["categories"][category]:
                self.data["categories"][category][sub_category] = []
            target = self.data["categories"][category][sub_category]
        else:
            # 使用 'plain' 作为无子分类时的占位
            self.data["categories"][category].setdefault("plain", [])
            target = self.data["categories"][category]["plain"]
        quote_id = str(uuid.uuid4())[:8]
        target.append({
            "id": quote_id,
            "text": text,
            "author": author,
            "tags": tags or []
        })
        # 更新标签索引
        for tag in (tags or []):
            self.data["tags_index"].setdefault(tag, []).append(quote_id)
        self._save()
        return quote_id
    def get_by_category(self, category, sub_category=None):
        cat = self.data["categories"].get(category, {})
        if sub_category:
            return cat.get(sub_category, [])
        # 合并该分类下所有子分类的语录
        result = []
        for sub, quotes in cat.items():
            result.extend(quotes)
        return result
    def search_by_tag(self, tag):
        ids = self.data["tags_index"].get(tag, [])
        # 遍历所有分类找出匹配的语录
        found = []
        for cat in self.data["categories"].values():
            for sub, quotes in cat.items():
                for q in quotes:
                    if q["id"] in ids:
                        found.append(q)
        return found
# 使用示例
qm = QuoteManager()
qm.add("知行合一", "王阳明", "哲理", sub_category="中国哲学", tags=["行动", "认知"])
rs = qm.get_by_category("哲理", "中国哲学")
print(rs)

存储介质建议

场景 推荐方式 理由
个人博客 / 静态站点 JSON + Markdown 易维护,可配合 Next.js 等生成静态页面
多人协作 / 需要搜索 SQLite 或 PostgreSQL 支持复杂查询,数据一致性好
移动端 / 离线使用 SQLite(Room 或 Core Data) 本地存储,无需网络
云端 / 需要同步 Firebase Firestore 或 Supabase 实时同步,客户端直接读写

伪代码(完整流程)

初始化
   - 读取存储文件(JSON 或连接 DB)
   - 检查 structure 是否合法
2. 用户输入
   - 文本内容
   - 作者(可选)
   - 主分类(必选,可用下拉选择或自动检测)
   - 子分类(可选)
   - 标签(可选,逗号分隔)
3. 脚本处理
   - 校验:主分类是否存在,是否不允许重复
   - 分配唯一 ID(UUID 或自增数字)
   - 存入对应分类数组
   - 更新标签倒排索引
4. 存储
   - 写回文件(JSON 全量写)或执行 INSERT(SQL)
5. 输出
   - 成功提示 + 语录 ID
   - 可选:自动生成分类树统计(如:励志类 15条,情感类 8条)

常见面试追问及回答要点

  1. “如何实现模糊搜索?”
    答:在 JSON 方案中遍历所有语录,用 if keyword in quote["text"];在 SQL 中使用 LIKE '%keyword%',更高效的做法是建立倒排索引(如 Elasticsearch),但对于小数据量,简单的字符串匹配足够。

  2. “如果我想支持多级子分类(如 励志 > 奋斗 > 学习)怎么办?”
    答:将分类设计为树形结构,存储时每个节点记录 parent,JSON 方案可使用嵌套字典,SQL 方案使用 parent_id 外键。

  3. “怎么保证标签同义词统一?”
    答:在标签处理函数中做规范映射(如“dream”和“梦想”都归一化到“梦想”),或在添加时提供标签推荐/自动补全。

抱歉,评论功能暂时关闭!