PeggyVallin/jfv-french-style-conditioning-dataset-v1.0
JFV French Paired Style-Conditioning Dataset At a Glance Item Value Language French Source Single-author blog corpus, 2005–2025 Public release v1.0 Aligned units in public release 1,484 Texts in public aligned release 7,420 Original experiment 1,492 aligned units / 7,460 texts Generated conditions Ministral baseline; profile; profile + five-shot examples Primary use Paired study of stylistic conditioning and evaluation-metric validity… See the full description on the dataset page: https://huggingface.co/datasets/PeggyVallin/jfv-french-style-conditioning-dataset-v1.0.
JFV French Paired Style-Conditioning Dataset
At a Glance
Dataset Summary
This dataset contains paired French texts from an experiment on stylometric conditioning of language-model generation, built around a single-author blog corpus identified in the project artifacts as JFV.
The public release contains 1,484 aligned units. For each unit, five related texts are available:
The complete public aligned release therefore contains 7,420 texts.
The accompanying research experiment originally used 1,492 aligned units, or 7,460 texts. Eight source-blog records were later confirmed by the source author to be full republications of La Voix du Nord articles rather than source-author prose. Those eight pair_ids were removed from all five aligned files for public release, preserving alignment. The historical experiment was not rerun or rewritten after this publication curation.
The exact public-release exclusions are recorded in:
jfv_release_exclusions_8_voix_du_nord.json
Accordingly, numerical results from the original project report and evaluation notebook should be interpreted as results for the historical N=1,492 experiment, not as recomputed results for the N=1,484 public subset.
Public Release Curation
The public release applies one publication-only filtering step to the historical experimental package:
- original experiment: 1,492 aligned units;
- public release: 1,484 aligned units;
- eight confirmed newspaper republications removed from the human file;
- the same eight
pair_ids removed from the DeepSeek, baseline, profile, and profile + few-shot files; - retained records are otherwise preserved from the historical experimental files.
The public filenames intentionally omit the historical row count so that the filenames remain valid for the curated release.
The stylometric profile, few-shot manifest, and generated outputs were not retrained or regenerated after this curation. The release should therefore be understood as a curated publication of a historical experiment, not as a newly executed 1,484-pair experiment.
Source Data
The human source material comes from a French-language personal blog published between 2005 and 2025. The corpus covers primarily political, European, cultural, historical, social, and intellectual topics, including European institutions, public policy, society, cinema, and book reviews.
JFV is the project identifier used for the source author, Jean-François Vallin.
The historical raw corpus contains 4,438 texts. A cleaned reference corpus of 2,981 texts was prepared before this experiment and used for stylometric profiling.
The historical evaluation set contained 1,492 human texts drawn from that 2,981-text reference corpus. The public human file is a curated 1,484-record subset of that historical evaluation set.
The corpus is temporally imbalanced: earlier publication years are more heavily represented than recent years. This matters for stylometric analysis because typographic and other formal writing practices changed over time.
The source author, Jean-François Vallin, has explicitly authorized publication of his source-author material in this dataset under the Creative Commons Attribution 4.0 International (CC BY 4.0) license, including reuse, adaptation, and commercial use subject to attribution. Full newspaper republications identified during the publication audit were excluded. Short quotations, references, names, or other third-party material may still occur inside source-author texts and are not independently relicensed by this dataset.
Pairing Protocol
Human–DeepSeek pairing is thematic, not a rewriting of the human text.
For each human JFV text, DeepSeek produced a distinct article on the same topic. The historical project documentation records that generation used the title and contextual elements from the upstream pairing process; the exact DeepSeek prompt template is not included in this paired dataset release. The human text itself was not supplied as text to rewrite. The human reference and DeepSeek text therefore address the same subject but are independently formulated.
The DeepSeek text then serves as the immediate input to Ministral under three generation conditions:
- baseline, without a stylometric profile;
- stylometric profile only;
- the same stylometric profile plus five fixed few-shot examples.
Prompt traceability
The full generation prompt templates are not included in this paired dataset package; they belong to the accompanying code lineage rather than to the five released text configurations. The generated records nevertheless preserve the prompt-version metadata available at generation time. The recovered scripts identify:
- baseline:
prompt_version = baseline_v3; the historical baseline records do not contain a separateprompt_template_versionfield; - profile:
prompt_version = profile_v3_1_no_fewshotandprompt_template_version = shared_rewrite_template_v3; - profile + few-shot:
prompt_version = profile_v3_1_fewshot_5andprompt_template_version = shared_rewrite_template_v3_fewshot.
The absence of prompt_template_version from the baseline is therefore a historical metadata-schema difference, not evidence that the baseline prompt is unknown. The exact prompt-profile block used by the conditioned runs is preserved separately in jfv_prompt_profile.json, and the five injected examples are preserved in jfv_fewshot_manifest.json.
This structure supports document-level paired comparison among the three Ministral conditions, but the generation lineage contains two historical preprocessing differences that must be considered when interpreting the conditions. They are documented below.
Historical Preparation Lineage
DeepSeek cleaning and alignment
The recovered DeepSeek cleaning notebook produced a cleaned intermediate containing 1,494 records. A subsequent alignment step produced the historical 1,492-pair evaluation set. The retained lineage does not support describing this transition as a simple deletion of the two identifiers previously listed in this Dataset Card. In particular, 2007-07-26_p5 is present in the final aligned files, while 2009-05-26_p1 and 2007-03-21_p1 are absent from the final aligned release lineage. The public files preserve the final aligned set rather than reconstructing the intermediate 1,494-to-1,492 transition.
Baseline input-version difference
The recovered baseline generation script reads an earlier DeepSeek file:
auth_llm_jfv_deepseek_from_context.jsonl
The final profile and profile + few-shot scripts read the later cleaned file:
jfv_deepseek_drafts_1492.jsonl
The public jfv_deepseek_topic_matched.jsonl corresponds to this cleaned DeepSeek version: for all 1,484 public pairs, its word count reproduces the stored input_word_count in both profile-conditioned files. The earlier exact baseline input version is not included in the public release for the pairs affected by preprocessing differences.
The model family and core generation parameters are shared, but the exact DeepSeek input text is therefore not byte-identical across all three conditions.
For the 1,484 public pairs, direct comparison of the earlier and cleaned DeepSeek versions shows:
- 373 pairs with a textual difference between the earlier and cleaned DeepSeek input versions;
- 99 pairs where this difference changes the recorded
input_word_countin the baseline relative to the two profile-conditioned conditions; - for those 99 pairs, the baseline count is higher by 1 to 23 words.
Most of the recovered DeepSeek cleaning operations concern preambles, repeated titles, separators, or Markdown-style formatting. The conditioning level is therefore the main experimental manipulation, but it is not literally the only preprocessing difference between the historical baseline and the two profile-conditioned runs.
Baseline canonicalization after generation
The historical baseline was also canonicalized after generation to align it with the final human evaluation set. The recovered canonicalization notebook:
- removed five out-of-selection baseline generations;
- remapped
2007-03-21_p1to2007-01-15_p1; - replaced five baseline title fields with the canonical human titles;
- removed a repeated leading title line from
text_normalizedfor 20 records; - retained the historical seeds, generation parameters, and Ollama metadata.
All 20 of those canonicalized records remain present in the 1,484-pair public release.
The baseline file continues to report normalization_version = markdown_light_v2, so users should be aware that its final text_normalized field includes this additional historical canonicalization step. The profile and profile + few-shot files did not undergo the same repeated-title removal step.
Models
DeepSeek topic-matched texts are recorded in the historical artifacts with the Ollama tag:
deepseek-r1:8b
No immutable model digest or pull timestamp was preserved in the released records. Because this is a floating tag, the exact historical DeepSeek weight revision cannot be reconstructed from the tag alone.
The three Ministral rewrite conditions use:
ministral-3:8b-instruct-2512-q4_K_M
Data Files and Schema
The YAML metadata at the top of this Dataset Card defines five explicit Hugging Face configurations so that the five JSONL files are loaded separately. The JSON traceability artifacts are intentionally not part of a dataset configuration.
In the public human file, source is normalized to human_blog. In generated files, source contains the model identifier. The generated files also contain label = llm.
Record identifiers generally follow the pattern YYYY-MM-DD_pN, where the date corresponds to the source publication date and pN distinguishes multiple records associated with the same date. A small number of identifiers also carry a __2 suffix; these denote distinct records and should not be treated as duplicates.
Quick join by pair_id
The human file uses id as the pairing key, while the four generated files expose the same key as pair_id.
import pandas as pd
human = pd.read_json("jfv_human.jsonl", lines=True).rename(columns={"id": "pair_id", "text": "human_text"})
draft = pd.read_json("jfv_deepseek_topic_matched.jsonl", lines=True).rename(columns={"text": "deepseek_text"})
baseline = pd.read_json("jfv_ministral_baseline.jsonl", lines=True)
profile = pd.read_json("jfv_ministral_profile_no_fewshot.jsonl", lines=True)
fewshot = pd.read_json("jfv_ministral_profile_fewshot.jsonl", lines=True)
paired = human.merge(draft[["pair_id", "deepseek_text"]], on="pair_id")
paired = paired.merge(baseline[["pair_id", "text_normalized"]].rename(columns={"text_normalized": "baseline_text"}), on="pair_id")
paired = paired.merge(profile[["pair_id", "text_normalized"]].rename(columns={"text_normalized": "profile_text"}), on="pair_id")
paired = paired.merge(fewshot[["pair_id", "text_normalized"]].rename(columns={"text_normalized": "fewshot_text"}), on="pair_id")
assert len(paired) == 1484jfv_human.jsonl
Fields:
id, source, title, text
jfv_deepseek_topic_matched.jsonl
Fields:
id, pair_id, source, label, title, text
jfv_ministral_baseline.jsonl
Fields:
id, pair_id, draft_id, draft_source, source, label, condition, prompt_version, normalization_version, title, seed, generation_parameters, length_metadata, ollama_metadata, text_raw, text_normalized
Condition value:
baseline_no_profile
jfv_ministral_profile_no_fewshot.jsonl
Fields:
id, pair_id, draft_id, draft_source, source, label, condition, prompt_version, prompt_template_version, profile_version, prompt_profile_hash_sha256, manifest_hash_sha256, few_shot_count, normalization_version, title, seed, generation_parameters, length_metadata, ollama_metadata, text_raw, text_normalized
Condition value:
profile_no_fewshot
jfv_ministral_profile_fewshot.jsonl
Fields:
id, pair_id, draft_id, draft_source, source, label, condition, prompt_version, prompt_template_version, profile_version, prompt_profile_hash_sha256, profile_manifest_hash_sha256, fewshot_manifest_version, fewshot_manifest_sha256, fewshot_example_ids, few_shot_count, normalization_version, title, seed, generation_parameters, length_metadata, ollama_metadata, text_raw, text_normalized
Condition value:
profile_fewshot
Generation Metadata
The three Ministral JSONL files preserve generation-time metadata in addition to generated text.
generation_parameters records:
temperature:0.7top_p:0.9repeat_penalty:1.05num_predict:1600num_ctx:8192length_tolerance:0.1
The ±10% target window was calculated from the DeepSeek input available to each generation script at generation time. Because the baseline used an earlier DeepSeek text version for some pairs, the target window is not identical across all three conditions for those pairs.
length_metadata records the generation-time input word count, target bounds, raw and normalized output word counts, and whether the raw output fell inside the requested range.
The generation scripts count words using the regular expression:
\b[\wÀ-ÖØ-öø-ÿ’'-]+\bThis convention treats many elided or hyphenated forms as a single match and therefore does not necessarily reproduce descriptive word counts computed by whitespace splitting or another tokenizer.
Recounting the published text_raw with this same regular expression reproduces the stored raw-output word count for all Profile and Profile + Few-Shot records and for 1,475 of 1,484 baseline records. Nine baseline records differ by 1 to 19 words (2008-07-16_p3, 2019-03-08_p4, 2009-05-21_p2, 2013-08-29_p3, 2021-01-12_p2, 2015-07-23_p5, 2016-03-22_p1, 2017-03-22_p5, and 2010-07-29_p3). None of these differences changes the stored length_within_target result. This is a historical text/count representation mismatch in the released baseline artifact; the stored historical counts are preserved.
ollama_metadata contains done, done_reason, prompt_eval_count, eval_count, and total_duration. total_duration is expressed in nanoseconds. The historical Ollama application version was not preserved in the released records and cannot be reconstructed from this package. Failed calls could be retried up to three times; empty outputs and outputs interrupted by the token limit were rejected rather than included as valid generations.
Both text_raw and text_normalized are retained. See Baseline canonicalization after generation above for the additional baseline-specific canonicalization applied to 20 historical records.
Public-release length compliance
Using the stored length_within_target field in the 1,484 public records:
Seed Policy and One Recorded Exception
The generation protocol was designed to derive a deterministic seed from each pair_id so that matched conditions would use the same seed.
This correspondence holds for 1,483 of the 1,484 public pairs.
For 2007-01-15_p1, the baseline record contains seed 533479144, while the Profile and Profile + Few-Shot records contain seed 2009407582.
The intended seed formula recovered from the generation scripts is:
import hashlib
seed = int(hashlib.md5(pair_id.encode("utf-8")).hexdigest()[:8], 16) % (2**31 - 1)For 2007-01-15_p1, that formula produces 2009407582. The baseline seed, 533479144, is exactly the value produced by the same formula for the pre-canonicalization identifier 2007-03-21_p1, which was later remapped to 2007-01-15_p1. The isolated seed discrepancy is therefore attributable to that identifier remapping; the historical record is preserved unchanged.
Analyses requiring strictly identical seeds across all three conditions can exclude this single pair.
Stylometric Profile Used for Generation
The profile-conditioned generations use the exact profile artifact available at generation time:
jfv_prompt_profile_v3_1
The SHA-256 of the injected prompt_block is:
45783c61379f5831d6bed2779f373293b1160475b30e75938eb4df24ad7b2f6f
This is the value stored in the generated records as prompt_profile_hash_sha256. It identifies the injected text block, not the JSON file as a whole.
The file-level SHA-256 of jfv_prompt_profile.json in this release is:
bc823fcb3306f30c5559a25da5100afeb9e62d27c8158b9b0c2726ac021a174a
The underlying stylometric profiling defined 45 active numerical features. The full per-feature reference values are not contained in jfv_prompt_profile.json and are not included in this paired release. Instead, jfv_prompt_profile.json is the generation-time prompt-profile artifact derived from an earlier version of that profiling work: it records the feature names and roles, and translates 22 of the 45 active features into six natural-language generation instructions.
To avoid ambiguity, this Dataset Card uses numerical profile for the feature-value representation produced by the profiling analysis, prompt-profile artifact for jfv_prompt_profile.json, and Profile condition for the Ministral generation condition that uses that prompt-profile artifact.
This artifact predates the final revision of the profiling notebook. In particular, the injected prompt-profile asks for sentences averaging approximately 20 words, whereas the final numerical profile uses a 14.45-word reference for the author's 2018–2025 period.
The release preserves the prompt-profile artifact that actually produced the historical generations instead of replacing it with a later reconstruction.
The underlying profiling was constructed from the historical 2,981-text reference corpus, before the eight publication exclusions were applied. The public release therefore does not represent a freshly re-profiled experiment after curation.
Few-Shot Selection
The Profile + Few-Shot condition uses five fixed examples recorded in:
jfv_fewshot_manifest.json
The manifest preserves their identity, order, full texts, stylistic scores, semantic-diversity measurements, model revisions, source-pool identity, and selection metadata.
The file-level SHA-256 of the included manifest is:
88429c395efa2c6490ec8401a53618535023690ba5e06c60fbdf75874a871473
The same value is stored in all public Profile + Few-Shot records as fewshot_manifest_sha256.
The historical candidate pool contains 1,489 texts. Its fingerprint is recorded in the manifest as a provenance trace. The candidate-pool JSONL itself is not included in this paired release.
The historical partition was 1,492 evaluation texts + 1,489 candidate-pool texts = 2,981 reference texts. The eight public-release exclusions were removed from the published evaluation subset; they were not reassigned to the few-shot pool.
Hash Terminology
The profile-conditioned generation files contain two similarly named internal fields:
prompt_profile_hash_sha256: SHA-256 of the injectedprompt_blocktext;manifest_hash_sha256orprofile_manifest_hash_sha256: internal hash of the canonical JSON content ofjfv_prompt_profile.json, excluding its ownmanifest_hash_sha256field.
The latter is not the hash of jfv_fewshot_manifest.json. Its value in the historical generation records is:
e53cf8bee35a432531e0b6cd8715b973d881d91ec8c157d025e54d1e378ffc4b
It can be reproduced from jfv_prompt_profile.json with the exact serialization used during generation:
import hashlib
import json
with open("jfv_prompt_profile.json", "r", encoding="utf-8") as f:
profile = json.load(f)
profile_for_hash = dict(profile)
profile_for_hash.pop("manifest_hash_sha256", None)
payload = json.dumps(
profile_for_hash,
ensure_ascii=False,
sort_keys=True,
separators=(",", ":"),
)
manifest_hash_sha256 = hashlib.sha256(
payload.encode("utf-8")
).hexdigest()The few-shot manifest has its own field:
fewshot_manifest_sha256
Relationship to the Profiling Corpus
The 1,492 human texts from the historical experiment are part of the same 2,981-text corpus used to construct the stylometric profile. They are therefore not an independent human holdout relative to profile construction.
The 1,484 public human texts are a subset of those historical 1,492 records and inherit the same limitation.
This overlap limits interpretation of absolute human-to-profile distances. It does not prevent paired comparison of historical generated conditions, but users should not treat the human side as an unseen author holdout.
Results from the Original 1,492-Pair Experiment
The following evaluation results are retained for traceability to the accompanying research project. They were computed on the historical N=1,492 experiment and have not been recomputed after the eight-record public-release curation.
BGE-M3 ceiling effect
Mean similarity between the original human text and its DeepSeek draft was 0.714.
Mean similarity between each Ministral generation and its immediate DeepSeek input was:
For all 1,492 historical pairs, the generation was at least as close to the DeepSeek draft as the corresponding human text was.
In this task structure, BGE-M3 primarily captures proximity to the immediate generated input. It should not by itself be treated as proof of preservation of named entities, numbers, factual propositions, argumentative relations, or fine-grained stance.
Length as a confounding variable
In the historical evaluation pipeline, human texts averaged approximately 342 words, DeepSeek drafts approximately 453 words, and the three Ministral conditions approximately 510–520 words under the descriptive counting convention used by that analysis.
Document length was found to confound centroid-based stylistic similarity. The final historical evaluation therefore used a regression-based length correction for the lexicosyntactic measure.
Temporal variation
In the historical negative control, surface-space discrimination differed substantially by publication period:
- surface AUC, 2005–2008:
0.124 - surface AUC, 2018–2025:
0.350
The historical 1,492-text evaluation set contained 273 texts from 2018–2025 and 376 texts from 2005–2008. The public 1,484-text subset contains 273 and 368 respectively.
The corpus also exhibits a break in several typographic conventions around 2015, affecting punctuation, spacing, and graphical organization. Surface representations are especially sensitive to these shifts.
Negative controls and metric validation
The historical negative control compares the 1,492 human texts with their thematically matched DeepSeek texts.
An AUC of 0.5 corresponds to chance-level discrimination. Values below 0.5 indicate reversed orientation; values above 0.5 indicate discrimination in the intended direction.
Only the length-corrected lexicosyntactic residual discriminated globally in the expected direction and was therefore retained as the primary stylistic metric in the historical study. On that metric, explicit profile conditioning produced a small measurable improvement over the baseline, while adding the five few-shot examples reduced part of that gain.
These historical results are included to document the research context of the files, not to claim that the same numerical values have been re-estimated for the 1,484-pair public subset.
Known Generation Artifacts
The release preserves several historical model-output artifacts rather than silently correcting them:
2011-06-02_p4injfv_ministral_profile_no_fewshot.jsonlis entirely in English.- 20 records in
jfv_deepseek_topic_matched.jsonlcontain one or more Chinese characters or short Chinese insertions inside otherwise French text. Eight Ministral outputs also contain Chinese characters: baseline2011-07-15_p3,2007-05-04_p3, and2009-04-04_p4; Profile2007-10-18_p1,2011-06-28_p3,2018-11-25_p4, and2007-05-04_p3; Profile + Few-Shot2024-10-19_p1. In five of these eight cases, the corresponding DeepSeek draft contains no Chinese characters, so the characters were introduced during the Ministral rewrite. The baseline record2009-04-04_p4also contains a Cyrillic character. - Four generated records contain parenthetical word-count notes in the text itself:
2012-03-15_p5in the DeepSeek set ((453 mots)),2011-10-29_p4in the DeepSeek set ((Environ 420 mots)),2014-12-27_p3in the baseline ((478 mots)), and2025-08-12_p3in the Profile + Few-Shot condition ((372 mots)).
The dataset metadata retains language: fr because French is the intended and overwhelmingly dominant language of the corpus and generation task. The exceptions above are preserved as generation artifacts and should not be interpreted as separate multilingual subsets.
Personal and Third-Party Information
The source material spans twenty years of political, cultural, historical, social, and personal blog writing. Individual records may mention public figures or other named third parties.
The dataset is not intended to provide verified personal profiles of those third parties. Full newspaper republications identified during the publication audit were excluded from the public aligned release.
Intended Uses
Potential uses include research on personalized text generation, stylometric conditioning, paired prompting experiments, style-transfer evaluation, human-versus-generated text analysis, evaluation-metric validation, negative controls, content-preservation analysis, and longitudinal stylistic variation.
The dataset should not be treated as a general benchmark for French writing, as a representative sample of French speakers, or as evidence that the measured characteristics exhaustively describe an author's writing practices.
Responsible Use
The conditioning artifacts and generated records should not be used to falsely attribute model-generated text to the source author or to create deceptive representations of the source author's authorship or views. Generated outputs should be identified as model-generated when attribution could otherwise be ambiguous.
Relationship to EPICdemic
The profile and related conditioning artifacts released with this dataset were used in a version of the EPICdemic MVP.
This statement refers to the versioned artifacts included here. Later EPICdemic versions may use different profile, retrieval, generation, or evaluation artifacts.
Included Traceability Artifacts
jfv_prompt_profile.json
Exact prompt-profile artifact used for the historical profile-conditioned generations.
jfv_fewshot_manifest.json
Historical manifest documenting the five fixed few-shot examples and their selection lineage.
jfv_release_exclusions_8_voix_du_nord.json
Publication-curation manifest recording the eight aligned units removed from the public release and the reason for removal.
SHA256SUMS
Checksums for the eight release data and traceability files. README.md and SHA256SUMS itself are intentionally excluded so that the Dataset Card can be updated with the final Hugging Face repository URL without invalidating the data-file checksums.
License
The dataset is released under the Creative Commons Attribution 4.0 International (CC BY 4.0) license for material the source author and releaser are authorized to license.
Third-party quotations, names, referenced works, or other embedded third-party material remain subject to any rights that apply to that material and are not separately relicensed by this dataset.
Citation
If you use this dataset, please cite:
Vallin, Peggy. (2026). JFV French Paired Style-Conditioning Dataset (Version 1.0) [Dataset]. Harvard Dataverse. https://doi.org/10.7910/DVN/KVFDXF
Hugging Face mirror: https://huggingface.co/datasets/PeggyVallin/jfv-french-style-conditioning-dataset-v1.0
@misc{vallin2026jfv,
author = {Vallin, Peggy},
title = {JFV French Paired Style-Conditioning Dataset},
year = {2026},
publisher = {Harvard Dataverse},
note = {Dataset, Version 1.0},
doi = {10.7910/DVN/KVFDXF},
url = {https://doi.org/10.7910/DVN/KVFDXF}
}