FutureSearch Logofuturesearch
  • Pricing
  • Research
  • Docs
  • Evals
  • Markets
  • Blog
  • Company
  • Try it for free
FutureSearch Logo

General inquiry? You can reach us at hello@futuresearch.ai.

Company

TeamCareersPressPrivacy PolicyTerms of Service

Developers

SDK DocsAPI ReferenceCase StudiesGitHubSupport

Integrations

Claude CodeCursorChatGPT CodexClaude.ai

Track Record

Trading ResultsAccuracy EvalsTournament Standings

Follow Us

X (Twitter)@dschwarz26LinkedIn
FutureSearchdocs
Frontier forecasting
Installation
  • All install methods
  • Claude.ai
  • Claude Code
  • Web App
  • Python SDK
  • Skill
Reference
  • API Key
  • forecast
  • Forecasting a decision
  • multi_agent
  • agent_map
  • World Modeling
  • Published Forecasts
  • MCP Server
  • Progress Monitoring
Guides
  • Turn Claude into an Accurate Forecaster
  • Forecasting the outcomes of a decision
  • Forecast Outcomes for a List of Entities
  • Forecast Categorical and Threshold Questions
  • Find Profitable Prediction Market Trades
  • Research a Question with a Team of Agents
  • Add a Column via Web Research
  • Forecast Conditional Scenarios
  • Error Handling in FutureSearch: Failed Rows and Partial Results
Case Studies
  • Forecast a Decision: Grant Funding at Three Levels
  • Forecast a Decision: Which CEO Replacement Maximizes Share Price
  • Forecast a Binary Question End to End
  • Forecast a Date, Then Grade It
  • Forecast Categorical Outcomes for Two Stealth Labs
  • Forecast Conditional Scenarios for OpenAI's IPO
  • Forecast Anthropic and OpenAI IPOs: Dates and Valuations
  • Forecast a Sum-of-the-Parts SpaceX IPO Valuation
  • Forecast Founder Seed Valuations for AI Researchers
  • Find Startups Selling to Frontier AI Labs
  • Run 10,000 LLM Web Research Agents
FutureSearchby futuresearch
by futuresearch

Resolve Duplicate Entities

September 2026: the operations on this page (classify, dedupe, merge, rank) are deprecated and will be removed. They still work for now.

Consolidating records where the same entity appears under different spellings, abbreviations, and nicknames. Here, 500 messy CRM company records are resolved down to their unique entities -- handling typos, ticker symbols, and brand variants that string similarity misses entirely.

MetricValue
Records processed500
Unique entities~131-156
Duplicates resolved~344-369 (68-74%)
Cost~$0.74-2.02
Time~100s - 15 min

Go to futuresearch.ai/app, upload case_01_crm_data.csv, and enter:

Deduplicate this CRM dataset. Two entries are duplicates if they represent the same company.

500 records resolved to about 156 unique entities (68.8% duplicates removed). Results take about 15 minutes.

Add the FutureSearch connector if you haven't already. Then upload case_01_crm_data.csv and ask Claude:

Deduplicate this CRM dataset. Two entries are duplicates if they represent the same company.

500 records resolved to about 156 unique entities (68.8% duplicates removed). Results take about 15 minutes.

Add FutureSearch to Claude Code if you haven't already:

claude mcp add futuresearch --scope project --transport http https://mcp.futuresearch.ai/mcp

Download the dataset: case_01_crm_data.csv (500 messy company records with typos, abbreviations, and missing fields). With the CSV in your working directory, tell Claude:

Deduplicate this CRM dataset. Two entries are duplicates if they represent
the same company.

Claude calls FutureSearch's dedupe MCP tool:

Tool: futuresearch_dedupe
├─ equivalence_relation: "Two entries are duplicates if they represent the same company."
└─ input_csv: "/Users/you/case_01_crm_data.csv"

→ Submitted: 500 rows for deduplication.
  Task ID: d5d1...

Tool: futuresearch_progress
├─ task_id: "d5d1..."
→ Running: 0/500 complete (30s elapsed)

...

Tool: futuresearch_progress
→ Completed: 500/500 (0 failed) in 920s.

Tool: futuresearch_results
├─ task_id: "d5d1..."
├─ output_path: "/Users/you/crm_deduplicated.csv"
→ Saved 500 rows to /Users/you/crm_deduplicated.csv

500 records resolved to 156 unique entities.

pip install futuresearch
export FUTURESEARCH_API_KEY=your_key_here  # Get one at futuresearch.ai

We'll use a messy CRM dataset with 500 company records. To follow along, right click this link and save the CSV file to your computer.

import asyncio
import pandas as pd
from futuresearch.ops import dedupe

data = pd.read_csv("case_01_crm_data.csv").fillna("")

async def main():
    result = await dedupe(
        input=data,
        equivalence_relation="Two entries are duplicates if they represent the same company.",
    )

    # Filter to keep only the best record per entity
    unique = result.data[result.data["selected"] == True]
    print(f"Reduced {len(data)} records to {len(unique)} unique entities")

asyncio.run(main())

Results

The input data contains variations like these, all representing the same company:

company_namecontact_nameemail_address
AbbVie Inc.Richard Gonzalesinfo@abbvie-bio.com
AbbVie PharmaceuticalRichard Gonzales
Abbvieinfo@abbvie-bio.com
Abvie IncRichard Gonzales

The system clusters these into a single entity and selects the most complete record. The output includes equivalence_class_id and selected columns. Filter to selected == True to get one record per entity.

ClusterRecordsVariants
Palo Alto Networks8Pallow Alto, PANW, Palo Alto Net Inc, Paloalto Networks
Walmart Inc.8W-Mart, Wall-Mart, WMT Corp, Walmart Corporation
Uber Technologies8Ubar, Ubr, Uber Tech, Uber Corporation
ServiceNow6Service Now, Service-Now, SerivceNow, Service Now Inc

The system handles cases that string similarity misses entirely. "AAPL" matches to "Apple Inc." because the model knows the ticker symbol. "Big Blue" matches to "IBM Corporation" because that's IBM's nickname. "W-Mart" and "Wallmart" match to "Walmart Inc." despite having different typos.

The equivalence relation is flexible. For matching people: "Two entries are duplicates if they refer to the same person, accounting for name variations and nicknames." For products: "Two entries represent the same product if they're the same item sold under different names or SKUs."

See the full notebook for additional examples including how to merge the clustered records into consolidated entries.


Built with FutureSearch. See the dedupe documentation for more options.