gramforge ⚒️
gramforge is a pythonic library for random (depth first) generation with declarative context-sensitive grammars (but also context free grammars) for synthetic data creation.
One particularity is the option to generate in multiple languages in parallel (for example, tptp and pseudo-english).
Example with LogicNLI grammar with the gramforge DSL:
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)
Pre-loaded grammars
We feature pre-written grammars including:
tinypy_grammarreproducing the tinypy, a synthetic toy grammar of python for LLM training/evaluationmesopy_grammarab advanced, state of the art python grammar, with valid functions, recursion, types, etc.FOL_grammara sophisticated controlled grammar for first order logic (tptp) aligned with simplified Englishsimple_english_grammara subset of englisharith_grammara simple grammar for arithmeticsregex_grammara grammar generating regular expressionsdyck_grammarnested parentheses
Example:
from gramforge.grammars import FOL_grammar, tinypy_grammar
from gramforge import generate
g=tinypy_grammar()
x=generate(g)
print(x@'py')
Abstract syntax trees
Generated expressions (x.generate) behave like anytree trees, fully exposing the abstract syntax tree which can be helpful for debugging, visualization or analysis of the generated examples.
Depth constraints
Generating synthetic data requires complexity management. gramforge implements efficient management of min_depth and max_depth constraints, with a "bushiness" knob (default=0.7) preventing the generated expressions from generating "spikes" that just overfit the minimum depth requirement.
Citation for the gramforge framework:
@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",
}
Metadata
Release files for gramforge 1.0.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| gramforge-1.0.14.tar.gz | 52.1 kB | Without provenance | Details for gramforge-1.0.14.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| gramforge-1.0.14-py3-none-any.whl | Python 3 | none | any | Details for gramforge-1.0.14-py3-none-any.whl |
Total release size: 112.0 kB
Release files / gramforge-1.0.14.tar.gz
| Download URL | gramforge-1.0.14.tar.gz |
|---|---|
| Size | 52.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b71c3bf697ad7539456be29ede2c6e450e696a408b16173650130c913fc1e1d6
|
|
BLAKE2b-256 checksum How to use checksums |
236f84ac2eb4ae7853128bd6278d4696fa6a4cc299bf7f14fde94dd319a79b7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.10
|
Release files / gramforge-1.0.14-py3-none-any.whl
| Download URL | gramforge-1.0.14-py3-none-any.whl |
|---|---|
| Size | 59.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4a2faea25b05336237b710946154a02176e9838f708f36fcb0d610325f4d91d1
|
|
BLAKE2b-256 checksum How to use checksums |
0db2c302976fa8341b1e14ae98e5a7e7bfd9bb12f1e23c365d4a3d4cbf20aa75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.10
|
Security for gramforge 1.0.14
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.