dragonscale-ai/kniv-corpus-en
kniv-corpus-en A multi-domain English NLP corpus with four annotation layers: Named Entity Recognition (18 types), POS tagging (17 UPOS tags), dependency parsing, and dialog act classification (9 types). All data is commercially licensed (CC BY-SA 4.0 compatible). Built for training kniv multi-task NLP models that power the uniko cognitive memory system. Quick Start from datasets import load_dataset # Load the full corpus via HuggingFace ds =… See the full description on the dataset page: https://huggingface.co/datasets/dragonscale-ai/kniv-corpus-en.
kniv-corpus-en
A multi-domain English NLP corpus with four annotation layers: Named Entity Recognition (18 types), POS tagging (17 UPOS tags), dependency parsing, and dialog act classification (9 types). All data is commercially licensed (CC BY-SA 4.0 compatible).
Built for training kniv multi-task NLP models that power the uniko cognitive memory system.
Quick Start
from datasets import load_dataset
# Load the full corpus via HuggingFace
ds = load_dataset("dragonscale-ai/kniv-corpus-en")
print(ds["train"][0])# Load gold-filtered corpus (recommended for training)
import pandas as pd
from huggingface_hub import hf_hub_download
path = hf_hub_download("dragonscale-ai/kniv-corpus-en", "corpus/gold/train.parquet", repo_type="dataset")
gold = pd.read_parquet(path)
print(f"{len(gold)} gold sentences")Repository Structure
dragonscale-ai/kniv-corpus-en/
|
+-- data/ # Full corpus (HF auto-detected Parquet)
| +-- train-00000-of-00001.parquet 525,850 sentences (127.7 MB)
| +-- dev-00000-of-00001.parquet 65,731 sentences (13.8 MB)
| +-- test-00000-of-00001.parquet 65,732 sentences (14.0 MB)
|
+-- corpus/gold/ # Gold-filtered corpus (recommended)
| +-- train.parquet 237,646 sentences (56.8 MB)
| +-- dev.parquet 65,731 sentences (13.8 MB)
| +-- test.parquet 65,732 sentences (14.0 MB)
| +-- progress.json Filtering metadata
|
+-- prepared/deberta-v3-large-nlp-en/ # Training-ready JSON splits
| +-- ner_train.json 45,000 examples (domain-balanced subsample)
| +-- ner_dev.json 65,731 examples
| +-- ner_test.json 65,732 examples
| +-- ud_train.json 12,544 examples (UD English EWT)
| +-- ud_dev.json 2,001 examples
| +-- ud_test.json 2,077 examples
| +-- label_vocabs.json Label vocabularies for all tasks
|
+-- train.conllu # Full corpus in CoNLL-U format (547.7 MB)
+-- dev.conllu (67.9 MB)
+-- test.conllu (68.8 MB)
+-- metadata.json Split sizes and domain list
+-- README.mdHow the Data Was Built
Collection
Text was collected from 17 open sources across 6 domains, chosen for domain diversity and commercial licensing:
Preprocessing
- Sentence splitting (non-conversation): spaCy sentencizer splits documents into individual sentences
- Utterance extraction (conversation): each dialog turn kept as a single unit (no sentence splitting -- conversational utterances are natural dialog act boundaries)
- Conversational context: within each conversation,
prev_textlinks each utterance to the preceding turn for context-dependent classification - Deduplication: exact-match dedup by text content; conversation domain deduped by
(conv_id, turn_idx)pairs - Quality filtering: minimum length, encoding validation, boilerplate removal
Annotation
Four-layer annotation in a single pipeline pass:
- NER + POS + Dependency: spaCy
en_core_web_trf(transformer-based) annotates all three in one forward pass, producing CoNLL-U + JSONL output - Validation: GPT-5.4-nano reviews annotations in batches of 5 sentences, returning corrections for POS, NER, and dependency labels. Only valid UPOS corrections are accepted (invalid suggestions like "PART (acceptable)" are rejected). Orphan BIO I-tags (I- without preceding B-) are automatically repaired to B-.
- Classification: GPT-5.4-nano assigns one of 9 dialog act labels per sentence in batches of 20. Conversation domain sentences include the previous utterance (
prev_text) as context for labels likecorrection,agreement, andfiller.
Gold Filtering
The full corpus (525,850 train sentences) was validated sentence-by-sentence using Qwen3-8B via vLLM on an A100 GPU with 64 concurrent requests:
Sentences failing any check were removed. 237,646 sentences survived (45.2% of training data). The high POS rejection rate reflects the LLM checking 8 tokens per sentence -- even a ~5% per-token disagreement rate compounds to ~34% per-sentence rejection.
Training Data Preparation
The prepared/ directory contains training-ready JSON splits:
- NER data (45,000 examples): domain-balanced subsample from the 237K gold corpus, with targets: conversation 15K, business 10K, technical 7K, narrative 5K, news 5K, encyclopedic 3K
- UD data (12,544 examples): Universal Dependencies English EWT v2.14 (expert-annotated, not gold-filtered -- already gold standard)
Data Format
Parquet Columns
CoNLL-U Format
Standard 10-column CoNLL-U with metadata comments:
# sent_id = conversation-004217
# text = Oh, could you please change it for outside?
# prev_text = It looks like the table will be for inside.
# cls = correction
1 Oh oh INTJ UH _ 5 discourse _ _
2 , , PUNCT , _ 5 punct _ _
3 could could AUX MD _ 5 aux _ _
4 you you PRON PRP _ 5 nsubj _ _
5 please please VERB VB _ 0 root _ _
6 change change VERB VB _ 5 xcomp _ _
7 it it PRON PRP _ 6 obj _ _
8 for for ADP IN _ 9 case _ _
9 outside outside NOUN NN _ 6 obl _ _
10 ? ? PUNCT . _ 5 punct _ _NER tags appear in the MISC column as NER=B-ORG, NER=I-ORG, etc.
Annotation Details
NER Entity Types (18)
Dialog Act Labels (9)
These labels are designed for uniko's cognitive memory system:
Context-dependent labels (correction, agreement, feedback) use prev_text for classification in the conversation domain. For non-conversational text, these labels are assigned based on sentence content alone.
Dependency Parsing (dep2label)
Dependencies are encoded as token-level labels using the rel-pos scheme (Strzyz et al., 2019):
+1@nsubj@VERB -> "1st VERB to the right is the head, relation = nsubj"
-2@amod@NOUN -> "2nd NOUN to the left is the head, relation = amod"
0@root@ROOT -> "this token is the root"This reformulation enables dependency parsing as standard token classification (~1,411 unique labels). Decoding back to a tree is O(n) per sentence.
Full vs Gold: Which Should I Use?
The gold corpus is a strict subset of the full corpus. Every sentence in gold passed three independent LLM validation checks (NER, CLS, POS). The prepared data is a domain-balanced subsample of the gold corpus, ready for model training with label vocabularies.
Training
git clone https://github.com/rustic-ai/kniv-nlp-models
cd kniv-nlp-models
# Prepare training data from gold corpus
python models/deberta-v3-large-nlp-en/prepare_data.py \
--gold corpus/output/final-gold
# Train teacher model (DeBERTa-v3-large, 435M params)
python models/deberta-v3-large-nlp-en/train.py
# Quick test (1 epoch, 100 samples)
python models/deberta-v3-large-nlp-en/train.py --quick-testPipeline
collect -> preprocess -> annotate -> validate -> classify -> export -> gold filter
(17 src) (dedup, (spaCy (GPT-5.4 (GPT-5.4 (CoNLL-U (Qwen3-8B
split, trf) nano) nano) Parquet) vLLM)
prev_text)
657K sentences -----------------------------------------------------------> 237K goldSource
- Code: rustic-ai/kniv-nlp-models
- Models: dragonscale-ai on HuggingFace
Citation
@misc{kniv-corpus-en-2026,
title={kniv-corpus-en: Multi-domain English NLP Corpus},
author={Dragonscale AI},
year={2026},
publisher={Hugging Face},
url={https://huggingface.co/datasets/dragonscale-ai/kniv-corpus-en}
}License
CC BY-SA 4.0. All source datasets are commercially licensed (CC BY, CC BY-SA, Apache 2.0, MIT, PSF, public domain, or ODC-BY).
