Spaces:
Runtime error
Runtime error
| """Generate the synthetic source corpus (simulating tiered internet sources) | |
| and four test submissions with known ground truth: | |
| clean.txt -- original paper on a topic absent from the corpus | |
| clone.txt -- lit review + methodology copied verbatim from a tier-1 source | |
| mosaic.txt -- lit review woven from two IoT sources with synonym tweaks | |
| idea.txt -- same study as a source, fully re-rendered (idea plagiarism) | |
| """ | |
| import json | |
| import os | |
| import sys | |
| import numpy as np | |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| from plagdetect.textutils import mosaic_mix, sentences, synonymize # noqa: E402 | |
| ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| CORPUS_DIR = os.path.join(ROOT, "data", "corpus") | |
| SUB_DIR = os.path.join(ROOT, "data", "submissions") | |
| TOPICS = { | |
| "bh": dict(tech="consortium blockchain", domain="healthcare data management", | |
| entity="electronic health records", problem="patient privacy leakage", | |
| method="smart-contract based access control", tool="Hyperledger Fabric", | |
| metric="data breach incidence", adj="patient-centric"), | |
| "io": dict(tech="lightweight intrusion detection", domain="industrial IoT networks", | |
| entity="sensor telemetry streams", problem="botnet infiltration", | |
| method="federated anomaly detection", tool="edge gateway accelerators", | |
| metric="attack detection latency", adj="energy-aware"), | |
| "cr": dict(tech="multispectral deep learning", domain="precision agriculture", | |
| entity="UAV-captured field imagery", problem="late blight outbreaks", | |
| method="attention-based disease classification", tool="ResNet-50 backbones", | |
| metric="seasonal yield loss", adj="smallholder-friendly"), | |
| "ed": dict(tech="immersive virtual reality", domain="engineering education", | |
| entity="laboratory simulations", problem="declining skill transfer", | |
| method="haptic-guided procedural training", tool="Unity XR toolkit", | |
| metric="skill retention", adj="curriculum-aligned"), | |
| "tg": dict(tech="spatio-temporal graph networks", domain="urban traffic management", | |
| entity="loop detector measurements", problem="recurrent congestion spillback", | |
| method="graph attention flow forecasting", tool="adaptive signal controllers", | |
| metric="average commute delay", adj="city-scale"), | |
| } | |
| CLEAN_TOPIC = dict(tech="autonomous drone logistics", domain="last-mile parcel delivery", | |
| entity="aerial delivery corridors", problem="payload routing inefficiency", | |
| method="multi-agent route negotiation", tool="ROS2 flight stacks", | |
| metric="delivery turnaround time", adj="weather-resilient") | |
| SURNAMES = ["Sharma", "Chen", "Gupta", "Okafor", "Martinez", "Kim", "Patel", | |
| "Nguyen", "Silva", "Hassan", "Tanaka", "Kowalski", "Mehta", "Johansson"] | |
| VENUES = ["IEEE Access", "ACM Computing Surveys", "Future Generation Computer Systems", | |
| "Journal of Network and Computer Applications", "Sensors", | |
| "IEEE Transactions on Industrial Informatics", | |
| "Expert Systems with Applications", "IEEE Internet of Things Journal"] | |
| SECTIONS = ["abstract", "introduction", "literature_review", "methodology", | |
| "results", "conclusion"] | |
| # Two disjoint template sets: P renders corpus papers, A renders the | |
| # "idea plagiarism" re-write (same facts, different surface form). | |
| P = { | |
| "abstract": [ | |
| "This paper proposes a {adj} {tech} framework for {domain}.", | |
| "We address {problem} by introducing {method} built on {tool}.", | |
| "Experiments on {n} cases show a {imp}% improvement in {metric}.", | |
| "The framework demonstrates an F1 score of {f1} with p = {p}.", | |
| "Our findings establish {tech} as a practical remedy for {problem}.", | |
| ], | |
| "introduction": [ | |
| "The rapid growth of {entity} has made {problem} a central concern for {domain} [{r1}].", | |
| "Conventional safeguards struggle to keep pace with the scale of modern {entity} [{r2}].", | |
| "Recent advances in {tech} offer a promising direction for {domain}.", | |
| "However, existing deployments rarely integrate {method} in an end-to-end manner.", | |
| "In this paper we design, implement, and evaluate a {adj} pipeline that couples {tech} with {method}.", | |
| "Our contributions include a reference architecture on {tool} and an evaluation across {n} cases.", | |
| "The remainder of this paper reviews prior work, details the methodology, and reports results.", | |
| ], | |
| "literature_review": [ | |
| "Early studies of {tech} focused primarily on feasibility within {domain} [{r1}].", | |
| "Subsequent work between {y0} and {y1} shifted attention toward {method} [{r2}].", | |
| "Several authors report that {problem} remains the dominant failure mode in production systems [{r3}].", | |
| "Benchmark efforts using {tool} demonstrate significant gains in {metric} [{r4}].", | |
| "A recurring limitation across these studies is the absence of {adj} evaluation protocols.", | |
| "Surveys of {domain} consistently identify {entity} as the most vulnerable asset class [{r1}].", | |
| "Despite this progress, no prior work unifies {tech} and {method} under realistic workloads.", | |
| ], | |
| "methodology": [ | |
| "Our research design follows a controlled experimental protocol over {n} cases collected from {y0} to {y1}.", | |
| "The core of the system is {method} implemented on {tool}.", | |
| "Each instance of {entity} is normalized, segmented, and assigned a cryptographic provenance tag.", | |
| "We configure the {tech} layer with a three-stage validation pipeline to suppress {problem}.", | |
| "Hyper-parameters were selected by grid search, holding out 20% of cases for validation.", | |
| "Statistical significance is assessed with paired tests at alpha = 0.05.", | |
| "All experiments are repeated five times and we report the mean with confidence intervals.", | |
| ], | |
| "results": [ | |
| "The proposed framework improves {metric} by {imp}% relative to the strongest baseline.", | |
| "Across {n} cases the system attains an F1 score of {f1} with p = {p}.", | |
| "Ablation shows that removing {method} degrades performance by {imp2}%.", | |
| "Latency overhead introduced by the {tech} layer remains below acceptable operational thresholds.", | |
| "These results confirm that {adj} integration of {tool} is feasible at scale.", | |
| "Error analysis attributes most residual failures to noisy {entity}.", | |
| ], | |
| "conclusion": [ | |
| "We presented a {adj} {tech} framework that mitigates {problem} in {domain}.", | |
| "Evaluation over {n} cases demonstrated a {imp}% improvement in {metric}.", | |
| "Future work will extend {method} to cross-organizational settings.", | |
| "We will also study the long-term governance of {entity} under this architecture.", | |
| ], | |
| } | |
| A = { | |
| "abstract": [ | |
| "A {adj} architecture leveraging {tech} is introduced for {domain}.", | |
| "To counter {problem}, the design embeds {method} on top of {tool}.", | |
| "An evaluation spanning {n} cases records {imp}% better {metric}.", | |
| "F1 reaches {f1} and the effect is significant at p = {p}.", | |
| "The evidence positions {tech} as a credible answer to {problem}.", | |
| ], | |
| "introduction": [ | |
| "{problem} has become unavoidable as {entity} proliferate across {domain} [{r1}].", | |
| "Legacy protections were never engineered for today's volume of {entity} [{r2}].", | |
| "{tech} has recently matured into a viable foundation for {domain}.", | |
| "Yet end-to-end adoption of {method} remains rare in deployed systems.", | |
| "Here we build and assess a {adj} stack uniting {tech} with {method}.", | |
| "We contribute a {tool} reference design plus a study of {n} cases.", | |
| "The paper proceeds through related work, methods, and findings.", | |
| ], | |
| "literature_review": [ | |
| "Initial investigations asked whether {tech} could work at all inside {domain} [{r1}].", | |
| "From {y0} to {y1}, the community pivoted toward {method} [{r2}].", | |
| "Multiple groups observe that {problem} still dominates operational incidents [{r3}].", | |
| "Evaluations built on {tool} report meaningful movement in {metric} [{r4}].", | |
| "What these efforts share is a lack of {adj} testing regimes.", | |
| "Review articles repeatedly single out {entity} as the weakest link [{r1}].", | |
| "Still missing is a treatment that joins {tech} and {method} under production load.", | |
| ], | |
| "methodology": [ | |
| "We run a controlled experiment on {n} cases gathered between {y0} and {y1}.", | |
| "{method} sits at the heart of the platform, realized with {tool}.", | |
| "Every {entity} record is cleaned, partitioned, and stamped with provenance metadata.", | |
| "A three-phase validation chain in the {tech} layer guards against {problem}.", | |
| "Grid search over a 20% held-out split fixes all hyper-parameters.", | |
| "Paired significance testing uses alpha = 0.05 throughout.", | |
| "Five repetitions per condition yield means and confidence bounds.", | |
| ], | |
| "results": [ | |
| "{metric} improves by {imp}% over the best competing baseline.", | |
| "On {n} cases the platform reaches F1 = {f1} at p = {p}.", | |
| "Dropping {method} in ablation costs {imp2}% of performance.", | |
| "Overhead from the {tech} layer stays within operational budgets.", | |
| "{adj} deployment of {tool} therefore scales in practice.", | |
| "Most remaining errors trace back to corrupted {entity}.", | |
| ], | |
| "conclusion": [ | |
| "This work delivered a {adj} {tech} stack that curbs {problem} in {domain}.", | |
| "A study of {n} cases yielded {imp}% gains in {metric}.", | |
| "Extending {method} across organizations is the next step.", | |
| "Governance of {entity} over long horizons also merits study.", | |
| ], | |
| } | |
| def sample_vals(rng): | |
| return dict(imp=int(rng.randint(38, 82)), imp2=int(rng.randint(9, 36)), | |
| n=int(rng.randint(120, 950)), | |
| p=round(float(rng.uniform(0.001, 0.04)), 3), | |
| f1=round(float(rng.uniform(0.81, 0.96)), 2), | |
| y0=int(rng.randint(2015, 2019)), y1=int(rng.randint(2019, 2023)), | |
| r1=int(rng.randint(1, 11)), r2=int(rng.randint(1, 11)), | |
| r3=int(rng.randint(1, 11)), r4=int(rng.randint(1, 11))) | |
| def render_sections(terms, vals, rng, alt=False): | |
| tpl = A if alt else P | |
| mapping = {**terms, **vals} | |
| secs = {} | |
| for sec in SECTIONS: | |
| pool = tpl[sec] | |
| k = min(len(pool), 6) | |
| idx = rng.choice(len(pool), size=k, replace=False) | |
| secs[sec] = " ".join(pool[i].format(**mapping) for i in sorted(idx)) | |
| return secs | |
| def make_refs(terms, rng): | |
| titles = [ | |
| "A survey of {tech} in {domain}", "{method}: opportunities and challenges", | |
| "Securing {entity} with {tech}", "Towards {adj} {domain}", | |
| "Mitigating {problem} using {method}", "{tool} in practice", | |
| "Benchmarking {metric} under {tech}", "Rethinking {problem}", | |
| "On the limits of {tech} for {entity}", "{domain}: a systematic review", | |
| "Adaptive {method} for dynamic environments", | |
| "Privacy and {entity}: an empirical study", | |
| "A framework for {adj} deployment of {tool}", | |
| "Deep evaluation of {method} at scale", | |
| ] | |
| refs = [] | |
| for t in titles: | |
| a = str(rng.choice(SURNAMES)) | |
| v = str(rng.choice(VENUES)) | |
| y = int(rng.randint(2015, 2024)) | |
| refs.append(f'{a[0]}. {a}, "{t.format(**terms).capitalize()}," {v}, {y}') | |
| return refs | |
| def make_title(terms, rng, alt=False): | |
| forms = (["{adj} {tech} for {domain}: an empirical study", | |
| "Mitigating {problem} with {method}", | |
| "{tech} meets {domain}: design and evaluation"] if not alt else | |
| ["Rethinking {domain} through {adj} {tech}", | |
| "{method} against {problem}: a new architecture"]) | |
| return str(rng.choice(forms)).format(**terms).capitalize() | |
| def paper_txt(title, secs, refs): | |
| head = {"abstract": "Abstract", "introduction": "1. Introduction", | |
| "literature_review": "2. Literature Review", | |
| "methodology": "3. Methodology", "results": "4. Results", | |
| "conclusion": "5. Conclusion"} | |
| lines = [title, ""] | |
| for k in SECTIONS: | |
| lines += [head[k], secs[k], ""] | |
| lines.append("References") | |
| lines += [f"[{i + 1}] {r}." for i, r in enumerate(refs)] | |
| return "\n".join(lines) | |
| def main(): | |
| os.makedirs(CORPUS_DIR, exist_ok=True) | |
| os.makedirs(SUB_DIR, exist_ok=True) | |
| rng = np.random.RandomState(123) | |
| topic_refs = {k: make_refs(t, rng) for k, t in TOPICS.items()} | |
| forced_tiers = {"bh02": 1, "io01": 1, "io05": 2, "tg02": 1} | |
| corpus = {} | |
| for key, terms in TOPICS.items(): | |
| for i in range(12): | |
| doc_id = f"{key}{i:02d}" | |
| vals = sample_vals(rng) | |
| secs = render_sections(terms, vals, rng, alt=False) | |
| refs = [str(r) for r in rng.choice(topic_refs[key], 9, replace=False)] | |
| other = str(rng.choice([k for k in TOPICS if k != key])) | |
| refs += [str(r) for r in rng.choice(topic_refs[other], 2, replace=False)] | |
| tier = forced_tiers.get(doc_id, | |
| int(rng.choice([1, 2, 3, 4], | |
| p=[0.4, 0.3, 0.2, 0.1]))) | |
| doc = {"doc_id": doc_id, "title": make_title(terms, rng), | |
| "sections": secs, "references": refs, "tier": tier, | |
| "year": int(rng.randint(2016, 2024)), | |
| "topic": key, "vals": vals} | |
| corpus[doc_id] = doc | |
| with open(os.path.join(CORPUS_DIR, f"{doc_id}.json"), "w", | |
| encoding="utf-8") as f: | |
| json.dump(doc, f, indent=1) | |
| # ---- submissions ------------------------------------------------------- | |
| subs = {} | |
| vals = sample_vals(rng) | |
| secs = render_sections(CLEAN_TOPIC, vals, rng) | |
| subs["clean"] = paper_txt(make_title(CLEAN_TOPIC, rng), secs, | |
| make_refs(CLEAN_TOPIC, rng)[:9]) | |
| src = corpus["bh02"] | |
| vals = sample_vals(rng) | |
| secs = render_sections(TOPICS["bh"], vals, rng) | |
| secs["literature_review"] = src["sections"]["literature_review"] | |
| secs["methodology"] = src["sections"]["methodology"] | |
| refs = [str(r) for r in rng.choice(topic_refs["bh"], 8, replace=False)] | |
| subs["clone"] = paper_txt(make_title(TOPICS["bh"], rng), secs, refs) | |
| s1, s2 = corpus["io01"], corpus["io05"] | |
| vals = sample_vals(rng) | |
| secs = render_sections(TOPICS["io"], vals, rng) | |
| secs["literature_review"] = mosaic_mix( | |
| sentences(s1["sections"]["literature_review"]), | |
| sentences(s2["sections"]["literature_review"]), rng) | |
| secs["results"] = synonymize(s1["sections"]["results"], rng, p=0.5) | |
| refs = [str(r) for r in rng.choice(topic_refs["io"], 8, replace=False)] | |
| subs["mosaic"] = paper_txt(make_title(TOPICS["io"], rng), secs, refs) | |
| src = corpus["tg02"] | |
| rng_idea = np.random.RandomState(777) | |
| secs = render_sections(TOPICS["tg"], src["vals"], rng_idea, alt=True) | |
| refs = [str(r) for r in rng_idea.choice(src["references"], 6, replace=False)] | |
| subs["idea"] = paper_txt(make_title(TOPICS["tg"], rng_idea, alt=True), | |
| secs, refs) | |
| for name, txt in subs.items(): | |
| with open(os.path.join(SUB_DIR, f"{name}.txt"), "w", encoding="utf-8") as f: | |
| f.write(txt) | |
| truth = {"clean": ["CLEAN"], "clone": ["PLAGIARIZED"], | |
| "mosaic": ["PLAGIARIZED", "SUSPICIOUS"], | |
| "idea": ["SUSPICIOUS", "PLAGIARIZED"]} | |
| with open(os.path.join(SUB_DIR, "truth.json"), "w", encoding="utf-8") as f: | |
| json.dump(truth, f, indent=1) | |
| print(f"corpus: {len(corpus)} docs -> {CORPUS_DIR}") | |
| print(f"submissions: {list(subs)} -> {SUB_DIR}") | |
| if __name__ == "__main__": | |
| main() | |