|
--- |
|
license: apache-2.0 |
|
datasets: |
|
- Universal-NER/Pile-NER-type |
|
- numind/NuNER |
|
language: |
|
- en |
|
metrics: |
|
- f1 |
|
library_name: transformers |
|
pipeline_tag: text2text-generation |
|
--- |
|
|
|
<p align="center"><h2 align="center">Rethinking Negative Instances for Generative Named Entity Recognition</h2></p> |
|
|
|
# Model Card for GNER-T5-large |
|
|
|
<!-- Provide a quick summary of what the model is/does. --> |
|
|
|
We introduce GNER, a **G**enerative **N**amed **E**ntity **R**ecognition framework, which demonstrates enhanced zero-shot capabilities across unseen entity domains. Experiments on two representative generative models, i.e., LLaMA and Flan-T5, show that the integration of negative instances into the training process yields substantial performance enhancements. The resulting models, GNER-LLaMA and GNER-T5, outperform state-of-the-art (SoTA) approaches by a large margin, achieving improvements of 8 and 11 points in $F_1$ score, respectively. Code and models are publicly available. |
|
|
|
* π» Code: [https://github.com/yyDing1/GNER/](https://github.com/yyDing1/GNER/) |
|
* π Paper: [Rethinking Negative Instances for Generative Named Entity Recognition](https://arxiv.org/abs/2402.16602) |
|
* πΎ Models in the π€ HuggingFace Hub: [GNER-Models](https://huggingface.co/collections/dyyyyyyyy/gner-65dda2cb96c6e35c814dea56) |
|
* π§ͺ Reproduction Materials: [Reproduction Materials](https://drive.google.com/drive/folders/1m2FqDgItEbSoeUVo-i18AwMvBcNkZD46?usp=drive_link) |
|
* π¨ Example Jupyter Notebooks: [GNER Notebook](https://github.com/yyDing1/GNER/blob/main/notebook.ipynb) |
|
|
|
<p align="center"> |
|
<img src="https://github.com/yyDing1/GNER/raw/main/assets/zero_shot_results.png"> |
|
</p> |
|
|
|
## PreTrained Models |
|
|
|
We release five GNER models based on LLaMA (7B) and Flan-T5 (base, large, xl and xxl). |
|
|
|
| Model | # Params | Zero-shot Average $F_1$ | Supervised Average $F_1$ | π€ HuggingFace<br />Download Link | |
|
| ---------------- | -------: | :----------------------: | :-----------------------: | :-------------------------------------------------: | |
|
| GNER-LLaMA | 7B | 66.1 | 86.09 | [link](https://huggingface.co/dyyyyyyyy/GNER-LLaMA-7B) | |
|
| GNER-T5-base | 248M | 59.5 | 83.21 | [link](https://huggingface.co/dyyyyyyyy/GNER-T5-base) | |
|
| GNER-T5-large | 783M | 63.5 | 85.45 | [link](https://huggingface.co/dyyyyyyyy/GNER-T5-large) | |
|
| GNER-T5-xl | 3B | 66.1 | 85.94 | [link](https://huggingface.co/dyyyyyyyy/GNER-T5-xl) | |
|
| GNER-T5-xxl | 11B | 69.1 | 86.15 | [link](https://huggingface.co/dyyyyyyyy/GNER-T5-xxl) | |
|
|
|
## Demo usage |
|
|
|
You should install the dependencies: |
|
```bash |
|
pip install torch datasets deepspeed accelerate transformers protobuf |
|
``` |
|
|
|
Please check out [Example Jupyter Notebooks](https://github.com/yyDing1/GNER/blob/main/notebook.ipynb) for guidance on utilizing GNER models. |
|
|
|
A simple inference example is as follows: |
|
|
|
Below is an example using `GNER-T5` |
|
```python |
|
>>> import torch |
|
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM |
|
>>> tokenizer = AutoTokenizer.from_pretrained("dyyyyyyyy/GNER-T5-xxl") |
|
>>> model = AutoModelForSeq2SeqLM.from_pretrained("dyyyyyyyy/GNER-T5-xxl", torch_dtype=torch.bfloat16).cuda() |
|
>>> model = model.eval() |
|
>>> instruction_template = "Please analyze the sentence provided, identifying the type of entity for each word on a token-by-token basis.\nOutput format is: word_1(label_1), word_2(label_2), ...\nWe'll use the BIO-format to label the entities, where:\n1. B- (Begin) indicates the start of a named entity.\n2. I- (Inside) is used for words within a named entity but are not the first word.\n3. O (Outside) denotes words that are not part of a named entity.\n" |
|
>>> sentence = "did george clooney make a musical in the 1980s" |
|
>>> entity_labels = ["genre", "rating", "review", "plot", "song", "average ratings", "director", "character", "trailer", "year", "actor", "title"] |
|
>>> instruction = f"{instruction_template}\nUse the specific entity tags: {', '.join(entity_labels)} and O.\nSentence: {sentence}" |
|
>>> inputs = tokenizer(instruction, return_tensors="pt").to("cuda") |
|
>>> outputs = model.generate(**inputs, max_new_tokens=640) |
|
>>> response = tokenizer.decode(outputs[0], skip_special_tokens=True) |
|
>>> print(response) |
|
"did(O) george(B-actor) clooney(I-actor) make(O) a(O) musical(B-genre) in(O) the(O) 1980s(B-year)" |
|
``` |
|
|
|
## Citation |
|
|
|
```bibtex |
|
@misc{ding2024rethinking, |
|
title={Rethinking Negative Instances for Generative Named Entity Recognition}, |
|
author={Yuyang Ding and Juntao Li and Pinzheng Wang and Zecheng Tang and Bowen Yan and Min Zhang}, |
|
year={2024}, |
|
eprint={2402.16602}, |
|
archivePrefix={arXiv}, |
|
primaryClass={cs.CL} |
|
} |
|
``` |