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, 上下文敏感文法, 上下文无关文法, 云计算, 人工智能数据, 伪英语, 合成数据, 声明式语法, 多语言生成, 形式语言, 数据结构, 无后门, 深度优先生成, 知识库, 知识表达, 编程示例, 自动化代码审查, 自动推理, 规则引擎, 语义干扰, 语法定义, 软件开发, 逆向工具, 逻辑推理, 逻辑语言, 随机生成