Fuzzy String Matcher and Near-Duplicate Finder avatar

Fuzzy String Matcher and Near-Duplicate Finder

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Fuzzy String Matcher and Near-Duplicate Finder

Fuzzy String Matcher and Near-Duplicate Finder

Match strings against a candidate list or group near-duplicates with Levenshtein, Jaro-Winkler, Dice or token-set similarity and a score threshold. Pure compute, no network, no AI.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Aadam Ahmed

Aadam Ahmed

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Security

Limited permissions

Share

Fuzzy Match and Deduplicate Strings: Name Matching Tool

Fuzzy-match names, companies or product titles against a reference list, or group near-duplicates in one list, using Levenshtein, Damerau-Levenshtein, Jaro-Winkler, Dice or token-set similarity with a score threshold. Deterministic, no web calls, no AI.

What you get

Match mode: per query, the best candidates above your threshold with 0-1 scores and positions. Dedupe mode: per string, a cluster_id, the canonical string and the similarity to it.

Use cases

  • Name matching and record linkage: link messy CRM, supplier or customer names to a master list.
  • Deduplicate company names, product titles or addresses before import.
  • Typo-tolerant lookup for an AI agent (Jon Smyth finds John Smith).

Match messy strings (company names, people, product titles, addresses) against a reference list, or group near-duplicates inside one list. Pure compute: no web calls, no AI model, deterministic, so the same input always gives the same scores. Callable by developers and AI agents through Apify's MCP server (https://mcp.apify.com).

Algorithms (all scored 0 to 1): Levenshtein, Damerau-Levenshtein (optimal string alignment, counts a swap of two adjacent letters as one edit), Jaro-Winkler, Dice over character bigrams, token sort and token set (ignore word order and extra words).

  • match mode: for each query, the best candidates at or above your threshold, with scores and candidate positions, and the closest candidate when none qualify.
  • dedupe mode: one record per string with a cluster_id, the canonical (first-seen) string and its similarity to it.
  • Optional normalisation first: ignore case, strip accents, ignore punctuation, collapse spaces.

Input

FieldMeaning
modematch (default) or dedupe
queriesstrings to look up, or to group in dedupe mode (up to 20,000, each up to 500 characters)
candidatesmatch mode reference list (up to 20,000)
algorithm, thresholdsimilarity measure and minimum score (default Jaro-Winkler, 0.85)
maxMatchesmatches per query (1-20)
ignoreCase, stripAccents, ignorePunctuation, collapseWhitespacenormalisation, all on by default

Example input and output

Input (bundled test-input.json): four queries, five candidates, algorithm: token_set, threshold: 0.6, maxMatches: 2. Real output with token_set, threshold 0.6, for the query Mohamed Al Rashid:

{
"kind": "match", "index": 1, "query": "Mohamed Al Rashid", "matched": true,
"best_match": "Muhammad Al-Rashid", "best_score": 0.8333,
"matches": [ { "candidate": "Muhammad Al-Rashid", "candidate_index": 1, "score": 0.8333 } ],
"closest_below_threshold": null, "algorithm": "token_set", "threshold": 0.6, "error": null
}

Limitations (read before relying on it)

  • Scores are string similarity, not identity. Mohamed Al Rashid and Muhammad Al-Rashid can score well, but two different people can too. Always review matches before merging records, and pick the threshold on your own sample data; there is no universal good value.
  • No phonetic or language knowledge. It does not transliterate (Arabic and Latin spellings of the same name will not match; the sibling Arabic Text Toolkit Actor offers a name key for that), expand abbreviations or understand synonyms.
  • Dedupe is greedy and order-dependent. Each string is compared with the first member (canonical) of each existing cluster, so it is not transitive and the outcome can change if you reorder the list.
  • Size limits keep runs cheap: match mode allows at most 5,000,000 query x candidate comparisons; dedupe allows lists of up to about 3,000 strings in the worst case (all unique). Split bigger jobs.
  • The token-set measure is the author's own implementation in the spirit of the FuzzyWuzzy token_set_ratio; numbers are not guaranteed identical to that library. Jaro-Winkler uses the standard 0.1 prefix scale, 4-character prefix cap and 0.7 boost threshold (Winkler 1990). Levenshtein is computed on Unicode code points.

Pricing (pay per result)

Pay-per-event with Apify's built-in dataset-item event: each query (match) or each string (dedupe) is one result. The live price is set in Apify Console and shown on the Store page (see Store). Planning figure in our notes: USD 1.00 per 1,000 results. Existing fuzzy dedupe Actors work on whole datasets rather than plain strings (see apify/RESEARCH-3.md; prices were not visible in the search results).

FAQ

Does it call any service? No.

Can it deduplicate an Apify dataset directly? No; pass the strings (for example a name column) as input.

Which algorithm should I pick? token_set or token_sort for names and companies where word order or extra words vary; jaro_winkler for short names with typos. Test on your own sample.

Will it merge "Ltd" and "Limited"? No, it does not expand abbreviations. Example from the code: in dedupe mode with token_set and threshold 0.9, Acme Corporation Ltd and ACME Corporation Ltd. share a cluster, but Acme Corporation Limited starts its own.

Example score: Jon Smyth vs John Smith with jaro_winkler scores 0.917.