Release 0.12 is out! This release greatly simplifies model usage for our users, includes our first entity linking model, adds support for the Ukrainian language, adds easy-to-use multitask learning, and many more features, improvements and bug fixes!
New Features Simplify Flair model usage #3067You can now load any Flair model through its parent class. Since most models inherit from Classifier
, you can load and run multiple different models with exactly the same code. So, to run three different taggers for sentiment, entities and frames, do:
from flair.data import Sentence from flair.nn import Classifier # load three taggers to tag entities, frames and sentiment tagger_1 = Classifier.load('ner') tagger_2 = Classifier.load('frame') tagger_3 = Classifier.load('sentiment') # example sentence sentence = Sentence('Dirk celebrated in Essen') # predict with all three models tagger_1.predict(sentence) tagger_2.predict(sentence) tagger_3.predict(sentence) # print all predictions for label in sentence.get_labels(): print(label)
With this change, users no longer need to know which model classes implement which model. For more advanced users who do know this, the regular way for loading a model still works:
sentiment_tagger = TextClassifier.load('sentiment')Entity Linking (BETA)
As of Flair 0.12 we ship an experimental entity linker trained on the Zelda dataset. The linker not only tags entities, but also attempts to link each entity to the corresponding Wikipedia URL if one exists.
To illustrate, let's use a short example text with two mentions of "Barcelona". The first refers to the football club "FC Barcelona", the second to the city "Barcelona".
from flair.nn import Classifier from flair.data import Sentence # load the model tagger = Classifier.load('linker') # make a sentence sentence = Sentence('Bayern played against Barcelona. The match took place in Barcelona.') # predict NER tags tagger.predict(sentence) # print sentence with predicted tags print(sentence)
This should print:
Sentence[12]: "Bayern played against Barcelona. The match took place in Barcelona." → ["Bayern"/FC_Bayern_Munich, "Barcelona"/FC_Barcelona, "Barcelona"/Barcelona]
As we can see, the linker can resolve what the two mentions of "Barcelona" refer to:
Additionally, the mention "Bayern" is linked to "FC_Bayern_Munich", telling us that here the football club is meant.
Entity linking support includes:
This version adds support for Ukrainian taggers, embeddings and datasets. For instance, to do NER and POS tagging of a Ukrainian sentence, do:
# Load Ukrainian NER and POS taggers from flair.models import SequenceTagger ner_tagger = SequenceTagger.load('ner-ukrainian') pos_tagger = SequenceTagger.load('pos-ukrainian') # Tag a sentence from flair.data import Sentence sentence = Sentence("Сьогодні в Знам’янці проживають нащадки поета — родина Шкоди.") ner_tagger.predict(sentence) pos_tagger.predict(sentence) print(sentence) # ”Сьогодні в Знам’янці проживають нащадки поета — родина Шкоди." → # [“Сьогодні"/ADV, "в"/ADP, "Знам’янці"/LOC, "Знам’янці"/PROPN, "проживають”/VERB, "нащадки"/NOUN, "поета"/NOUN, "—"/PUNCT, "родина"/NOUN, "Шкоди”/PERS, "Шкоди"/PROPN, "."/PUNCT]Multitask Learning (#2910 #3085 #3101)
We add support for multitask learning in Flair (closes #2508 and closes #1260) with hopefully a simple syntax to define multiple tasks that share parts of the model.
The most common part to share is the transformer, which you might want to fine-tune across several tasks. Instantiate a transformer embedding and pass it to two separate models that you instantiate as before:
# --- Embeddings that are shared by both models --- # shared_embedding = TransformerDocumentEmbeddings("distilbert-base-uncased", fine_tune=True) # --- Task 1: Sentiment Analysis (5-class) --- # corpus_1 = SENTEVAL_SST_GRANULAR() model_1 = TextClassifier(shared_embedding, label_dictionary=corpus_1.make_label_dictionary("class"), label_type="class") # -- Task 2: Binary Sentiment Analysis on Customer Reviews -- # corpus_2 = SENTEVAL_CR() model_2 = TextClassifier(shared_embedding, label_dictionary=corpus_2.make_label_dictionary("sentiment"), label_type="sentiment", ) # -- Define mapping (which tagger should train on which model) -- # multitask_model, multicorpus = make_multitask_model_and_corpus( [ (model_1, corpus_1), (model_2, corpus_2), ] ) # -- Create model trainer and train -- # trainer = ModelTrainer(multitask_model, multicorpus) trainer.fine_tune(f"resources/taggers/multitask_test")
The mapping part here defines which tagger should be trained on which corpus. By calling make_multitask_model_and_corpus
with a mapping, you get a corpus and model object that you can train as before.
We improve our FLERT model by now explicitly marking up context boundaries using a new [FLERT]
special token in our transformer embeddings. Our experiments show that the context marker leads to improved NER results:
[SEP]
91.38 +- 0.18 [FLERT]
91.56 +- 0.17 xlm-roberta-large none 93.73 +- 0.2 [SEP]
93.76 +- 0.13 [FLERT]
93.92 +- 0.14
In the table, none is the approach used in previous Flair versions. [SEP]
means using the standard separator symbol as context delimiter. [FLERT]
means using a new dedicated special token.
As [FLERT]
performs best in our experiments, the [FLERT]
context marker is now activated by default.
More details: Assume the current sentence is Peter Blackburn
and the previous sentence ends with to boycott British lamb .
, while the next sentence starts with BRUSSELS 1996-08-22 The European Commission
.
In this case,
use_context_separator=False
, the embedding is produced from this string: to boycott British lamb . Peter Blackburn BRUSSELS 1996-08-22 The European Commission
use_context_separator=True
, the embedding is produced from this string to boycott British lamb . [FLERT] Peter Blackburn [FLERT] BRUSSELS 1996-08-22 The European Commission
We integrate the transformer-smaller-training-vocab
library into the ModelTrainer
. With it, you can reduce the size of transformer models when training and evaluating models on specific datasets. This leads to faster training times and a smaller memory footprint. Documentation on this new feature will be added soon!
We now include BETA support a new type of relation extraction model that leads to much higher accuracies than our vanilla relation extraction, but increases computational costs. Documentation for this will be added as we iterate on the model.
ONNX compatible models #2640 #2643 #3041 #3075This release continues the journey on making our models more ONNX compatible.
Other featuresexclude_labels
parameter to trainer.train #2724 (already in flair 0.11.3)super().__setstate__()
in Embeddings #3057RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4