From 92f9903307db241bb3eb2c2d175680847ff6d2bd Mon Sep 17 00:00:00 2001 From: david-ajax Date: Thu, 6 Nov 2025 23:47:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E4=B8=8E=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/widgets/recognition.py | 9 +++++++ src/heurams/kernel/particles/loader.py | 2 +- src/heurams/kernel/particles/nucleon.py | 4 +++- src/heurams/kernel/particles/orbital.py | 25 +++++++++++--------- src/heurams/kernel/puzzles/cloze.py | 6 ++--- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index c661549..faaa576 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -22,6 +22,7 @@ import re import random import copy from .base_puzzle_widget import BasePuzzleWidget +from heurams.context import config_var from .. import shim class Recognition(BasePuzzleWidget): @@ -53,7 +54,15 @@ class Recognition(BasePuzzleWidget): f"[b][b]{i.replace('/', ' ')}[/][/]", id="sentence" + str(hash(i)), ) + # 处理orbital/展示配置 + for i in + # eval 环境设置 + nucleon = self.atom.register['nucleon'] + default = config_var.get()["puzzles"] + metadata = nucleon.metadata + + for i in self.atom.register["orbital"] ["testdata"]["additional_inf"]: if self.atom.register['nucleon'][i]: if isinstance(self.atom.register['nucleon'][i], list): diff --git a/src/heurams/kernel/particles/loader.py b/src/heurams/kernel/particles/loader.py index 126f24f..63ec73c 100644 --- a/src/heurams/kernel/particles/loader.py +++ b/src/heurams/kernel/particles/loader.py @@ -28,7 +28,7 @@ def load_nucleon(path: pathlib.Path, fmt = "toml"): for item, attr in nested_data.items(): if item == "__metadata__": continue - lst.append((Nucleon(hasher.hash(item), attr), nested_data["__metadata__"]["orbital"])) + lst.append((Nucleon(hasher.hash(item), attr, nested_data['__metadata__']), nested_data["__metadata__"]["orbital"])) return lst def load_electron(path: pathlib.Path, fmt = "json") -> dict: diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index f6e7f73..1589df2 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,13 +1,15 @@ class Nucleon: """原子核: 材料元数据""" - def __init__(self, ident: str, payload: dict): + def __init__(self, ident: str, payload: dict, metadata: dict = {}): """初始化原子核 (记忆内容) Args: ident: 唯一标识符 payload: 记忆内容信息 + metadata: 可选元数据信息 """ + self.metadata = metadata self.payload = payload self.ident = ident diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py index 99ca021..2727449 100644 --- a/src/heurams/kernel/particles/orbital.py +++ b/src/heurams/kernel/particles/orbital.py @@ -1,20 +1,23 @@ from typing import TypedDict -class Orbital(TypedDict): +class OrbitalSchedule(TypedDict): quick_review: list recognition: list final_review: list - puzzle_config: dict - finished: None - unsure: None + +class Orbital(TypedDict): + schedule: OrbitalSchedule + puzzles: dict + """一份示例 -["__metadata__.orbital"] # 内置的推荐学习方案 -quick_review = [["cloze", 1], ["mcq", 0.5], ["recognition", 1]] -recognition = [["recognition", 1]] -final_review = [["cloze", 0.7], ["mcq", 0.7], ["recognition", 1]] +["__metadata__.orbital.puzzles"] # 谜题定义 +"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:nucleon['content']", secondery = ["eval:nucleon['keyword_note']", "eval:nucleon['note']"], top_dim = ["eval:nucleon['translation']"] } +"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:nucleon['content']", jammer = "eval:nucleon['keyword_note']", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:nucleon['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} -["__metadata__.orbital.puzzle_config"] -cloze = { from = "content"} -mcq = { from = "keyword_note" } +["__metadata__.orbital.schedule"] # 内置的推荐学习方案 +quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["recognition", "1.0"]] +recognition = [["recognition", "1.0"]] +final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["recognition", "1.0"]] """ \ No newline at end of file diff --git a/src/heurams/kernel/puzzles/cloze.py b/src/heurams/kernel/puzzles/cloze.py index d780c07..804b110 100644 --- a/src/heurams/kernel/puzzles/cloze.py +++ b/src/heurams/kernel/puzzles/cloze.py @@ -5,11 +5,11 @@ class ClozePuzzle(BasePuzzle): """填空题谜题生成器 Args: - text: 原始字符串(需要 "/" 分割句子, 末尾应有 "/") + text: 原始字符串(需要 delimiter 分割句子, 末尾应有 delimiter) min_denominator: 最小概率倒数(如占所有可生成填空数的 1/7 中的 7, 若期望值小于 1, 则取 1) """ - def __init__(self, text: str, min_denominator: int): + def __init__(self, text: str, delimiter: str = "/", min_denominator: int): self.text = text self.min_denominator = min_denominator self.wording = "填空题 - 尚未刷新谜题" @@ -17,7 +17,7 @@ class ClozePuzzle(BasePuzzle): def refresh(self): # 刷新谜题 placeholder = "___SLASH___" - tmp_text = self.text.replace("/", placeholder) + tmp_text = self.text.replace(delimiter, placeholder) words = tmp_text.split(placeholder) if not words: return