Human and machine generated text often suffer from grammatical and/or typographical errors. It can be spelling, punctuation, grammatical or word choice errors. Gramformer is a library that exposes 3 seperate interfaces to a family of algorithms to detect, highlight and correct grammar errors. To make sure the corrections and highlights recommended are of high quality, it comes with a quality estimator. You can use Gramformer in one or more areas mentioned under the "use-cases" section below or any other usecase as you see fit. Gramformer stands on the shoulders of giants, it combines some of the top notch researches in grammar correction. Note: It works at sentence levels and has been trained on 128 length sentences, so not (yet) suitable for long prose or paragraphs (stay tuned for upcoming releases)
- Usecases for Gramformer
- Installation
- Quick Start
- Models
- Dataset
- Note on commercial uses and release versions
- Benchmark
- References
- Citation
Area 1: Post-processing machine generated text
Machine-Language generation is becoming mainstream, so will post-processing machine generated text.
- Conditioned Text generation output(Text2Text generation).
- NMT: Machine Translated output.
- ASR or STT: Speech to text output.
- HTR: Handwritten text recognition output.
- Text Summarisation output.
- Image caption output.
- Data or key to Text output.
- Paraphrase generation output.
- Controlled Text generation output(Text generation with PPLM) [TBD].
- Free-form text generation output(Text generation)[TBD].
Area 2:Human-In-The-Loop (HITL) text
- Most Supervised NLU (Chatbots and Conversational) systems need humans/experts to enter or edit text that needs to be grammatically correct otherwise the quality of HITL data can degrade the model over a period of time
Area 3:Assisted writing for humans
- Integrating into custom Text editors of your Apps. (A Poor man's grammarly, if you will)
Area 4:Custom Platform integration
As of today grammatical safety nets for authoring social contents (Post or Comments) or text in messaging platforms is very little (word level correction) or non-existent.The onus is on the author to install tools like grammarly to proof read.
- Messaging platforms and Social platforms can highlight / correct grammtical errors automatically without altering the meaning or intent.
pip install git+https://github.com/PrithivirajDamodaran/Gramformer.git
from gramformer import Gramformer
import torch
def set_seed(seed):
torch.manual_seed(seed)
if torch.cuda.is_available():
torch.cuda.manual_seed_all(seed)
set_seed(1212)
gf = Gramformer(models = 2, use_gpu=False) # 0=detector, 1=highlighter, 2=corrector, 3=all
influent_sentences = [
"Matt like fish",
"the collection of letters was original used by the ancient Romans",
"We enjoys horror movies",
"Anna and Mike is going skiing",
"I walk to the store and I bought milk",
"We all eat the fish and then made dessert",
"I will eat fish for dinner and drank milk",
"what be the reason for everyone leave the company",
]
for influent_sentence in influent_sentences:
corrected_sentence = gf.correct(influent_sentence)
print("[Input] ", influent_sentence)
print("[Correction] ",corrected_sentence[0])
print("-" *100)
[Input] Matt like fish
[Correction] Matt likes fish
----------------------------------------------------------------------------------------------------
[Input] the collection of letters was original used by the ancient Romans
[Correction] The collection of letters was originally used by the ancient Romans.
----------------------------------------------------------------------------------------------------
[Input] We enjoys horror movies
[Correction] We enjoy horror movies
----------------------------------------------------------------------------------------------------
[Input] Anna and Mike is going skiing
[Correction] Anna and Mike are going skiing
----------------------------------------------------------------------------------------------------
[Input] I walk to the store and I bought milk
[Correction] I walked to the store and bought milk.
----------------------------------------------------------------------------------------------------
[Input] We all eat the fish and then made dessert
[Correction] We all ate the fish and then made dessert
----------------------------------------------------------------------------------------------------
[Input] I will eat fish for dinner and drank milk
[Correction] I'll eat fish for dinner and drink milk.
----------------------------------------------------------------------------------------------------
[Input] what be the reason for everyone leave the company
[Correction] what can be the reason for everyone to leave the company.
----------------------------------------------------------------------------------------------------
While Gramformer aims to post-process outputs from the generative models, Gramformer itself is a generative model. So the question arises, who will post-process the Gramformer outputs ? (I know, very meta :-)). In general all generative models have the tendency to generate spurious text sometimes, which we cannot control. So to make sure the gramformer grammar corrections (and highlights) are as accurate as possible, A quality estimator (QE) will be added. It can estimate a error correction quality score and use that as a filter on Top-N candidates to return only the best based on the score.
from gramformer import Gramformer
gf = Gramformer(models = 2, use_gpu=False) # 0=detector, 1=highlighter, 2=corrector, 3=all
corrected_sentence = gf.correct(<your input sentence>, filter_by_quality=True, max_candidates=3)
from gramformer import Gramformer
gf = Gramformer(models = 1, use_gpu=False) # 0=detector, 1=highlighter, 2=corrector, 3=all
edits = gf.get_edits("Norton like to fishing ")
[('OTHER', 'like', 1, 2, 'likes', 1, 2), ('PREP', 'to', 2, 3, '', 2, 2), ('PUNCT', '', 4, 4, '.', 3, 4)]
from gramformer import Gramformer
gf = Gramformer(models = 1, use_gpu=False) # 0=detector, 1=highlighter, 2=corrector, 3=all
highlighted_sentence = gf.highlight(<your input sentence>)
[Input] Norton like fish
[Highlight] Norton <c type=OTHER edit=likes>like</c> <d type=PREP edit=''>to</d> <a type=PUNCT edit=.>fishing</a>
from gramformer import Gramformer
gf = Gramformer(models = 0, use_gpu=False) # 0=detector, 1=highlighter, 2=corrector, 3=all
grammar_fluency_score = gf.detect(<your input sentence>)
Model | Type | Return | status |
---|---|---|---|
prithivida/grammar_error_detector | Classifier | Label | WIP (Reuse prithivida/parrot_fluency_on_BERT ? but I would'd say you wait :-)) |
Seq2Seq | Grammar errors enclosed in <e> and </e> |
||
Seq2Seq | The corrected sentence | Beta / Pre-release (Not available anymore) | |
prithivida/grammar_error_correcter_v1 | Seq2Seq | The corrected sentence | Stable |
- First idea is to generate the dataset using the techniques mentioned in the first paper highlighted in reference section. You can use the technique on anyone of the publicy available wikipedia edits datasets. Write some rules to filter only the grammatical edits, do some cleanup and thats it Bob's your uncle :-).
- Second and possibly very complicated and $$$ way to get some 200M synthetic sentences. This is based on the last paper under references section. Not recommended but by all means knock yourself out if you are interested :-) (Update: I got my hands on all the 200M of them) - Available under CC-BY-4.0 License
- Third source is to repurpose the GEC Task data
- Fourth source is from the paper "Parallel Iterative Edit Models for Local Sequence Transduction" (EMNLP-IJCNLP 2019) - Available under MIT License
- For the beta / pre-release experiments, I generated error edit pairs from 1st source and on top of that used W&I+LOCNESS from the 3rd source to filter the pairs with grammatical edits only. W&I+LOCNESS was used to harvest different patterns of grammar errors and is available as a Huggingface dataset.
- I ended up with ~1M records and after some heurtistics based filtering amounted to ~1/2M records.
- [Update] In the stable release I am using slices of data from sources 1, 2 and 4 listed above. Because sources 2 and 4 have large volume/variety and doesn't need expensive filtering process like in the case of source 1. (The stable model is the one in the above table with a suffix v1).
- In the stable release the wiki edit pairs from source 1 are filtered using the ERRANT tool. The source sentences that yielded a noop on the ERRANT output i.e. the m2 format are filtered out.
- Any releases <= v1.0 is NOT intended for any commercial usage.
- Stable releases > v1.0 and current release is v1.2
TBD (I will benchmark grammformer models against the following publicy available models: salesken/grammar_correction, Grammarly GECTOR and flexudy/t5-small-wav2vec2-grammar-fixer shortly.
- Corpora Generation for Grammatical Error Correction
- Improving Grammatical Error Correction with Machine Translation Pairs
- Improving Grammatical Error Correction Models with Purpose-Built Adversarial Examples
- MaskGEC: Improving Neural Grammatical Error Correction via Dynamic Masking
- Synthetic Data Generation for Grammatical Error Correction with Tagged Corruption Models
- Grammatical Error Detection and Correction Using Tagger Disagreement
TBD