Yinelenen Soruları Algıla


20

Yinelenen Soruları Algıla

Bir zamanlar bir golf sahası vardı. Bir sorunu vardı: insanlar tekrar tekrar benzer veya özdeş sorular yayınlayacaklardı. Bulundunseçilen seçilmiş zorla askılı şantaj bir sorunun mevcut ne olursa olsun bir sorunun kopyası olup olmadığına karar verme sürecini otomatikleştirmek istendi (Kurallara bakınız).

Giriş

Programınızın girdi olarak tek bir URL'yi kabul etmesi gerekir. Bunun codegolf.stackexchange.com adresinde bir soruya yol açtığı varsayılabilir .

Çıktı

Benzer sorular için sitede arama yapın. Giriş sorusunun mevcut bir sorunun kopyası olduğunu (veya tersini) düşünüyorsanız, diğer sorunun URL'sini girin. Yeni satırlarla ayırarak birden çok URL çıkarabilirsiniz. Çıktınızın sonunda, çıktı end(ayrı bir satırda).

puanlama

  • Çıkardığınız bir soru gerçekten de giriş sorununun kopyası olarak işaretlenmişse (veya tersi), 4 puan alırsınız. Bu "doğru bir tahmindir".
  • Her yanlış pozitif (diğer bir deyişle "yanlış tahmin") için 2 puan kaybedersiniz.
  • Aslında yinelenen ancak çıktınızda görünmeyen (soru "eksik tahmin") her soru için 1 puan kaybetmek.

32 giriş sorusunu ele aldıktan sonra en yüksek puan kazanır. Bu 32 soru "yuvarlak". Her turun başında, skorlar 0'a sıfırlanacaktır. Birkaç günde bir bir tur oynanacak ve skor tablosu her turdan sonra güncellenecektir.

kurallar

  • A ve C sorularının her ikisi de B'nin kopyaları olarak kapatılırsa, A, C'nin bir kopyası olarak sayılacaktır ve bunun tersi de geçerlidir.
  • Her turun başlangıcında, programınız web sitesinin nasıl ayrıştırılacağı dışında herhangi bir soru (yani kodlama yok ) hakkında herhangi bir veriye sahip olmayabilir .
  • Ancak, bir tur sırasında verileri harici dosyalarda tutabilirsiniz.
  • Mermiler arasında veri tutulamaz.
  • Çıktınızda yeni bir satır olmalıdır.
  • Arama sonuçları ve URL, başlık, etiketler ve biçimlendirilmiş veya biçimlendirilmemiş bir sorunun metni dışında web sitesinden hiçbir veri kullanamazsınız . Örneğin, yinelenen sorularda görünen "foo, bar ... tarafından yinelenen olarak işaretlenmiş" metnini kullanamazsınız.
  • Bu verileri doğrudan siteden, data.SE veya API yoluyla alabilirsiniz.
  • Her gönderimin bir adı olmalıdır.
  • Her gönderinin açık sürüm numaralandırması olmalıdır.
  • Bir gönderim bir süre sınırından sonra çıktı üretmezse (karar verilecek; lütfen gönderiminizin ne kadar sürdüğünü belirtin) öldürülecek ve 8 puan kaybedilecektir.

2
1 dakika öznel değil mi? Ağ bağlantıları ve tarama, çok sayıda web isteğine yol açacaktır. Herkes için kolayca 1 dakikadan fazla sürebilir :)
Optimizer

4
Sanırım bu sayıya doğrudan gelemeyiz, doğru eşik süresini belirlemek için kendiniz bir örnek program yazmanız (veya ilk cevabı kullanmanız) gerekebilir.
Doktor

7
Siteyi kazımak yerine, API'yi gözden geçirmeli ve hangi alanların kullanılabileceğini belirtmelisiniz.
Gilles 'SO- kötü olmayı bırak'

5
Bu soru yineleniyorsa çok komik olurdu .. oh ironi xD
Teun Pronk

3
@professorfish Gerçekten bazı test senaryoları kullanabilirsiniz, işte burada. Bu verilerin tümü Data.SE'den geldi, bu yüzden güvenilir olmalı. Beni aptalca göstermekten ve yanlış olduğumu kanıtlamaktan çekinmeyin. Bu soruda codegolf.stackexchange.com/q/37737 kopya yok. Bu soru codegolf.stackexchange.com/q/12348 bu koda sahiptirggod.stackexchange.com/q/10465 Bu soru codegolf.stackexchange.com/q/12498 bu koda sahiptir. q / 242
PenutReaper

Yanıtlar:


3

Python 3

Bu girişe isim veriyorum The Differ.

Kod:

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

Filtre , genel sarma nesnesindeki parametreyi ve sorulardaki parametreyi "!-*f(6rc.cI8O"içeriyordu .totalbody

Bu giriş, iki API isteği artı sorudaki etiket başına bir tane ve en az kullanılan etiketindeki yüz soru başına bir tane yapar. Bir api gaza basarsa (kontrol etmez),urllib.error.HTTPError: HTTP Error 400: Bad Request

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.