---
name: score_demand_signal
kind: function
lang: py
domain: datascience
version: "1.0.0"
purity: pure
signature: "def score_demand_signal(text: str, phrases: list[str] = None) -> dict"
description: "Puntua una pieza de texto por senales de demanda de mercado: cuenta frases tipo 'i wish there was', 'looking for a tool', 'willing to pay' que indican demanda latente de una solucion. Funcion pura y determinista para clasificar posts/comentarios en pipelines de market intelligence."
tags: [market-intel, demand, scoring, text, nlp, pure, datascience]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: text
    desc: "texto a analizar (ej: titulo + cuerpo de un post de Reddit/HN concatenados)"
  - name: phrases
    desc: "lista de frases-senal a buscar por substring case-insensitive. Si None, usa el catalogo por defecto orientado a demanda de herramientas/SaaS (15 frases)"
output: "dict con {demand_score: int (nº de frases distintas que matchearon), matched_phrases: list[str] (frases coincidentes en minusculas)}"
tested: true
tests:
  - "frase por defecto matchea (i wish there was)"
  - "varias frases matchean suman score"
  - "ninguna frase matchea da score 0"
  - "match es case-insensitive"
  - "phrases custom override del default"
  - "texto vacio da score 0"
test_file_path: "python/functions/datascience/score_demand_signal_test.py"
file_path: "python/functions/datascience/score_demand_signal.py"
---

## Ejemplo

```python
from datascience import score_demand_signal

result = score_demand_signal("I wish there was a tool to dedupe my CSVs")
# {"demand_score": 2, "matched_phrases": ["i wish there was", "is there a tool"]}
# (matchea "i wish there was" y, dentro de "is there a tool"? -> ver Gotchas)

# Con frases custom
score_demand_signal("Necesito automatizar esto", phrases=["necesito"])
# {"demand_score": 1, "matched_phrases": ["necesito"]}
```

## Cuando usarla

Usala para clasificar posts y comentarios en pipelines de market intelligence:
tras recolectar texto con `fetch_reddit_search` o `fetch_hackernews_search`,
puntua cada fila para detectar demanda latente ("alguien busca una herramienta
que no existe"). Un `demand_score >= 1` marca el item como senal de oportunidad.

## Gotchas

- El match es por **substring**, no por palabra completa: frases solapadas o
  contenidas en otras pueden contar (ej. una frase que sea prefijo de otra del
  catalogo). El catalogo por defecto esta curado para minimizar solapes, pero al
  pasar `phrases` custom conviene evitar frases que sean substring unas de otras
  si quieres conteos disjuntos.
- Solo cuenta **frases distintas** del catalogo: si una misma frase aparece 3
  veces en el texto, suma 1, no 3.
- `text=None` se trata como cadena vacia (score 0), no lanza error.
