Ir para o conteúdo

Visualização e Qualidade de Dados no Wikidata/Avaliação de Qualidade no Wikidata/Recoin/script

De Wikiversidade
Recoin-logo

O Recoin é uma ferramenta baseada no Wikidata que estima a completude relativa de um item comparando-o com itens semelhantes (por classe ou profissão) e destaca propriedades relevantes que ainda estão ausentes. Uma barra de classificação com cinco níveis (de “muito básico” a “muito detalhado”) e listas expansíveis de propriedades/IDs ausentes são exibidas diretamente na página do item para orientar editores e informar consumidores de dados sobre o grau de informação disponível.[1][2]

Como funciona

[editar | editar código]

O Recoin consulta o serviço SPARQL do Wikidata e utiliza tabelas de frequências pré-computadas (no Toolforge) para identificar, por classe/profissão, quais propriedades são mais comuns e quais faltam no item atual. O cálculo agrega as frequências em um escore de completude (níveis 1 a 5) e retorna, em JSON (ou JSONP), as principais propriedades/IDs ausentes, que a ferramenta renderiza na interface.[2]

Classificação de completude

[editar | editar código]

A escala do Recoin resume a completude relativa pela média de frequência das 5 principais propriedades ausentes para itens comparáveis. Em linhas gerais: nível 5 (0–5%), 4 (5–10%), 3 (10–25%), 2 (25–50%), 1 (50%+).[2]

Ativação do Recoin

[editar | editar código]

Para usar o Recoin na interface do Wikidata, ative a ferramenta (extensão de usuário/gadgets) em: Preferências → Gadgets → Recoin: Relative Completeness Indicator.[1][2]

API pública

[editar | editar código]

Além do gadget, há uma API no Toolforge que retorna JSON (ou JSONP) com o escore de completude e as propriedades/IDs ausentes:

Propriedades
https://recoin.toolforge.org/getmissingattributes.php?lang=

xx&subject=QID&n=10..100

Identificadores externos (IDs)
https://recoin.toolforge.org/getmissingattributes_id.php?lang=

xx&subject=QID&n=10..100

Por classe (lista de propriedades mais frequentes de uma classe)
https://recoin.toolforge.org/getbyclassid.php?subject=

QID_da_classe&n=200

Parâmetros principais: subject (Q-id), lang (código ISO da interface), n (quantos atributos/IDs listar). A API também aceita callback para JSONP (ver explicação abaixo).[1][3]

O que é JSONP?

[editar | editar código]

JSONP (JSON with Padding) é uma técnica pré-CORS para contornar a política de mesma origem em requisições cross-domain usando uma tag <script>. O servidor envolve o JSON em uma chamada de função (p.ex., callback({...})), e bibliotecas como jQuery interpretam automaticamente a resposta quando você usa callback=? em $.getJSON. Observações: funciona somente com GET, não suporta cabeçalhos personalizados, com limitações de segurança em comparação ao CORS. A API do Recoin oferece JSON puro (sem callback) e JSONP (com callback=...), o que facilita o uso direto no gadget.[4]

Exemplos de uso do Recoin em Python

[editar | editar código]

1) Obter e imprimir o JSON bruto (inclui tratamento de JSONP quando houver)

[editar | editar código]
# Exemplo didático: consulta à API do Recoin com tolerância a JSONP
# Requisitos: requests

import requests, json, re

def fetch_recoin(endpoint, subject="Q569965", lang="pt", n=20, timeout=30):
"""
endpoint: 'attributes' para propriedades ausentes ou 'ids' para identificadores externos ausentes.
subject: QID (ex.: 'Q569965').
lang: código de idioma (ex.: 'pt', 'en').
n: número máximo de itens sugeridos.
Retorno: dicionário Python com o payload JSON.
Observação: se o servidor responder em JSONP (callback(...)), removemos o 'wrapper'.
"""
base = (
"https://recoin.toolforge.org/getmissingattributes.php
"
if endpoint == "attributes"
else "https://recoin.toolforge.org/getmissingattributes_id.php
"
)
params = {"subject": subject, "lang": lang, "n": int(n)}
# Dica: deixe SEM 'callback' para priorizar JSON puro; o gadget usa JSONP, mas a API aceita ambos.
headers = {"User-Agent": "RecoinDocsExample/1.0 (+https://pt.wikiversity.org/)"}

r = requests.get(base, params=params, timeout=timeout, headers=headers)
r.raise_for_status()
txt = r.text.strip()

