ตรวจสอบคำถามที่ซ้ำกัน


20

ตรวจสอบคำถามที่ซ้ำกัน

กาลครั้งหนึ่งมีสนามกอล์ฟ มีปัญหา: ผู้คนจะโพสต์คำถามที่คล้ายกันหรือเหมือนกันซ้ำแล้วซ้ำอีก คุณเคยไปเลือกแล้วถูกเกณฑ์ทหารเกณฑ์แบล็กเมล์ ขอให้กระบวนการตัดสินใจโดยอัตโนมัติว่าคำถามนั้นซ้ำกับคำถามที่มีอยู่แล้วหรือไม่โดยใช้วิธีการใดก็ได้ที่จำเป็น (ดูกฎ)

อินพุต

โปรแกรมของคุณต้องยอมรับ URL เดียวเป็นอินพุต มันอาจจะคิดว่านี้นำไปสู่คำถามบนcodegolf.stackexchange.com

เอาท์พุต

ค้นหาเว็บไซต์สำหรับคำถามที่คล้ายกัน หากคุณคิดว่าคำถามอินพุตนั้นซ้ำกับคำถามที่มีอยู่ (หรือในทางกลับกัน) ให้ส่งออก URL ของคำถามอื่น คุณสามารถส่งออกหลาย URL คั่นด้วยบรรทัดใหม่ ในตอนท้ายของเอาต์พุตของคุณเอาต์พุตend(บนบรรทัดแยก)

เกณฑ์การให้คะแนน

  • หากคำถามที่คุณส่งออกถูกทำเครื่องหมายว่าซ้ำกับคำถามอินพุต (หรือในทางกลับกัน) คุณจะได้คะแนน 4 คะแนน นี่คือ "เดาถูกต้อง"
  • สำหรับแต่ละค่าบวกปลอม (aka "เดาไม่ถูกต้อง") คุณเสีย 2 คะแนน
  • สำหรับคำถามแต่ละข้อที่ซ้ำกันจริง ๆ แต่ไม่ปรากฏในผลลัพธ์ของคุณ (หรือที่รู้จักว่า "หายไปเดา") เสีย 1 คะแนน

คะแนนสูงสุดหลังจากจัดการคำถามอินพุต 32 คำถามชนะ 32 คำถามเหล่านี้เป็น "รอบ" ในตอนต้นของแต่ละรอบคะแนนจะถูกรีเซ็ตเป็น 0 หนึ่งรอบจะถูกเรียกใช้ทุกสองสามวันและกระดานผู้นำจะอัปเดตหลังจากแต่ละรอบ

กฎระเบียบ

  • หากคำถาม A และ C ถูกปิดทั้งคู่เนื่องจากซ้ำกันของ B A จะนับเป็นซ้ำของ C และในทางกลับกัน
  • ในช่วงเริ่มต้นของแต่ละรอบโปรแกรมของคุณอาจไม่มีข้อมูลใด ๆ เกี่ยวกับคำถามใด ๆ (เช่นไม่มีการเข้ารหัส ) ยกเว้นวิธีการแยกวิเคราะห์เว็บไซต์
  • อย่างไรก็ตามคุณอาจเก็บข้อมูลไว้ในไฟล์ภายนอกในระหว่างรอบ
  • ไม่มีข้อมูลอาจถูกเก็บไว้ระหว่างรอบ
  • ผลลัพธ์ของคุณจะต้องมีบรรทัดใหม่ต่อท้าย
  • คุณไม่สามารถใช้ข้อมูลใด ๆ จากเว็บไซต์ยกเว้นผลการค้นหาและ URL ชื่อแท็กและข้อความของคำถามโดยมีหรือไม่มีการจัดรูปแบบ ตัวอย่างเช่นคุณไม่สามารถใช้ข้อความ "ทำเครื่องหมายว่าซ้ำโดย foo, bar ... " ที่ปรากฏในคำถามที่ซ้ำกัน
  • คุณสามารถดึงข้อมูลนี้ได้โดยตรงจากเว็บไซต์ผ่าน data.SE หรือผ่านทาง API
  • การส่งแต่ละครั้งจะต้องมีชื่อ
  • การส่งแต่ละครั้งจะต้องมีหมายเลขรุ่นที่ชัดเจน
  • หากการส่งไม่ส่งออกหลังจากกำหนดเวลา (ต้องตัดสินใจโปรดระบุว่าการส่งของคุณใช้เวลานานเท่าใด) มันจะถูกฆ่าและเสีย 8 คะแนน

2
ไม่ใช่ 1 นาทีอัตนัยใช่ไหม การเชื่อมต่อเครือข่ายและการรวบรวมข้อมูลจะทำให้มีคำขอทางเว็บจำนวนมาก อาจใช้เวลามากกว่า 1 นาทีสำหรับทุกคนอย่างง่ายดาย :)
เครื่องมือเพิ่มประสิทธิภาพ

4
ฉันคิดว่าเราไม่สามารถมาที่หมายเลขนั้นโดยตรงคุณอาจต้องเขียนโปรแกรมตัวอย่างด้วยตัวเอง (หรือใช้คำตอบแรก) เพื่อกำหนดเวลาที่ถูกต้อง
เครื่องมือเพิ่มประสิทธิภาพ

7
แทนที่จะคัดลอกไซต์คุณควรผ่าน API และระบุว่าจะใช้ฟิลด์ใด
Gilles 'หยุดความชั่วร้าย'

5
มันคงจะตลกมากถ้าคำถามนี้ซ้ำซ้อน .. โอ้คำประชด xD
Teun Pronk

3
@professorfish คุณสามารถใช้กรณีทดสอบได้จริง ข้อมูลนี้ทั้งหมดมาจาก Data.SE ดังนั้นจึงควรเชื่อถือได้ รู้สึกอิสระที่จะทำให้ฉันดูโง่และพิสูจน์ฉันผิด คำถามนี้มีcodegolf.stackexchange.com/q/37737ไม่มีการซ้ำซ้อน คำถามนี้codegolf.stackexchange.com/q/12348มีนี้codegolf.stackexchange.com/q/10465 คำถามนี้codegolf.stackexchange.com/q/12498มีเหล่าcodegolf.stackexchange.com/q/20006 codegolf.stackexchange.com/ q / 242
PenutReaper

คำตอบ:


3

Python 3

The Differฉันให้รายการนี้ชื่อ

รหัส:

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

ตัวกรองนั้น"!-*f(6rc.cI8O"รวมtotalพารามิเตอร์ไว้บนวัตถุ wrapper โกลบอลและbodyพารามิเตอร์ของคำถาม

รายการนี้สร้างคำขอ API สองคำขอและอีกหนึ่งแท็กต่อคำถามและอีกหนึ่งคำถามต่อร้อยรายการในแท็กที่ใช้น้อยที่สุด ถ้ามันชนกับเค้น API (ซึ่งไม่ได้ตรวจสอบ) มันจะเพิ่มurllib.error.HTTPError: HTTP Error 400: Bad Request

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.