sileod/gramforge

GitHub: sileod/gramforge

gramforge 是一个基于声明式语法的 Python 库,用于高效生成多语言、结构可控的合成数据,特别适用于逻辑推理和程序语言的数据集构建。

Stars: 4 | Forks: 1

# gramforge ⚒️ `gramforge` 是一个 Pythonic 库,用于通过声明式上下文敏感语法(也包括上下文无关语法)进行随机(深度优先)生成,以创建合成数据。 其一个特点是可以并行生成多种语言(例如 tptp 和伪英语)。 使用 gramforge DSL 的 LogicNLI 语法示例: `pip install gramforge` ``` from gramforge import init_grammar, generate def LogicNLI(): ADJECTIVES = ['rich', 'quiet', 'old', 'tall', 'kind', 'brave', 'wise', 'happy', 'strong', 'curious', 'patient', 'funny', 'generous', 'humble'] # (We selected adjectives with no clear semantic interference) NAMES = ['mary', 'paul', 'fred', 'alice', 'john', 'susan', 'lucy'] R = init_grammar(['tptp','eng']) R('start(' + ','.join(['rule']*16) + ',' + ','.join(['fact']*8) + ')', '&\n'.join([f'({i})' for i in range(24)]), '\n'.join([f'{i}' for i in range(24)])) R('hypothesis(person,a)', '1(0)', '0 is 1') for a in ADJECTIVES: R('adj', a) R('adj', f'~{a}', f'not {a}', weight=0.2) R('property(adj,adj)', '(0(?)&1(?))', 'both 0 and 1') R('property(adj,adj)', '(0(?)|1(?))', '0 or 1') R('property(adj,adj)', '(0(?)<~>1(?))', 'either 0 or 1', weight=0.5) R('property(adj)', '0(?)', '0') R('rule(property,property)', '![X]:(0[?←X]=>1[?←X])', 'everyone who is 0 is 1') R('rule(property,property)', '![X]:(0[?←X]<=>1[?←X])', 'everyone who is 0 is 1 and vice versa') for p in NAMES: R('person', p) R('fact(person,property)', '1[?←0]', '0 is 1') R('fact(property)', '?[X]:(0[?←X])', 'someone is 0', weight=0.2) R('rule(fact,fact)', '(0)=>(1)', 'if 0 then 1') R('rule(fact,fact)', '(0)<=>(1)', 'if 0 then 1 and vice versa') return R eng, tptp = "eng","tptp" grammar = LogicNLI() x=generate(grammar) print(x@eng) print(x@tptp) ``` ## 预置语法 我们提供以下预编写的语法: - `tinypy_grammar` 复现 [tinypy](https://github.com/MarwaNair/TinyPy-Generator),一种用于 LLM 训练/评估的 Python 合成玩具语法 - `pygram_grammar` 一种先进的、最先进的 Python 语法,包含有效函数、递归、类型等 - `FOL_grammar` 一种复杂的一阶逻辑(tptp)受控语法,与简化英语对齐 - `simple_english_grammar` 英语的一个子集 - `arith_grammar` 一种简单的算术语法 - `regex_grammar` 一种生成正则表达式的语法 - `dyck_grammar` 嵌套括号语法 示例: ``` from gramforge.grammars import FOL_grammar, tinypy_grammar from gramforge import generate g=tinypy_grammar() x=generate(g) print(x@'py') ``` ## 抽象语法树 生成的表达式(`x.generate`)的行为类似于 anytree 树,完全暴露抽象语法树,有助于调试、可视化或分析生成的示例。 ## 深度约束 生成合成数据需要复杂度管理。gramforge 实现了 min_depth 和 max_depth 约束的高效管理,并通过一个"茂密度"旋钮(默认值=0.7)防止生成的表达式产生仅过度拟合最小深度要求的"尖峰"。 ### gramforge 框架引用: ``` @inproceedings{sileo-2024-scaling, title = "Scaling Synthetic Logical Reasoning Datasets with Context-Sensitive Declarative Grammars", author = "Sileo, Damien", booktitle = "Proceedings of the 2024 Conference on Empirical Methods in Natural Language Processing", month = nov, year = "2024", address = "Miami, Florida, USA", publisher = "Association for Computational Linguistics", url = "https://aclanthology.org/2024.emnlp-main.301/", doi = "10.18653/v1/2024.emnlp-main.301", pages = "5275--5283", } ```
标签:AI, Android, DSL, NLP, Prolog式样, Python, Ruby, TPTP, 上下文敏感文法, 上下文无关文法, 云计算, 人工智能数据, 伪英语, 合成数据, 声明式语法, 多语言生成, 形式语言, 数据结构, 无后门, 深度优先生成, 知识库, 知识表达, 编程示例, 自动化代码审查, 自动推理, 规则引擎, 语义干扰, 语法定义, 软件开发, 逆向工具, 逻辑推理, 逻辑语言, 随机生成