Rileva domande duplicate


20

Rileva domande duplicate

C'era una volta un campo da golf. Aveva un problema: le persone avrebbero posto domande simili o identiche ancora e ancora. Tu sei statoscelto selezionato arruolato forzatamente ricattato ha chiesto di automatizzare il processo di decisione se una domanda è un duplicato di una esistente, con qualsiasi mezzo necessario (vedi Regole).

Ingresso

Il tuo programma deve accettare un singolo URL come input. Si può presumere che ciò porti a una domanda su codegolf.stackexchange.com .

Produzione

Cerca nel sito domande simili. Se ritieni che la domanda di input sia un duplicato di una domanda esistente (o viceversa), genera l'URL dell'altra domanda. È possibile generare più URL, separati da nuove righe. Alla fine dell'output, output end(su una riga separata).

punteggio

  • Se una domanda che hai emesso è stata effettivamente contrassegnata come duplicata della domanda di input (o viceversa), ottieni 4 punti. Questa è una "ipotesi corretta".
  • Per ogni falso positivo (noto anche come "ipotesi errata"), perdi 2 punti.
  • Per ogni domanda che era in realtà un duplicato ma non appare nel tuo output (aka "ipotesi mancante"), perdi 1 punto.

Vince il punteggio più alto dopo aver gestito 32 domande di input. Queste 32 domande sono un "round". All'inizio di ogni round, i punteggi verranno reimpostati su 0. Verrà eseguito un round ogni pochi giorni e la classifica verrà aggiornata dopo ogni round.

Regole

  • Se le domande A e C sono entrambe chiuse come duplicati di B, A verrà conteggiato come duplicato di C e viceversa.
  • All'inizio di ogni round, il tuo programma potrebbe non essere in possesso di dati relativi a domande (ad es. Nessuna codifica hardware ), ad eccezione di come analizzare il sito Web.
  • Tuttavia, è possibile conservare i dati in file esterni durante un round.
  • Nessun dato può essere conservato tra i round.
  • L'output deve avere una nuova riga finale.
  • Non è possibile utilizzare alcun dato dal sito Web tranne i risultati della ricerca e l'URL, il titolo, i tag e il testo di una domanda , con o senza formattazione. Ad esempio, non è possibile utilizzare il testo "contrassegnato come duplicato da pippo, barra ..." che appare su domande duplicate.
  • È possibile recuperare questi dati direttamente dal sito, tramite data.SE o tramite l'API.
  • Ogni invio deve avere un nome.
  • Ogni invio deve avere una numerazione delle versioni chiara.
  • Se un invio non produce risultati dopo un limite di tempo (da stabilire; si prega di indicare quanto tempo impiega l'invio) verrà ucciso e perderà 8 punti.

2
1 minuto non è soggettivo? Le connessioni di rete e la ricerca per indicizzazione porteranno a un numero enorme di richieste Web. Potrebbe facilmente richiedere più di 1 minuto per tutti :)
Ottimizzatore

4
Penso che non possiamo arrivare direttamente a quel numero, potresti dover scrivere tu stesso un programma di esempio (o usare la prima risposta) per determinare il tempo di soglia corretto.
Ottimizzatore

7
Invece di raschiare il sito, dovresti passare attraverso l'API e specificare quali campi possono essere utilizzati.
Gilles 'SO- smetti di essere malvagio' il

5
Sarebbe così divertente se questa domanda fosse un duplicato .. oh l'ironia xD
Teun Pronk,

3
@professorfish Potresti davvero usare alcuni casi di test, ecco qui. Tutti questi dati provengono da Data.SE, quindi dovrebbero essere affidabili. Sentiti libero di farmi sembrare sciocco e dimostrarmi di sbagliarmi. Questa domanda ha codegolf.stackexchange.com/q/37737 non ha duplicati. Questa domanda codegolf.stackexchange.com/q/12348 ha questo codegolf.stackexchange.com/q/10465 Questa domanda codegolf.stackexchange.com/q/12498 ha questi codegolf.stackexchange.com/q/20006 codegolf.stackexchange.com/ q / 242
PenutReaper

Risposte:


3

Python 3

Sto dando a questa voce il nome The Differ.

Codice:

import urllib.request, gzip, re, json, difflib, sys
API_URL = "https://api.stackexchange.com/"
qurl = input()
qid = int(re.search("\d+",qurl).group(0))
def request(url,wrapper=False,**params):
    params.setdefault("filter","withbody")
    params.setdefault("site","codegolf")
    url = API_URL + url + "?"+"&".join([str(k)+"="+str(v) for k,v in params.items()])
    compressed_response = urllib.request.urlopen(url)
    response = gzip.decompress(compressed_response.read()).decode("utf8")
    response_object = json.loads(response)
    if wrapper:
        return response_object
    else:
        return response_object["items"]
question = request("questions/%s"%qurl)[0]
tags = ";".join(question["tags"])
title = question["title"]
escaped = title.replace(" ","%20")
related = request("similar",title=escaped,pagesize=100)
hasmore = False
length = sys.maxsize
for tag in question["tags"]:
    result = request("search",tagged=tag,
                     wrapper=True,
                     filter="!-*f(6rc.cI8O",
                     pagesize=100)
    if result["total"] < length:
        length = result["total"]
        related.extend(result["items"])
        hasmore = result["has_more"]
        besttag = tag
related.extend(best)
if length < 1500:
    for page in itertools.count(2):
        if not hasmore:
            break
        response = request("search",
                           tagged=besttag,
                           page=page,
                           pagesize=100,
                           filter="!-*f(6rc.cI8O",
                           wrapper=True)
        hasmore = response["has_more"]
        related.extend(result["items"])
matcher = difflib.SequenceMatcher(None, question["body"], None)
titlematcher = difflib.SequenceMatcher(None, question["title"], None)
seen = set()
seen.add(question["question_id"])
for possible in related:
    matcher.set_seq2(possible["body"])
    titlematcher.set_seq2(possible["title"])
    score = matcher.ratio()+titlematcher.ratio()
    qid = possible["question_id"]
    if score > .85 and qid not in seen:
        print(qid)
        seen.add(qid)
print("end")

Il filtro "!-*f(6rc.cI8O"includeva il totalparametro sull'oggetto wrapper globale e il bodyparametro sulle domande.

Questa voce effettua due richieste API più una per tag sulla domanda più una per cento domande nel tag meno utilizzato. Se colpisce un acceleratore api (che non controlla per), aumenterà unurllib.error.HTTPError: HTTP Error 400: Bad Request

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.