{
  "_id": "6a4d83f6d253724d3f6dcd23",
  "Package": "joinery",
  "Type": "Package",
  "Title": "Heuristic Index-Based Record Linkage",
  "Version": "1.0.1",
  "Authors@R": "person(\"Eduard\", \"Brüll\", email = \"eduard.bruell@zew.de\", role = c(\"aut\", \"cre\"))",
  "Description": "Links records that refer to the same entity across sources\nthat share no common key, such as people, firms, or addresses\nwith spelling variation, abbreviations, or reordered words.\nLinkage is described declaratively as a strategy that\nnormalises, tokenises, phonetically encodes, weights, and\nblocks each field; candidate pairs are then scored by the\nrarity-weighted overlap of their tokens and every score is\nattributed back to individual tokens for explainability.\nStrategies compose into staged pipelines of exact, fuzzy, and\noptional embedding-based matching that carry unmatched records\nforward and resolve entities as connected components. The same\nstrategy runs on an in-memory 'data.table' backend or an\nout-of-core 'DuckDB' backend, and diagnostic and calibration\ntools help tune a strategy and filter false positives. The\ntoken-retrieval heuristic follows Doherr (2023)\n<doi:10.2139/ssrn.4326848>.",
  "URL": "https://edubruell.github.io/joinery/,\nhttps://github.com/edubruell/joinery",
  "BugReports": "https://github.com/edubruell/joinery/issues",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Language": "en-GB",
  "Collate": "'joinery-package.R' 'import-standalone-purrr.R'\n'import-standalone-types-check.R'\n'import-standalone-obj-type.R' 'internal_validation.R'\n'internal_fanout.R' 'internal_progress.R' 'internal_chunking.R'\n'internal_staging.R' 'strategy_step.R' 'strategy_smoothing.R'\n'strategy_search.R' 'strategy_blocking.R'\n'strategy_embedding.R' 'strategy_exact.R' 'generics_core.R'\n'generics_calibration.R' 'generics_embedding.R'\n'methods_datatable_prepare.R' 'methods_datatable_resolve.R'\n'methods_datatable_materialize.R' 'methods_datatable_dedup.R'\n'methods_datatable_search.R' 'methods_datatable_multistage.R'\n'methods_datatable_inspect.R' 'embedding_cache.R'\n'embedding_methods_datatable.R' 'exact_methods_datatable.R'\n'methods_tibble.R' 'embedding_methods_tibble.R'\n'preparer_word.R' 'preparer_tokens.R' 'duckdb_control.R'\n'methods_duckdb_batch.R' 'methods_duckdb_prepare.R'\n'methods_duckdb_resolve.R' 'methods_duckdb_materialize.R'\n'methods_duckdb_dedup.R' 'methods_duckdb_search.R'\n'methods_duckdb_multistage.R' 'methods_duckdb_inspect.R'\n'preparer_stopwords.R' 'embedding_methods_duckdb.R'\n'exact_methods_duckdb.R' 'calibration_aip.R'\n'generics_diagnostic.R' 'diagnostic_classes.R'\n'calibration_classes.R' 'diagnostic_recommendations.R'\n'diagnostic_summarise.R' 'diagnostic_audit.R'\n'diagnostic_compare.R' 'diagnostic_explain.R'\n'diagnostic_sample.R' 'diagnostic_rarity.R' 'plan_strategy.R'\n'calibration_labelling.R' 'calibration_features.R'\n'calibration_features_embedding.R' 'calibration_filter.R'\n'calibration_tidymodels.R' 'calibration_dispatch.R'\n'calibration_calibrate.R' 'calibration_recipe.R'\n'diagnostic_plots.R' 'data.R'",
  "RoxygenNote": "7.3.3",
  "LazyData": "true",
  "VignetteBuilder": "knitr",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-07-07 22:50:45 UTC",
    "User": "root"
  },
  "Author": "Eduard Brüll [aut, cre]",
  "Maintainer": "Eduard Brüll <eduard.bruell@zew.de>",
  "Repository": "https://cran.r-universe.dev",
  "Date/Publication": "2026-07-07 19:40:19 UTC",
  "RemoteUrl": "https://github.com/cran/joinery",
  "RemoteRef": "HEAD",
  "RemoteSha": "bb1fe41906a76f79059a3bcd1edce7ed56afc19d",
  "_user": "cran",
  "_type": "src",
  "_file": "joinery_1.0.1.tar.gz",
  "_fileid": "https://r2.ropensci.org/829927f1361501c785eabf634c44b2405c03fbc6a7b739599b798d491d65b393",
  "_filesize": 1101121,
  "_sha256": "829927f1361501c785eabf634c44b2405c03fbc6a7b739599b798d491d65b393",
  "_expires": "2026-10-15T22:55:48.000Z",
  "_created": "2026-07-07T22:50:45.000Z",
  "_published": "2026-07-07T22:55:49.897Z",
  "_jobs": [
    {
      "job": 85747551066,
      "time": 260,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "8153487917"
    },
    {
      "job": 85747551039,
      "time": 235,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8153481234"
    },
    {
      "job": 85747004755,
      "time": 233,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8153410074"
    },
    {
      "job": 85747551027,
      "time": 174,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "8153463288"
    }
  ],
  "_host": "GitHub-Actions",
  "_buildurl": "https://github.com/r-universe/cran/actions/runs/28903980552",
  "_status": "success",
  "_upstream": "https://github.com/cran/joinery",
  "_commit": {
    "id": "bb1fe41906a76f79059a3bcd1edce7ed56afc19d",
    "author": "Eduard Brüll <eduard.bruell@zew.de>",
    "committer": "cran-robot <csardi.gabor+cran@gmail.com>",
    "message": "version 1.0.1\n",
    "time": 1783453219
  },
  "_maintainer": {
    "name": "Eduard Brüll",
    "email": "eduard.bruell@zew.de"
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.1.0",
      "role": "Depends"
    },
    {
      "package": "S7",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "version": ">= 1.1.0",
      "role": "Imports"
    },
    {
      "package": "data.table",
      "role": "Imports"
    },
    {
      "package": "igraph",
      "role": "Imports"
    },
    {
      "package": "stringi",
      "role": "Imports"
    },
    {
      "package": "phonics",
      "role": "Imports"
    },
    {
      "package": "lubridate",
      "role": "Imports"
    },
    {
      "package": "cli",
      "role": "Imports"
    },
    {
      "package": "glue",
      "role": "Imports"
    },
    {
      "package": "tinyplot",
      "role": "Imports"
    },
    {
      "package": "graphics",
      "role": "Imports"
    },
    {
      "package": "duckdb",
      "role": "Suggests"
    },
    {
      "package": "DBI",
      "role": "Suggests"
    },
    {
      "package": "dbplyr",
      "role": "Suggests"
    },
    {
      "package": "dplyr",
      "role": "Suggests"
    },
    {
      "package": "tidyllm",
      "role": "Suggests"
    },
    {
      "package": "tibble",
      "role": "Suggests"
    },
    {
      "package": "stringdist",
      "role": "Suggests"
    },
    {
      "package": "generics",
      "role": "Suggests"
    },
    {
      "package": "parsnip",
      "role": "Suggests"
    },
    {
      "package": "recipes",
      "role": "Suggests"
    },
    {
      "package": "workflows",
      "role": "Suggests"
    },
    {
      "package": "yardstick",
      "role": "Suggests"
    },
    {
      "package": "probably",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "withr",
      "role": "Suggests"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    }
  ],
  "_owner": "cran",
  "_selfowned": false,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-28",
      "n": 2
    }
  ],
  "_tags": [
    {
      "name": "1.0.0",
      "date": "2026-07-07"
    },
    {
      "name": "1.0.1",
      "date": "2026-07-07"
    }
  ],
  "_stars": 0,
  "_userbio": {
    "uuid": 6899542,
    "type": "organization",
    "name": "cran",
    "followers": 617,
    "description": "Unofficial read-only mirror of all CRAN R packages"
  },
  "_downloads": {
    "count": 0,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/joinery"
  },
  "_devurl": "https://github.com/edubruell/joinery",
  "_pkgdown": "https://edubruell.github.io/joinery/",
  "_searchresults": 9,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/joinery.html",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "LICENSE",
    "manual.pdf"
  ],
  "_cranurl": false,
  "_releases": [
    {
      "version": "1.0.0",
      "date": "2026-07-07"
    },
    {
      "version": "1.0.1",
      "date": "2026-07-07"
    }
  ],
  "_exports": [
    "ambiguity_plot",
    "apply_filter",
    "approximate_date",
    "as_cologne",
    "as_metaphone",
    "as_soundex",
    "audit_strategy",
    "batch_map",
    "block_on_tokens",
    "block_size_plot",
    "calibrate",
    "calibrate_matches",
    "clear_embedding_cache",
    "cluster_size_plot",
    "compare_stages",
    "compute_embeddings",
    "compute_rarity",
    "contribution_plot",
    "coverage_plot",
    "date_tokens",
    "deduplicate_table",
    "detect_duplicates",
    "drop_joinery_temp_tables",
    "drop_numeric_tokens",
    "drop_short_tokens",
    "duckdb_batch_plan",
    "duckdb_control",
    "embedding_strategy",
    "exact_strategy",
    "explain_match",
    "export_for_labelling",
    "extract_initials",
    "extract_unmatched",
    "filter_stopwords",
    "find_stopwords",
    "fit_filter",
    "frontier_plot",
    "fuzzy_tokens",
    "generate_ngrams",
    "import_labels",
    "inspect_tokens",
    "joinery_recipe",
    "match_features",
    "materialize_records",
    "multi_stage_dedup",
    "multi_stage_search",
    "norm_plot",
    "normalize_date",
    "normalize_street",
    "normalize_text",
    "numeric_tokens",
    "plan_strategy",
    "prepare_search_data",
    "rarity_distribution",
    "rarity_histogram",
    "recommendations",
    "resolve_entities",
    "sample_matches",
    "score_density",
    "score_embeddings",
    "score_histogram",
    "search_candidates",
    "search_strategy",
    "similarity_histogram",
    "smooth_rip_identity",
    "smooth_rip_log",
    "smooth_rip_offset",
    "smooth_rip_softmax",
    "stage_coverage_plot",
    "stage_score_plot",
    "strip_vowels",
    "summarise_matches",
    "token_contribution_plot",
    "token_frequency_plot",
    "token_shapes",
    "top_gap_density",
    "use_dictionary",
    "vocab_overlap_plot",
    "word_tokens"
  ],
  "_datasets": [
    {
      "name": "base_example",
      "title": "Base dataset for record linkage example",
      "object": "base_example",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "id_base",
        "Vorname",
        "Nachname",
        "Strasse",
        "Hausnummer",
        "Ort",
        "Kreis"
      ],
      "rows": 3300,
      "table": true,
      "tojson": true
    },
    {
      "name": "match_labels_example",
      "title": "Labelled candidate pairs for calibration examples",
      "object": "match_labels_example",
      "class": [
        "data.frame"
      ],
      "fields": [
        "match_id",
        "score",
        "source",
        "id",
        "workshop",
        "proprietor",
        "trade",
        "postcode_area",
        "gen_tier",
        "actual_link",
        "rank",
        "equal"
      ],
      "rows": 1862,
      "table": true,
      "tojson": true
    },
    {
      "name": "street_stopwords",
      "title": "Multilingual Street-Name Stopwords",
      "object": "street_stopwords",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "stopword",
        "lang"
      ],
      "rows": 58,
      "table": true,
      "tojson": true
    },
    {
      "name": "street_types",
      "title": "Multilingual Street-Type Normalization Dictionary",
      "object": "street_types",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "canonical",
        "variant",
        "type",
        "lang"
      ],
      "rows": 143,
      "table": true,
      "tojson": true
    },
    {
      "name": "target_example",
      "title": "Target dataset for record linkage example",
      "object": "target_example",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "actual_link",
        "Vorname",
        "Nachname",
        "Strasse",
        "Hausnummer",
        "Ort",
        "Kreis",
        "id_target"
      ],
      "rows": 3000,
      "table": true,
      "tojson": true
    },
    {
      "name": "workshop_listings",
      "title": "Workshop external directory (target) for record linkage examples",
      "object": "workshop_listings",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "listing_id",
        "workshop",
        "proprietor",
        "trade",
        "postcode_area",
        "town",
        "actual_link",
        "gen_tier"
      ],
      "rows": 894,
      "table": true,
      "tojson": true
    },
    {
      "name": "workshop_panel",
      "title": "Multi-year workshop panel for cross-year linkage examples",
      "object": "workshop_panel",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "record_id",
        "year",
        "workshop",
        "proprietor",
        "trade",
        "postcode_area",
        "town",
        "established",
        "true_entity",
        "change_tier"
      ],
      "rows": 847,
      "table": true,
      "tojson": true
    },
    {
      "name": "workshop_register",
      "title": "Workshop guild register (base) for record linkage examples",
      "object": "workshop_register",
      "class": [
        "tbl_df",
        "tbl",
        "data.frame"
      ],
      "fields": [
        "reg_no",
        "workshop",
        "proprietor",
        "trade",
        "legal_form",
        "postcode_area",
        "town",
        "address",
        "established",
        "employees",
        "apprentices",
        "guild_member",
        "sic",
        "true_entity",
        "gen_tier"
      ],
      "rows": 1052,
      "table": true,
      "tojson": true
    }
  ],
  "_help": [
    {
      "page": "ambiguity_plot",
      "title": "Bar chart of candidates-per-record distribution (candidates only)",
      "topics": [
        "ambiguity_plot"
      ]
    },
    {
      "page": "apply_filter",
      "title": "Apply a fitted filter to match features",
      "topics": [
        "apply_filter"
      ]
    },
    {
      "page": "approximate_date",
      "title": "Approximate dates by rounding to coarser time units",
      "concept": [
        "date preparers"
      ],
      "topics": [
        "approximate_date"
      ]
    },
    {
      "page": "as_cologne",
      "title": "Encode text phonetically with the Cologne procedure",
      "concept": [
        "phonetic encoders"
      ],
      "topics": [
        "as_cologne"
      ]
    },
    {
      "page": "as_metaphone",
      "title": "Encode text phonetically with Metaphone",
      "concept": [
        "phonetic encoders"
      ],
      "topics": [
        "as_metaphone"
      ]
    },
    {
      "page": "as_soundex",
      "title": "Encode text phonetically with Soundex",
      "concept": [
        "phonetic encoders"
      ],
      "topics": [
        "as_soundex"
      ]
    },
    {
      "page": "audit_strategy",
      "title": "Audit a Search Strategy Against Data",
      "topics": [
        "audit_strategy"
      ]
    },
    {
      "page": "base_example",
      "title": "Base dataset for record linkage example",
      "topics": [
        "base_example"
      ]
    },
    {
      "page": "batch_map",
      "title": "Apply a function to DuckDB table batches",
      "topics": [
        "batch_map"
      ]
    },
    {
      "page": "block_on_tokens",
      "title": "Block on a Column's Rare Tokens (region-free blocking)",
      "topics": [
        "block_on_tokens"
      ]
    },
    {
      "page": "block_size_plot",
      "title": "Bar chart of block sizes (requires block_by on strategy)",
      "topics": [
        "block_size_plot"
      ]
    },
    {
      "page": "calibrate",
      "title": "Evaluate a fitted filter on labelled pairs",
      "topics": [
        "calibrate"
      ]
    },
    {
      "page": "calibrate_matches",
      "title": "Calibrate matches end-to-end (features -> filter -> apply)",
      "topics": [
        "calibrate_matches"
      ]
    },
    {
      "page": "clear_embedding_cache",
      "title": "Clear the embedding reuse cache",
      "topics": [
        "clear_embedding_cache"
      ]
    },
    {
      "page": "cluster_size_plot",
      "title": "Bar chart of cluster-size distribution (duplicates only)",
      "topics": [
        "cluster_size_plot"
      ]
    },
    {
      "page": "compare_stages",
      "title": "Compare Stages of a Multi-Stage Match",
      "topics": [
        "compare_stages"
      ]
    },
    {
      "page": "compute_embeddings",
      "title": "Compute Embeddings for Records",
      "topics": [
        "compute_embeddings"
      ]
    },
    {
      "page": "compute_rarity",
      "title": "Compute Token Rarity for Record Linkage",
      "topics": [
        "compute_rarity"
      ]
    },
    {
      "page": "contribution_plot",
      "title": "Horizontal bar chart of per-column score contributions",
      "topics": [
        "contribution_plot"
      ]
    },
    {
      "page": "coverage_plot",
      "title": "Bar chart of match coverage (base and/or target)",
      "topics": [
        "coverage_plot"
      ]
    },
    {
      "page": "date_tokens",
      "title": "Extract date components as tokens",
      "concept": [
        "date preparers"
      ],
      "topics": [
        "date_tokens"
      ]
    },
    {
      "page": "deduplicate_table",
      "title": "Deduplicate a Table",
      "topics": [
        "deduplicate_table"
      ]
    },
    {
      "page": "detect_duplicates",
      "title": "Detect Duplicate Records",
      "topics": [
        "detect_duplicates"
      ]
    },
    {
      "page": "drop_joinery_temp_tables",
      "title": "Drop all temporary DuckDB tables created by joinery",
      "topics": [
        "drop_joinery_temp_tables"
      ]
    },
    {
      "page": "drop_numeric_tokens",
      "title": "Drop numeric (house-number) tokens from token lists",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "drop_numeric_tokens"
      ]
    },
    {
      "page": "drop_short_tokens",
      "title": "Drop short tokens from token lists",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "drop_short_tokens"
      ]
    },
    {
      "page": "duckdb_batch_plan",
      "title": "Create a Batch Plan for DuckDB Table Processing",
      "topics": [
        "duckdb_batch_plan"
      ]
    },
    {
      "page": "duckdb_control",
      "title": "DuckDB Execution Control",
      "topics": [
        "Duckdb_Control",
        "duckdb_control"
      ]
    },
    {
      "page": "embedding_strategy",
      "title": "Create an Embedding Strategy",
      "topics": [
        "Embedding_Strategy",
        "embedding_strategy"
      ]
    },
    {
      "page": "exact_strategy",
      "title": "Define an Exact Matching Strategy",
      "topics": [
        "Exact_Strategy",
        "exact_strategy"
      ]
    },
    {
      "page": "explain_match",
      "title": "Explain a Single Match",
      "topics": [
        "explain_match"
      ]
    },
    {
      "page": "export_for_labelling",
      "title": "Export a match sample to CSV for manual labelling",
      "topics": [
        "export_for_labelling"
      ]
    },
    {
      "page": "extract_initials",
      "title": "Extract initials from tokens",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "extract_initials"
      ]
    },
    {
      "page": "extract_unmatched",
      "title": "Extract Unmatched Records",
      "topics": [
        "extract_unmatched"
      ]
    },
    {
      "page": "filter_stopwords",
      "title": "Filter out stopwords from token lists",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "filter_stopwords"
      ]
    },
    {
      "page": "find_stopwords",
      "title": "Discover candidate stopwords from a prepared token table",
      "topics": [
        "find_stopwords"
      ]
    },
    {
      "page": "fit_filter",
      "title": "Fit a false-positive filter on labelled match pairs",
      "topics": [
        "fit_filter"
      ]
    },
    {
      "page": "frontier_plot",
      "title": "Cost/recall frontier scatter for a strategy plan",
      "topics": [
        "frontier_plot"
      ]
    },
    {
      "page": "fuzzy_tokens",
      "title": "Collapse near-duplicate tokens to a canonical form",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "fuzzy_tokens"
      ]
    },
    {
      "page": "generate_ngrams",
      "title": "Generate character n-grams from text",
      "concept": [
        "token generators"
      ],
      "topics": [
        "generate_ngrams"
      ]
    },
    {
      "page": "import_labels",
      "title": "Import a labelled CSV back into a feature/label table",
      "topics": [
        "import_labels"
      ]
    },
    {
      "page": "inspect_tokens",
      "title": "Inspect Tokens for a Specific Column",
      "topics": [
        "inspect_tokens"
      ]
    },
    {
      "page": "joinery_recipe",
      "title": "Build a tidymodels recipe for calibration features",
      "topics": [
        "joinery_recipe"
      ]
    },
    {
      "page": "match_features",
      "title": "Build a per-pair feature table for calibration",
      "topics": [
        "Match_Features",
        "match_features"
      ]
    },
    {
      "page": "match_labels_example",
      "title": "Labelled candidate pairs for calibration examples",
      "topics": [
        "match_labels_example"
      ]
    },
    {
      "page": "materialize_records",
      "title": "Materialize Records by ID",
      "topics": [
        "materialize_records"
      ]
    },
    {
      "page": "multi_stage_dedup",
      "title": "Staged Duplicate Detection (within one table)",
      "topics": [
        "multi_stage_dedup"
      ]
    },
    {
      "page": "multi_stage_search",
      "title": "Staged Search Across Tables or Sources",
      "topics": [
        "multi_stage_search"
      ]
    },
    {
      "page": "norm_plot",
      "title": "Bar chart of embedding norm quantiles",
      "topics": [
        "norm_plot"
      ]
    },
    {
      "page": "normalize_date",
      "title": "Normalize dates to ISO 8601 format (YYYY-MM-DD)",
      "concept": [
        "date preparers"
      ],
      "topics": [
        "normalize_date"
      ]
    },
    {
      "page": "normalize_street",
      "title": "Normalize street names across languages",
      "concept": [
        "text normalizers"
      ],
      "topics": [
        "normalize_street"
      ]
    },
    {
      "page": "normalize_text",
      "title": "Normalize text for matching",
      "concept": [
        "text normalizers"
      ],
      "topics": [
        "normalize_text"
      ]
    },
    {
      "page": "numeric_tokens",
      "title": "Tokenize numeric fields, expanding ranges into individual numbers",
      "concept": [
        "token generators"
      ],
      "topics": [
        "numeric_tokens"
      ]
    },
    {
      "page": "plan_strategy",
      "title": "Plan a Search Strategy from Raw Inputs",
      "topics": [
        "plan_strategy"
      ]
    },
    {
      "page": "prepare_search_data",
      "title": "Prepare Data for Record Linkage Search",
      "topics": [
        "prepare_search_data"
      ]
    },
    {
      "page": "rarity_distribution",
      "title": "Read the Token Rarity Distribution",
      "topics": [
        "rarity_distribution"
      ]
    },
    {
      "page": "rarity_histogram",
      "title": "Bar chart of median token rarity per column",
      "topics": [
        "rarity_histogram"
      ]
    },
    {
      "page": "recommendations",
      "title": "Recommendations from a Diagnostic Object",
      "topics": [
        "recommendations"
      ]
    },
    {
      "page": "resolve_entities",
      "title": "Group Matched Pairs into Entities",
      "topics": [
        "resolve_entities"
      ]
    },
    {
      "page": "sample_matches",
      "title": "Sample Matches for Review",
      "topics": [
        "sample_matches"
      ]
    },
    {
      "page": "score_density",
      "title": "Kernel density of the score distribution",
      "topics": [
        "score_density"
      ]
    },
    {
      "page": "score_embeddings",
      "title": "Score Embedding Pairs Using Cosine Similarity",
      "topics": [
        "score_embeddings"
      ]
    },
    {
      "page": "score_histogram",
      "title": "Bar chart of the pre-binned score distribution",
      "topics": [
        "score_histogram"
      ]
    },
    {
      "page": "search_candidates",
      "title": "Search for Candidate Matches Between Tables",
      "topics": [
        "search_candidates"
      ]
    },
    {
      "page": "search_strategy",
      "title": "Define a Search Strategy for Record Linkage",
      "topics": [
        "Search_Strategy",
        "search_strategy"
      ]
    },
    {
      "page": "similarity_histogram",
      "title": "Histogram of sampled pairwise cosine similarities",
      "topics": [
        "similarity_histogram"
      ]
    },
    {
      "page": "smooth_rip",
      "title": "Configure rIP smoothing for a search strategy",
      "topics": [
        "smooth_rip",
        "smooth_rip_identity",
        "smooth_rip_log",
        "smooth_rip_offset",
        "smooth_rip_softmax"
      ]
    },
    {
      "page": "stage_coverage_plot",
      "title": "Line plot of cumulative base coverage by stage",
      "topics": [
        "stage_coverage_plot"
      ]
    },
    {
      "page": "stage_score_plot",
      "title": "Grouped bar chart of score distributions by stage",
      "topics": [
        "stage_score_plot"
      ]
    },
    {
      "page": "street_stopwords",
      "title": "Multilingual Street-Name Stopwords",
      "topics": [
        "street_stopwords"
      ]
    },
    {
      "page": "street_types",
      "title": "Multilingual Street-Type Normalization Dictionary",
      "topics": [
        "street_types"
      ]
    },
    {
      "page": "strip_vowels",
      "title": "Strip vowels from text (consonant skeleton)",
      "concept": [
        "text normalizers"
      ],
      "topics": [
        "strip_vowels"
      ]
    },
    {
      "page": "summarise_matches",
      "title": "Summarise a Match Result",
      "topics": [
        "summarise_matches"
      ]
    },
    {
      "page": "target_example",
      "title": "Target dataset for record linkage example",
      "topics": [
        "target_example"
      ]
    },
    {
      "page": "token_contribution_plot",
      "title": "Horizontal bar chart of per-token score contributions, coloured by column",
      "topics": [
        "token_contribution_plot"
      ]
    },
    {
      "page": "token_frequency_plot",
      "title": "Bar chart of average tokens per record per column",
      "topics": [
        "token_frequency_plot"
      ]
    },
    {
      "page": "token_shapes",
      "title": "Convert tokens to shape signatures",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "token_shapes"
      ]
    },
    {
      "page": "top_gap_density",
      "title": "Bar chart of top-1 vs top-2 score gap distribution (candidates only)",
      "topics": [
        "top_gap_density"
      ]
    },
    {
      "page": "use_dictionary",
      "title": "Map tokens to canonical groups with a lookup table",
      "concept": [
        "token transformers"
      ],
      "topics": [
        "use_dictionary"
      ]
    },
    {
      "page": "vocab_overlap_plot",
      "title": "Bar chart of vocabulary overlap between base and target per column",
      "topics": [
        "vocab_overlap_plot"
      ]
    },
    {
      "page": "word_tokens",
      "title": "Split text into word tokens",
      "concept": [
        "token generators"
      ],
      "topics": [
        "word_tokens"
      ]
    },
    {
      "page": "workshop_listings",
      "title": "Workshop external directory (target) for record linkage examples",
      "topics": [
        "workshop_listings"
      ]
    },
    {
      "page": "workshop_panel",
      "title": "Multi-year workshop panel for cross-year linkage examples",
      "topics": [
        "workshop_panel"
      ]
    },
    {
      "page": "workshop_register",
      "title": "Workshop guild register (base) for record linkage examples",
      "topics": [
        "workshop_register"
      ]
    }
  ],
  "_pkglogo": "https://github.com/cran/joinery/raw/HEAD/man/figures/logo.png",
  "_readme": "https://github.com/cran/joinery/raw/HEAD/README.md",
  "_rundeps": [
    "BH",
    "cli",
    "cpp11",
    "data.table",
    "generics",
    "glue",
    "igraph",
    "lattice",
    "lifecycle",
    "lubridate",
    "magrittr",
    "Matrix",
    "phonics",
    "pkgconfig",
    "Rcpp",
    "rlang",
    "S7",
    "stringi",
    "timechange",
    "tinyplot",
    "vctrs"
  ],
  "_vignettes": [
    {
      "source": "joinery.Rmd",
      "filename": "joinery.html",
      "title": "Getting started with joinery",
      "engine": "knitr::rmarkdown",
      "headings": [
        "The problem",
        "How joinery thinks about a match",
        "1. Look at the data",
        "2. Declare a strategy",
        "Preparers: how a column becomes tokens",
        "The other arguments",
        "3. Will it work? (check before you match)",
        "4. Deduplicate the base table",
        "5. Search across tables",
        "6. Did it work, and why this pair?",
        "7. Score against the answer key",
        "8. Multistage matching",
        "Exact matching as a first gate",
        "Composing stages",
        "9. Where to look next"
      ],
      "created": "2026-07-07 09:30:07",
      "modified": "2026-07-07 09:30:07",
      "commits": 1
    }
  ],
  "_score": 2.6989700043360187,
  "_indexed": true,
  "_nocasepkg": "joinery",
  "_universes": [
    "cran",
    "edubruell"
  ],
  "_previous": "1.0.0",
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "1.0.1",
      "date": "2026-07-07T22:53:36.000Z",
      "distro": "resolute",
      "commit": "bb1fe41906a76f79059a3bcd1edce7ed56afc19d",
      "fileid": "https://r2.ropensci.org/e61d58073889904cc9065ef3b7506498b909c0a037681e1ff4bea93f407f1462",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/28903980552"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "1.0.1",
      "date": "2026-07-07T22:53:31.000Z",
      "distro": "resolute",
      "commit": "bb1fe41906a76f79059a3bcd1edce7ed56afc19d",
      "fileid": "https://r2.ropensci.org/dcd2453ac033ec07ba224f436b40e81304218468894d1ae79f266b7844ca4b1f",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/28903980552"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "1.0.1",
      "date": "2026-07-07T22:54:01.000Z",
      "commit": "bb1fe41906a76f79059a3bcd1edce7ed56afc19d",
      "fileid": "https://r2.ropensci.org/188e0f80d9191974e7012ad20e994474dfaf27be4a05d66aef7608b91b1af525",
      "status": "success",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/28903980552"
    }
  ]
}