gliformer-large-v1 / README.md
Ihor's picture
Update README.md
da62fb8 verified
|
Raw
History Blame Contribute Delete
11 kB
---
language:
- en
library_name: gliformer
pipeline_tag: token-classification
tags:
- gliformer
- deberta
- named-entity-recognition
- text-classification
- relation-extraction
- structured-extraction
- feature-extraction
- document-understanding
license: apache-2.0
---
# GLiFormer Large v1
**One encoder for PDF layout processing, entity recognition, classification, relation extraction, structured records, and text embeddings.**
![GLiFormer supported tasks](gliformer-tasks.gif)
`knowledgator/gliformer-large-v1` is the 575.6M-parameter large release of
[GLiFormer](https://github.com/Knowledgator/GLiFormer). It accepts task labels and
extraction schemas at inference time, with task heads sharing a DeBERTa encoder.
The layout-aware architecture supports text and document-layout inputs; the usage
examples and quality results below focus on text tasks.
## Usage
```bash
pip install gliformer -U
```
Or install the GLiFormer framework in a Python 3.10+ environment from the source:
```bash
git clone https://github.com/Knowledgator/GLiFormer.git
cd GLiFormer
pip install -e .
```
Optional CUDA attention kernels are available with `pip install -e ".[flash]"`.
CPU inference uses eager attention. The following examples reuse `model`:
```python
import torch
from gliformer import GLiFormer
model = GLiFormer.from_pretrained(
"knowledgator/gliformer-large-v1",
load_tokenizer=True,
)
model = model.to("cuda" if torch.cuda.is_available() else "cpu").eval()
```
For a local copy, replace the model ID with the checkpoint directory.
### Named entity recognition
Specify the entity types at inference time:
```python
text = "Alice works at Acme in London."
entities = model.predict_entities(
text,
["person", "organization", "location"],
threshold=0.5,
)
for entity in entities:
print(entity["text"], entity["label"], entity["score"])
```
Each entity includes `text`, `label`, `start`, `end`, and `score`.
Offsets are character positions with an exclusive `end`.
Pass a list of texts and `batch_size=8` for batched extraction.
### Text classification
```python
predictions = model.classify(
"The new search feature is fast and easy to use.",
["positive", "negative", "neutral"],
threshold=0.5,
)
print(predictions) # Label dictionaries containing class_name and score.
```
Named groups are also supported, for example
`{"sentiment": ["positive", "negative"], "topic": ["product", "support"]}`.
### Joint relation extraction
Supply entity and relation labels together to use this checkpoint's joint relation head:
```python
results = model.inference(
"Alice works at Acme.",
joint_relations={
"employment": {
"entities": ["person", "organization"],
"relations": ["works_at"],
}
},
threshold=0.5,
)
for relation in results["joint_relex"][0]:
print(relation["head"]["text"], relation["relation"], relation["tail"]["text"])
```
`inference` returns a dictionary of task outputs, each containing one result per input text.
The separate `predict_relations` convenience method requires an open relation head;
use `joint_relations` for this model.
### Structured extraction
Extract records directly into a Python dictionary:
```python
records = model.structure(
"Alice works at Acme.",
{"employee": ["name", "company"]},
)
print(records)
# {'employee': [{'name': 'Alice', 'company': 'Acme'}]}
```
Nested Pydantic schemas support multilevel records:
```python
from pydantic import BaseModel
class Employee(BaseModel):
name: str
role: str
class Department(BaseModel):
name: str
employees: list[Employee]
class Company(BaseModel):
name: str
departments: list[Department]
records = model.structure(
"At Acme, Engineering includes Alice, a software engineer, and Bob, "
"a designer. Sales includes Carol, an account manager.",
{"company": Company},
validate_output=True,
)
print(records)
```
The decoder assembles source-grounded fields and parent–child relationships into nested
records. Predictions depend on the schema, input, and thresholds; Pydantic validation
checks the output schema, not factual correctness.
### Multiple tasks in one call
```python
results = model.inference(
"Alice joined Acme as a software engineer.",
entities=["person", "organization"],
classes=["business", "sports", "technology"],
structures={"employee": ["name", "company"]},
)
print(results["ner"][0])
print(results["classification"][0])
print(results["structuring"][0])
```
### Text embeddings
```python
import torch.nn.functional as F
embeddings = model.embed_text([
"A scientist works in a laboratory.",
"A researcher conducts an experiment.",
])
print(embeddings.shape) # torch.Size([2, 1024])
print(F.cosine_similarity(embeddings[0:1], embeddings[1:2]).item())
```
## Reported evaluation results
| Task | Metric | Score |
| --- | --- | ---: |
| NER, 26 datasets / 131,156 examples | Mean dataset strict entity F1 | 50.91 |
| CrossNER, 5 domains / 2,505 examples | Mean domain strict entity F1 | 64.35 |
| Classification, 13 datasets / 79,828 examples | Mean dataset macro-F1 | 75.03 |
| Multilevel structuring, 500 examples | Order-free, boundary-tolerant JSON F1 | 91.10 |
Dataset means weight datasets equally. NER requires both the entity span and type
to match. Classification macro-F1 averages class F1 scores within each dataset.
Structuring compares flattened JSON value paths after aligning records without
requiring their original order and allowing the evaluator's limited boundary repairs;
it is not exact JSON match. The manuscript corrects the structuring evaluation size
to 500; historical notes contain obsolete bucket counts totaling 300.
### Named entity recognition
| Dataset | Examples | Precision | Recall | F1 |
| --- | ---: | ---: | ---: | ---: |
| ACE 2004 | 812 | 51.67 | 29.00 | 37.15 |
| ACE 2005 | 1,060 | 44.88 | 22.42 | 29.90 |
| AnatEM | 3,830 | 26.18 | 31.74 | 28.70 |
| bc2gm | 5,000 | 45.46 | 51.53 | 48.30 |
| bc4chemd | 26,364 | 40.74 | 67.58 | 50.84 |
| bc5cdr | 4,797 | 61.92 | 72.05 | 66.60 |
| Broad Tweet Corpus | 2,000 | 55.55 | 70.99 | 62.33 |
| CoNLL 2003 | 3,453 | 58.96 | 72.82 | 65.16 |
| CrossNER_AI | 431 | 51.69 | 51.83 | 51.76 |
| CrossNER_literature | 416 | 63.11 | 60.10 | 61.57 |
| CrossNER_music | 465 | 67.48 | 66.17 | 66.82 |
| CrossNER_politics | 650 | 70.46 | 72.52 | 71.48 |
| CrossNER_science | 543 | 71.63 | 68.69 | 70.13 |
| FabNER | 2,064 | 27.17 | 18.47 | 21.99 |
| FindVehicle | 20,777 | 42.11 | 51.21 | 46.21 |
| GENIA_NER | 1,854 | 48.42 | 57.23 | 52.46 |
| HarveyNER | 1,303 | 9.95 | 22.54 | 13.81 |
| mit-movie | 2,442 | 63.10 | 52.98 | 57.60 |
| mit-restaurant | 1,520 | 38.88 | 30.25 | 34.03 |
| MultiNERD | 10,000 | 54.96 | 91.91 | 68.79 |
| ncbi | 940 | 47.63 | 64.05 | 54.63 |
| Ontonotes | 8,262 | 28.20 | 42.18 | 33.80 |
| PolyglotNER | 10,000 | 35.52 | 70.85 | 47.31 |
| TweetNER7 | 576 | 43.46 | 48.62 | 45.90 |
| WikiANN en | 10,000 | 54.85 | 57.74 | 56.26 |
| WikiNeural | 11,597 | 73.93 | 87.53 | 80.16 |
### Text classification
| Dataset | Examples | Accuracy | Macro-F1 | Weighted F1 |
| --- | ---: | ---: | ---: | ---: |
| SetFit/CR | 376 | 91.22 | 90.45 | 91.20 |
| SetFit/sst2 | 1,821 | 92.97 | 92.97 | 92.97 |
| SetFit/sst5 | 2,210 | 44.34 | 40.33 | 43.39 |
| stanfordnlp/imdb | 25,000 | 93.94 | 93.93 | 93.93 |
| SetFit/20_newsgroups | 7,532 | 57.94 | 57.18 | 58.70 |
| SetFit/enron_spam | 2,000 | 97.95 | 97.95 | 97.95 |
| AmazonScience/massive | 2,974 | 71.32 | 69.98 | 71.93 |
| PolyAI/banking77 | 3,080 | 70.97 | 70.55 | 70.55 |
| mteb/financial_phrasebank | 1,129 | 97.25 | 96.77 | 97.24 |
| SetFit/ag_news | 7,600 | 82.07 | 81.53 | 81.53 |
| dair-ai/emotion | 2,000 | 54.75 | 48.07 | 55.59 |
| MoritzLaurer/cap_sotu | 23,040 | 51.74 | 49.00 | 51.15 |
| cornell-movie-review-data/rotten_tomatoes | 1,066 | 86.68 | 86.68 | 86.68 |
Micro-F1 equals accuracy in these single-label runs. Reported prediction coverage
is 97.15% for 20 Newsgroups and 100% for the other datasets. Summary scores retain
the original reports' precision; means of the rounded rows can differ by 0.01.
### Joint relation extraction
These runs use predicted entities. Gold counts are relation instances, not documents.
Base and large were evaluated on different-sized subsets, so their relation scores
are not a controlled comparison on identical examples.
| Dataset | Gold relations | Precision | Recall | Micro-F1 | Macro-F1 |
| --- | ---: | ---: | ---: | ---: | ---: |
| DocRED | 6,003 | 29.90 | 8.13 | 12.78 | 3.64 |
| CrossRE | 1,926 | 22.76 | 8.72 | 12.61 | 11.72 |
| FewRel | 500 | 21.86 | 26.80 | 24.08 | 21.40 |
| CoNLL04 zero-shot | 677 | 38.47 | 33.53 | 35.83 | 35.32 |
CoNLL04 zero-shot typed F1, which also checks endpoint entity types, is 34.73%.
### Multilevel structuring
| Gold JSON depth | Order-free, boundary-tolerant F1 |
| --- | ---: |
| 3 | 89.94 |
| 4 | 95.11 |
| 5 | 91.69 |
| 6+ | 92.80 |
### Evaluation provenance and reproduction
You can find more information on the evaluation methodology here: https://www.knowledgator.com/research
Evaluation entry points are in
[`gliformer_eval`](https://github.com/Knowledgator/GLiFormer/tree/main/gliformer_eval).
For example, after preparing the CrossNER files, run from the framework repository:
```bash
python gliformer_eval/eval_ner.py \
--model knowledgator/gliformer-large-v1 \
--data data/NER \
--datasets CrossNER_AI CrossNER_literature CrossNER_music CrossNER_politics CrossNER_science \
--output eval_results/gliformer_large_v1_ner.json
```
Each dataset directory must contain `labels.json` and `test.json`. The other task
entry points are `eval_classification.py`, `eval_relex.py`, and `eval_structuring.py`;
use `--help` for data paths and inference settings. Reproduction requires matching
the original data subsets, schema labels, thresholds, and decoding settings.
## Training and intended use
The checkpoint uses the backbone listed above with supervised task heads for
information extraction, classification, structuring, and embeddings. See the
manuscript for the documented multitask training mixtures. Full checkpoint-specific
training provenance is not recorded in the saved evaluation reports.
Use this model for extracting labeled mentions, candidate classes, relations, and
structured records from text, and for producing text similarity vectors. The available
results cover English tasks. Quality on other languages, document-layout inputs,
and embedding benchmarks is not established by the tables above.
## Limitations
- Labels, schema wording, domain, input length, and thresholds affect predictions.
- Extraction can omit information, choose incorrect spans, or attach records to the wrong parent.
- Reported NER transfer groups do not establish that every evaluated domain was absent from training.
- Fixed record anchors and the configured span width constrain extraction capacity.
- This checkpoint has no dedicated vision, audio, or open relation head.