GP-VAC Tagger (en_gp_vac_tagger)
GP-VAC Tagger is a spaCy pipeline that automatically identifies verb-argument constructions (VACs) in English text. Its label scheme covers 85 verb patterns from Grammar Patterns 1: Verbs (Francis, Hunston, & Manning, 1996), and it was trained on both native-speaker and L2 learner English so that it can be used for learner corpus research.
Each VAC label is attached to the verb token that heads the pattern, as a single-token entity (doc.ents / token.ent_type_). Because the pipeline also keeps spaCy's standard components (from en_core_web_trf), the same Doc gives you lemmas, POS tags, and dependency parses as well.
| Developed by | Kohei Fukuda |
| Model type | spaCy v3 pipeline; transition-based NER on a fine-tuned RoBERTa-base encoder |
| Language | English (native-speaker and L2 learner texts) |
| License | CC BY-NC 4.0 (third-party components keep their own licenses; see License) |
| Version | 1.0.0 |
| spaCy | >=3.8.11,<3.9.0 |
| Pipeline | transformer, tagger, parser, attribute_ruler, lemmatizer, ner_transformer, ner |
| Labels | 85 VAC labels (see Label scheme) |
| Size | about 2 GB (four RoBERTa-base-sized weight blocks) |
Intended use
- Automatic annotation of VACs in written English corpora, including learner corpora (e.g., frequency, diversity, and verb–construction association analyses in usage-based SLA and corpus linguistics).
- Research and education. Commercial use is not permitted under the license.
Out of scope: spoken or transcribed speech (not evaluated), languages other than English, and high-stakes decisions about individual learners (e.g., automated scoring or placement) without human checking.
How to use
Installation
pip install https://huggingface.co/fuku0827/en_gp_vac_tagger/resolve/main/en_gp_vac_tagger-1.0.0-py3-none-any.whl
This installs the pipeline as a Python package together with its dependencies (spacy, spacy-transformers, spacy-curated-transformers). A GPU is recommended; to use one, install a CUDA-enabled PyTorch build first.
Alternatively, download the repository files and load the pipeline from the directory:
from huggingface_hub import snapshot_download
import spacy
path = snapshot_download("fuku0827/en_gp_vac_tagger", ignore_patterns=["*.whl"])
nlp = spacy.load(path)
Tagging VACs
import spacy
spacy.prefer_gpu() # uses a GPU if one is available
nlp = spacy.load("en_gp_vac_tagger")
doc = nlp("She wants her students to read more books.")
for token in doc:
if token.ent_type_:
print(token.text, token.lemma_, token.ent_type_)
Example output (produced with this release):
wants want VAC_V_N_TO_INF
read read VAC_V_N_OBJ
If you only need the VAC labels, you can skip the frozen components to save memory and time. ner_transformer and ner must both be kept:
nlp = spacy.load(
"en_gp_vac_tagger",
exclude=["transformer", "tagger", "parser", "attribute_ruler", "lemmatizer"],
)
Label scheme
spaCy entity labels cannot contain hyphens or lowercase pattern notation, so each Grammar Patterns (GP) pattern is mapped to an upper-case label. n = noun group, pl-n = plural noun group, adj = adjective group, -ing / to-inf / inf / -ed = non-finite clause types, that / wh = finite clause types; words in italics are fixed lexical items.
| No. | GP pattern | Label |
|---|---|---|
| 1 | V n-obj | VAC_V_N_OBJ |
| 2 | V n-obj-pass | VAC_V_N_OBJ_PASS |
| 3 | V n-comp | VAC_V_N_COMP |
| 4 | V pron-refl | VAC_V_PRON_REFL |
| 5 | V adj | VAC_V_ADJ |
| 6 | V -ing | VAC_V_ING |
| 7 | V to-inf | VAC_V_TO_INF |
| 8 | V inf | VAC_V_INF |
| 9 | V that | VAC_V_THAT |
| 10 | V wh | VAC_V_WH |
| 11 | V wh-to-inf | VAC_V_WH_TO_INF |
| 12 | V with quote | VAC_V_WITH_QUOTE |
| 13 | V so/not | VAC_V_SO/NOT |
| 14 | V as if | VAC_V_AS_IF |
| 15 | pl-n V together | VAC_PL_N_V_TOGETHER |
| 16 | V about n | VAC_V_ABOUT_N |
| 17 | V across n | VAC_V_ACROSS_N |
| 18 | V after n | VAC_V_AFTER_N |
| 19 | V against n | VAC_V_AGAINST_N |
| 20 | V around/round n | VAC_V_AROUND/ROUND_N |
| 21 | V as adj | VAC_V_AS_ADJ |
| 22 | V as n | VAC_V_AS_N |
| 23 | V as to wh | VAC_V_AS_TO_WH |
| 24 | V at n | VAC_V_AT_N |
| 25 | V between pl-n | VAC_V_BETWEEN_PL_N |
| 26 | V by amount | VAC_V_BY_AMOUNT |
| 27 | V by -ing | VAC_V_BY_ING |
| 28 | V for n | VAC_V_FOR_N |
| 29 | V for n to-inf | VAC_V_FOR_N_TO_INF |
| 30 | V from n | VAC_V_FROM_N |
| 31 | V in n | VAC_V_IN_N |
| 32 | V in favour of n | VAC_V_IN_FAVOUR_OF_N |
| 33 | V into n | VAC_V_INTO_N |
| 34 | V like n | VAC_V_LIKE_N |
| 35 | V of n | VAC_V_OF_N |
| 36 | V off n | VAC_V_OFF_N |
| 37 | V on n | VAC_V_ON_N |
| 38 | V onto n | VAC_V_ONTO_N |
| 39 | V out of n | VAC_V_OUT_OF_N |
| 40 | V over n | VAC_V_OVER_N |
| 41 | V through n | VAC_V_THROUGH_N |
| 42 | V to n | VAC_V_TO_N |
| 43 | V toward n | VAC_V_TOWARD_N |
| 44 | V under n | VAC_V_UNDER_N |
| 45 | V with n | VAC_V_WITH_N |
| 46 | V n n-obj | VAC_V_N_N_OBJ |
| 47 | V n n-comp | VAC_V_N_N_COMP |
| 48 | V n adj | VAC_V_N_ADJ |
| 49 | V n -ing | VAC_V_N_ING |
| 50 | V n to-inf | VAC_V_N_TO_INF |
| 51 | V n inf | VAC_V_N_INF |
| 52 | V n that | VAC_V_N_THAT |
| 53 | V n wh | VAC_V_N_WH |
| 54 | V n wh-to-inf | VAC_V_N_WH_TO_INF |
| 55 | V n -ed | VAC_V_N_V_ED |
| 56 | V pl-n with together | VAC_V_PL_N_WITH_TOGETHER |
| 57 | V way prep/adv | VAC_V_WAY_PREP/ADV |
| 58 | V n about n | VAC_V_N_ABOUT_N |
| 59 | V n against n | VAC_V_N_AGAINST_N |
| 60 | V n as adj | VAC_V_N_AS_ADJ |
| 61 | V n as n | VAC_V_N_AS_N |
| 62 | V n at n | VAC_V_N_AT_N |
| 63 | V n between/among pl-n | VAC_V_N_BETWEEN/AMONG_PL_N |
| 64 | V n by n | VAC_V_N_BY_N |
| 65 | V n for n | VAC_V_N_FOR_N |
| 66 | V n from n | VAC_V_N_FROM_N |
| 67 | V n in n | VAC_V_N_IN_N |
| 68 | V n into n | VAC_V_N_INTO_N |
| 69 | V n into -ing | VAC_V_N_INTO_ING |
| 70 | V n of n | VAC_V_N_OF_N |
| 71 | V n off n | VAC_V_N_OFF_N |
| 72 | V n on n | VAC_V_N_ON_N |
| 73 | V n onto n | VAC_V_N_ONTO_N |
| 74 | V n out of n | VAC_V_N_OUT_OF_N |
| 75 | V n over n | VAC_V_N_OVER_N |
| 76 | V n to n | VAC_V_N_TO_N |
| 77 | V n toward n | VAC_V_N_TOWARD_N |
| 78 | V n with n | VAC_V_N_WITH_N |
| 79 | it V clause | VAC_IT_V_CLAUSE |
| 80 | it be -ed clause | VAC_IT_BE_V_ED_CLAUSE |
| 81 | it V n clause | VAC_IT_V_N_CLAUSE |
| 82 | it V adj clause | VAC_IT_V_ADJ_CLAUSE |
| 83 | V it clause | VAC_V_IT_CLAUSE |
| 84 | V it adj clause | VAC_V_IT_ADJ_CLAUSE |
| 85 | there V n | VAC_THERE_V_N |
Training
Data
The model was trained on 8,082 manually annotated sentences (153,259 tokens) from five sources. The training, validation, and test data are not distributed with this model, because the source corpora have their own terms of use.
| Source | Tokens | Sentences |
|---|---|---|
| Example sentences from Grammar Patterns 1: Verbs (Francis et al., 1996) | 48,840 | 3,294 |
| British National Corpus (sentences sampled for low-frequency patterns) | 52,815 | 1,688 |
| Treebank of Learner English (TLE; Berzak et al., 2016) | 19,533 | 1,000 |
| EFCAMDAT (Geertzen et al., 2014; cleaned version, Shatz, 2020), stratified by proficiency and nationality | 14,358 | 1,100 |
| ICNALE Written Essays (Ishikawa, 2023) | 17,713 | 1,000 |
| Total | 153,259 | 8,082 |
The sentences were split at random into a training set (6,465 sentences, 80%) and a validation set (1,617 sentences, 20%). The validation set was used for checkpoint selection. This release is the version trained without sentence-level resampling of the training data; a variant trained with nsCRD resampling (Wang & Wang, 2022) did not improve accuracy.
Procedure
- The
transformer,tagger,parser,attribute_ruler, andlemmatizercomponents are taken fromen_core_web_trf3.8.0 and were frozen during training. - Only
ner_transformer(initialised fromroberta-base) andner(spaCyTransitionBasedParser.v2) were trained. - Main settings: Adam (initial learning rate 5e-5, 250 warm-up steps, linear decay), dropout 0.1, gradient accumulation 3, batch size 2,000 padded tokens, up to 20,000 steps, evaluation every 200 steps, patience 1,600 steps. The checkpoint with the best validation score was kept (
model-best). - Hardware: one NVIDIA A100 GPU (Google Colaboratory).
The full training configuration is included as config.cfg.
Evaluation
Scores are entity-level precision, recall, and F1 from spaCy's NER scorer. Because every VAC entity is a single verb token, a prediction counts as correct only when both the token and the label match. Micro averages pool all labels; Macro averages are unweighted means over labels; Macro 3+ is restricted to labels that occur at least three times in the test set.
| Data set | Sentences | Micro P | Micro R | Micro F1 | Macro F1 | Macro F1 (3+) |
|---|---|---|---|---|---|---|
| Validation (held out from training) | 1,617 | 0.9400 | 0.9509 | 0.9454 | 0.9443 | – |
| Learner test: ICNALE Written Essays v2.6 (500) + EFCAMDAT (1,100) | 1,600 | 0.9587 | 0.9472 | 0.9529 | 0.8573 | 0.9294 |
| Native-speaker test: COCA (8 genres × 100 sentences) | 800 | 0.9402 | 0.9410 | 0.9406 | 0.8695 | 0.9235 |
| Native-speaker test: English Web Treebank (5 registers × 100 sentences) | 500 | 0.9499 | 0.9450 | 0.9474 | 0.9104 | 0.9372 |
All test sets were annotated separately from the training data. Per-label validation scores are stored in meta.json (performance.ents_per_type).
Limitations
- The most frequent error type involves prepositional phrases: whether a PP is a pattern element (e.g., V n for n) or an adjunct is often ambiguous. Patterns such as V n with n, V n in n, and V n for n have lower F1 than simple patterns, which can add noise to frequency or association estimates for prepositional VACs.
- Learner grammatical errors are the second most frequent error source, although many sentences with verb-form errors or word-class confusions are labelled correctly.
- In be + -ed sequences where -ed could be an adjective or a passive participle, the model may assign both
VAC_V_ADJ(to be) andVAC_V_N_OBJ_PASS(to the participle). There V n is sometimes over-applied. Rule-based post-processing can reduce both. - Tokenization and spelling errors in the input can cause errors; normalising the text first may help.
- Labels are assigned to single verb tokens, so the pipeline does not mark multi-word units such as phrasal verbs and is not suited to analyses that treat phrasal verbs as units.
- All training and test annotations were made by a single annotator; inter-annotator agreement has not been assessed.
- Labels that are rare in the test data have unstable per-label scores; interpret them with care.
- The model was trained and evaluated on written texts only.
License
The model is released under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). The components taken from en_core_web_trf (MIT License, © ExplosionAI GmbH) and the roberta-base weights used to initialise ner_transformer (MIT License) remain under their original licenses; see LICENSE and LICENSES_SOURCES. Users are responsible for complying with the terms of any corpora they process with this model.
Citation
A citation for the accompanying publication will be added here. Until then, please cite this repository:
@misc{gp_vac_tagger,
author = {Kohei Fukuda},
title = {{GP-VAC Tagger}: A Grammar Pattern-based Verb-Argument Construction Tagger for {English}},
year = {2026},
version = {1.0.0},
howpublished = {\url{https://huggingface.co/fuku0827/en_gp_vac_tagger}}
}
References
- Berzak, Y., Kenney, J., Spadine, C., Wang, J. X., Lam, L., Mori, K. S., Garza, S., & Katz, B. (2016). Universal Dependencies for learner English. In Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long papers) (pp. 737–746). https://doi.org/10.18653/v1/P16-1070
- Davies, M. (2008–). The Corpus of Contemporary American English (COCA). https://www.english-corpora.org/coca/
- Francis, G., Hunston, S., & Manning, E. (1996). Collins COBUILD grammar patterns 1: Verbs. HarperCollins Publishers.
- Geertzen, J., Alexopoulou, T., & Korhonen, A. (2014). Automatic linguistic annotation of large scale L2 databases: The EF-Cambridge Open Language Database (EFCamDat). In Selected proceedings of the 2012 Second Language Research Forum (pp. 240–254). Cascadilla Proceedings Project.
- Ishikawa, S. (2023). The ICNALE guide: An introduction to a learner corpus study on Asian learners' L2 English. Routledge. https://doi.org/10.4324/9781003252528
- Liu, Y., Ott, M., Goyal, N., Du, J., Joshi, M., Chen, D., Levy, O., Lewis, M., Zettlemoyer, L., & Stoyanov, V. (2019). RoBERTa: A robustly optimized BERT pretraining approach. arXiv:1907.11692.
- Shatz, I. (2020). Refining and modifying the EFCAMDAT: Lessons from creating a new corpus from an existing large-scale English learner language database. International Journal of Learner Corpus Research, 6(2), 220–236. https://doi.org/10.1075/ijlcr.20009.sha
- Silveira, N., Dozat, T., de Marneffe, M.-C., Bowman, S. R., Connor, M., Bauer, J., & Manning, C. (2014). A gold standard dependency corpus for English. In Proceedings of the Ninth International Conference on Language Resources and Evaluation (LREC'14) (pp. 2897–2904). European Language Resources Association.
- Wang, X., & Wang, Y. (2022). Sentence-level resampling for named entity recognition. In Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (pp. 2151–2165). https://doi.org/10.18653/v1/2022.naacl-main.156