Fuzzy String Matcher and Near-Duplicate Finder
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Security
Limited permissionsShare
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 SmythfindsJohn 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
| Field | Meaning |
|---|---|
mode | match (default) or dedupe |
queries | strings to look up, or to group in dedupe mode (up to 20,000, each up to 500 characters) |
candidates | match mode reference list (up to 20,000) |
algorithm, threshold | similarity measure and minimum score (default Jaro-Winkler, 0.85) |
maxMatches | matches per query (1-20) |
ignoreCase, stripAccents, ignorePunctuation, collapseWhitespace | normalisation, 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 RashidandMuhammad Al-Rashidcan 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.