Phát hiện các câu hỏi trùng lặp


20

Phát hiện các câu hỏi trùng lặp

Ngày xửa ngày xưa, có một địa điểm chơi gôn. Nó có một vấn đề: mọi người sẽ đăng câu hỏi tương tự hoặc giống hệt nhau nhiều lần. Bạn đã từnglựa chọn bắt buộc bị bắt buộc tống tiền được yêu cầu tự động hóa quá trình quyết định xem một câu hỏi có phải là một bản sao của câu hỏi hiện có hay không, bằng bất kỳ phương tiện nào cần thiết (xem Quy tắc).

Đầu vào

Chương trình của bạn phải chấp nhận một URL làm đầu vào. Nó có thể cho rằng điều này dẫn đến một câu hỏi trên codegolf.stackexchange.com .

Đầu ra

Tìm kiếm các trang web cho câu hỏi tương tự. Nếu bạn nghĩ rằng câu hỏi đầu vào là một bản sao của câu hỏi hiện có (hoặc ngược lại), hãy xuất URL của câu hỏi khác. Bạn có thể xuất nhiều URL, cách nhau bởi các dòng mới. Vào cuối đầu ra của bạn, đầu ra end(trên một dòng riêng biệt).

Chấm điểm

  • Nếu một câu hỏi mà bạn đưa ra thực sự được đánh dấu là một bản sao của câu hỏi đầu vào (hoặc ngược lại), bạn ghi được 4 điểm. Đây là một "dự đoán chính xác".
  • Đối với mỗi dương tính giả (còn gọi là "đoán sai"), bạn mất 2 điểm.
  • Đối với mỗi câu hỏi thực sự là một bản sao nhưng không xuất hiện trong đầu ra của bạn (hay còn gọi là "thiếu đoán"), mất 1 điểm.

Điểm cao nhất sau khi xử lý 32 câu hỏi đầu vào sẽ thắng. 32 câu hỏi này là một "vòng". Vào đầu mỗi vòng, điểm số sẽ được đặt lại về 0. Một vòng sẽ được chạy cứ sau vài ngày và bảng xếp hạng được cập nhật sau mỗi vòng.

Quy tắc

  • Nếu cả hai câu hỏi A và C đều được đóng dưới dạng trùng lặp của B, A sẽ được tính là một bản sao của C và ngược lại.
  • Khi bắt đầu mỗi vòng, chương trình của bạn có thể không có bất kỳ dữ liệu nào về bất kỳ câu hỏi nào (tức là không có mã hóa cứng ), ngoại trừ cách phân tích trang web.
  • Tuy nhiên, bạn có thể giữ dữ liệu trong các tệp bên ngoài trong một vòng.
  • Không có dữ liệu có thể được giữ giữa các vòng.
  • Đầu ra của bạn phải có một dòng mới.
  • Bạn không được sử dụng bất kỳ dữ liệu nào từ trang web ngoại trừ kết quả tìm kiếm và URL, tiêu đề, thẻ và văn bản của câu hỏi , có hoặc không có định dạng. Ví dụ: bạn không được sử dụng văn bản "được đánh dấu là trùng lặp bởi foo, bar ..." xuất hiện trên các câu hỏi trùng lặp.
  • Bạn có thể truy xuất dữ liệu này trực tiếp từ trang web, qua data.SE hoặc qua API.
  • Mỗi bài nộp phải có một tên.
  • Mỗi bài nộp phải có đánh số phiên bản rõ ràng.
  • Nếu một bài nộp không tạo ra đầu ra sau một thời gian giới hạn (sẽ được quyết định; vui lòng cho biết bài nộp của bạn mất bao lâu), nó sẽ bị giết và mất 8 điểm.

2
Không phải là 1 phút chủ quan sao? Kết nối mạng và thu thập dữ liệu sẽ dẫn đến một số lượng lớn yêu cầu web. Nó có thể dễ dàng mất hơn 1 phút cho mọi người :)
Trình tối ưu hóa

4
Tôi nghĩ rằng chúng ta không thể trực tiếp đến con số đó, bạn có thể phải tự viết một chương trình ví dụ (hoặc sử dụng câu trả lời đầu tiên) để xác định thời gian ngưỡng chính xác.
Tối ưu hóa

7
Thay vì quét trang web, bạn nên xem qua API và chỉ định trường nào có thể được sử dụng.
Gilles 'SO- ngừng trở nên xấu xa'

5
Sẽ thật buồn cười nếu câu hỏi này là một bản sao .. ôi thật trớ trêu
Teun Pronk

3
@professorfish Bạn thực sự có thể sử dụng một số trường hợp thử nghiệm, ở đây bạn đi. Tất cả dữ liệu này đến từ Data.SE, vì vậy nó đáng tin cậy. Hãy làm cho tôi trông ngớ ngẩn và chứng minh tôi sai. Câu hỏi này có codegolf.stackexchange.com/q/37737 không có bản sao. Câu hỏi này codegolf.stackexchange.com/q/12348codegolf.stackexchange.com/q/10465 Câu hỏi này codegolf.stackexchange.com/q/12498 có các codegolf.stackexchange.com/q/20006 codegolf.stackexchange.com/ q / 242
PenutReaper

Câu trả lời:


3

Con trăn 3

Tôi đang cho mục này tên The Differ.

Mã số:

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

Bộ lọc "!-*f(6rc.cI8O"bao gồm totaltham số trên đối tượng trình bao bọc toàn cục và bodytham số cho các câu hỏi.

Mục nhập này thực hiện hai yêu cầu API cộng với một yêu cầu cho mỗi thẻ trong câu hỏi cộng với một trăm câu hỏi trong thẻ ít được sử dụng nhất. Nếu nó chạm vào một van tiết lưu api (mà nó không kiểm tra), nó sẽ tăngurllib.error.HTTPError: HTTP Error 400: Bad Request

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.