# Remoção robusta de JSONP: callbackName({...})
m = re.match(r'^[a-zA-Z_$][\w$]*\((.*)\)$', txt, flags=re.S)
if m:
    txt = m.group(1)

return json.loads(txt)

# Consultas: propriedades ausentes e IDs ausentes

data_props = fetch_recoin("attributes", subject="Q569965", lang="pt", n=20)
data_ids = fetch_recoin("ids", subject="Q569965", lang="pt", n=20)

print("Chaves disponíveis (propriedades):", list(data_props.keys()))

# Em algumas versões, a lista vem em 'missing_properties'

exemplo = (data_props.get("missing_properties")
or data_props.get("missing")
or data_props.get("attributes")
or [])[:1]
print("Exemplo de registro:", exemplo)

2) DataFrame com as principais propriedades ausentes

[editar | editar código]
# Requisitos: pandas

import pandas as pd

def to_df_missing(data):
"""
Normaliza diferentes variações de chaves para uma mesma estrutura tabular.
Principais campos observados na API: 'missing_properties' (lista), e em cada item:
- 'property' (PXXX), 'label' (rótulo), 'base_frequency' (frequência na classe),
'data_type' (tipo de valor), possivelmente 'present' (booleano), 'score'/'weight'.
"""
missing = (data.get("missing_properties")
or data.get("missing_attributes")
or data.get("missing")
or data.get("attributes")
or [])
rows = []
for m in missing:
rows.append({
"property": m.get("property") or m.get("pid") or m.get("p"),
"label": m.get("label") or m.get("name"),
"freq": m.get("base_frequency") or m.get("frequency") or m.get("support"),
"present": m.get("present"),
"score": m.get("score") or m.get("weight"),
"data_type": m.get("data_type")
})
return pd.DataFrame(rows)

df_props_pt = to_df_missing(data_props)
print(df_props_pt.head(10))

3) Comparar interface em dois idiomas (português vs inglês)

[editar | editar código]
# Obter payloads em PT e EN

data_pt = fetch_recoin("attributes", subject="Q569965", lang="pt", n=20)
data_en = fetch_recoin("attributes", subject="Q569965", lang="en", n=20)

df_pt = to_df_missing(data_pt).assign(lang="pt")
df_en = to_df_missing(data_en).assign(lang="en")

# Junção por propriedade para ver interseções, rótulos e frequências por idioma

merged = df_pt.merge(df_en, on="property", how="outer", suffixes=("_pt", "_en"))
print(merged[["property","label_pt","label_en","freq_pt","freq_en"]].head(15))

4) Listar identificadores externos ausentes (IDs)

[editar | editar código]
ids_pt = fetch_recoin("ids", subject="Q569965", lang="pt", n=20)
df_ids = to_df_missing(ids_pt)
print(df_ids.head(10))
Observações:
  • API pode aplicar rate limits e ocasionalmente responder via JSONP; o código acima remove o wrapper do callback, quando presente.
  • O número e a nomenclatura de chaves no JSON podem variar com atualizações (p.ex., missing_properties, missing, attributes); os exemplos são tolerantes a nomes de campos.
  • Valores do score de completude são relativos e não mede correção das afirmações; ele prioriza propriedades frequentes entre itens comparáveis.[1][2]

Boas práticas e limitações

[editar | editar código]

Comparabilidade: resultados mais úteis ao editar itens de uma mesma classe/profissão (p.ex., comparar especialidades acadêmicas entre si).

Múltiplas classes/profissões: o cálculo pondera frequências quando o item pertence a mais de uma classe/profissão.

IDs externos: há um endpoint específico para sugerir identificadores ausentes (útil para enriquecer ligações a bases externas).[1][2]

Referências

[editar | editar código]
  1. 1,0 1,1 1,2 1,3 1,4 Wikidata:Recoin. Wikidata. Página visitada em 8 de setembro de 2025.
  2. 2,0 2,1 2,2 2,3 2,4 2,5 Balaraman, Vevake; Razniewski, Simon; Nutt, Werner (abril de 2018). «Recoin: Relative Completeness in Wikidata». WWW ’18 Companion (The Web Conference) (em inglês). doi:10.1145/3184558.3191641 
  3. ReCoin — Data Quality Days 2022 (slides) (em en). Página visitada em 2025-09-08.
  4. MediaWiki:Gadget-Recoin.js (em en). Página visitada em 2025-09-08.