Deteksi Pertanyaan Gandakan


20

Deteksi Pertanyaan Gandakan

Sekali waktu, ada situs golf. Itu memiliki masalah: orang akan memposting pertanyaan yang sama atau identik berulang kali. Anda telahdipilih dipaksa wajib militer diperas diminta untuk mengotomatiskan proses memutuskan apakah suatu pertanyaan merupakan duplikat dari pertanyaan yang ada, dengan cara apa pun yang diperlukan (lihat Aturan).

Memasukkan

Program Anda harus menerima satu URL sebagai masukan. Mungkin diasumsikan bahwa ini mengarah ke pertanyaan pada codegolf.stackexchange.com .

Keluaran

Cari situs untuk pertanyaan serupa. Jika Anda berpikir bahwa pertanyaan input adalah duplikat dari pertanyaan yang ada (atau sebaliknya), tampilkan URL pertanyaan lain. Anda dapat menampilkan beberapa URL, dipisahkan oleh baris baru. Di akhir output Anda, output end(pada jalur terpisah).

Mencetak gol

  • Jika sebuah pertanyaan yang Anda hasilkan memang ditandai sebagai duplikat dari pertanyaan input (atau sebaliknya), Anda mencetak 4 poin. Ini adalah "tebakan yang benar".
  • Untuk setiap false positive (alias "dugaan salah"), Anda kehilangan 2 poin.
  • Untuk setiap pertanyaan yang sebenarnya merupakan duplikat tetapi tidak muncul dalam output Anda (alias "tebakan hilang"), kehilangan 1 poin.

Skor tertinggi setelah menangani 32 pertanyaan input menang. 32 pertanyaan ini adalah "putaran". Pada awal setiap putaran, skor akan diatur ulang ke 0. Satu putaran akan dijalankan setiap beberapa hari, dan papan peringkat diperbarui setelah setiap putaran.

Aturan

  • Jika pertanyaan A dan C keduanya ditutup sebagai duplikat B, A akan dianggap sebagai duplikat C dan sebaliknya.
  • Pada awal setiap putaran, program Anda mungkin tidak memiliki data apa pun tentang pertanyaan apa pun (yaitu, tidak ada hardcoding ), kecuali tentang cara menguraikan situs web.
  • Namun, Anda dapat menyimpan data dalam file eksternal selama putaran.
  • Tidak ada data yang dapat disimpan di antara putaran.
  • Output Anda harus memiliki baris baru yang tertinggal.
  • Anda tidak boleh menggunakan data apa pun dari situs web kecuali hasil pencarian dan URL, judul, tag, dan teks pertanyaan , dengan atau tanpa format. Misalnya, Anda tidak boleh menggunakan teks "ditandai sebagai duplikat oleh foo, bar ..." yang muncul pada pertanyaan duplikat.
  • Anda dapat mengambil data ini langsung dari situs, melalui data.SE atau melalui API.
  • Setiap pengiriman harus memiliki nama.
  • Setiap pengiriman harus memiliki penomoran versi yang jelas.
  • Jika suatu pengiriman tidak menghasilkan keluaran setelah batas waktu (untuk diputuskan; harap sebutkan berapa lama pengiriman Anda) itu akan terbunuh dan kehilangan 8 poin.

2
Bukankah 1 menit subjektif? Koneksi dan perayapan jaringan akan menyebabkan sejumlah besar permintaan web. Mungkin lebih mudah dari 1 menit untuk semua orang :)
Pengoptimal

4
Saya pikir kita tidak dapat datang ke nomor itu secara langsung, Anda mungkin harus menulis contoh program sendiri (atau menggunakan jawaban pertama) untuk menentukan waktu ambang yang benar.
Pengoptimal

7
Alih-alih mengikis situs, Anda harus menelusuri API, dan menentukan bidang mana yang dapat digunakan.
Gilles 'SANGAT berhenti menjadi jahat'

5
Akan sangat lucu jika pertanyaan ini adalah duplikat .. oh ironi xD
Teun Pronk

3
@professorfish Anda benar-benar dapat menggunakan beberapa test case, ini dia. Semua data ini berasal dari Data.SE, jadi itu harus dapat diandalkan. Merasa bebas untuk membuat saya terlihat konyol dan membuktikan saya salah. Pertanyaan ini memiliki codegolf.stackexchange.com/q/37737 tidak memiliki duplikat. Pertanyaan ini codegolf.stackexchange.com/q/12348 memiliki codegolf ini.stackexchange.com/q/10465 Pertanyaan ini codegolf.stackexchange.com/q/12498 memiliki codegolf.stackexchange.com/q/20006 codegolf.stackexchange.com/ ini q / 242
PenutReaper

Jawaban:


3

Python 3

Saya memberikan entri ini nama The Differ.

Kode:

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")

Filter "!-*f(6rc.cI8O"termasuk totalparameter pada objek global wrapper dan bodyparameter pada pertanyaan.

Entri ini membuat dua permintaan API ditambah satu per tag pada pertanyaan plus satu per seratus pertanyaan dalam tag yang paling sedikit digunakan. Jika itu mengenai api throttle (yang tidak diperiksa), itu akan menaikkanurllib.error.HTTPError: HTTP Error 400: Bad Request

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.