An open, auditable classifier that reads a contract sentence and identifies
its financial obligations — payment terms, renewal pricing, liquidated
damages, liability caps, termination costs, audit rights, payment security.
Every prediction is a lead, not a verdict: the model assists human review; it
does not give legal advice and does not decide anything.
Model details
- Task: multi-label sentence classification over 7 financial-obligation
categories (F1, F3–F8; see the taxonomy).
F2 (late fees & interest) has no training data and is not covered.
- Architecture: TF-IDF (8k features, 1–2 grams) + logistic regression,
one-vs-rest. Small, deterministic, CPU-only, fully reproducible.
- Training data: 541 labeled clauses from CUAD v1 (CC-BY-4.0). No private
or confidential contracts.
- Files:
baseline_tfidf_logreg.joblib (scikit-learn bundle:
vectorizer, classifier, label binarizer).
Evaluation (held-out, 56 CUAD samples)
| Label |
F1 |
| F1 payment terms |
0.83 |
| F3 renewal pricing |
0.80 |
| F4 liquidated damages |
0.86 |
| F5 liability caps |
1.00 |
| F6 termination costs |
0.80 |
| F7 audit rights |
1.00 |
| F8 payment security |
1.00 |
| micro avg |
0.89 |
| macro avg |
0.90 |
Limits
- Eval set is small (56); confidence intervals are wide.
- Train and eval come from the same CUAD distribution — real-world contracts differ.
- F2 (late fees & interest) is not covered.
- Baseline, not product.
Usage
import joblib
bundle = joblib.load("baseline_tfidf_logreg.joblib")
vec, clf, mlb = bundle["vectorizer"], bundle["clf"], bundle["mlb"]
s = ["The Client shall pay $12,500 per month, invoiced monthly."]
print(mlb.inverse_transform(clf.predict(vec.transform(s))))
Training code: github.com/josiahwilson-bit/financial-obligation-model (Apache-2.0).
Live demo: see the linked Space.