检测重复的问题


20

检测重复的问题

从前,有一个高尔夫球场。它有一个问题:人们会一次又一次发布相似或相同的问题。你去过选择选定强迫征兵勒索 要求以任何必要的方式使确定问题是否与现有问题重复的过程自动化(请参阅规则)。

输入值

您的程序必须接受一个URL作为输入。可以假设这导致在codegolf.stackexchange.com上出现问题。

输出量

在网站上搜索类似的问题。如果您认为输入的问题是现有问题的重复(反之亦然),请输出另一个问题的URL。您可以输出多个URL,以新行分隔。在输出末尾,输出end(在单独的行上)。

计分

  • 如果您输出的问题确实被标记为输入问题的重复(反之亦然),则您得分为4分。这是一个“正确的猜测”。
  • 对于每个误报(又称“错误猜测”),您将损失2分。
  • 对于实际上是重复的但未出现在输出中的每个问题(又称“遗漏猜测”),损失1分。

处理32个输入问题后得分最高。这32个问题是一个“回合”。在每个回合开始时,得分将重置为0。每隔几天将进行一次回合,并且每个回合后都会更新排行榜。

规则

  • 如果问题A和C都作为B的重复被关闭,则A将被视为C的重复,反之亦然。
  • 在每个回合开始时,您的程序可能没有任何有关任何问题的数据(即没有硬编码),但如何解析网站除外。
  • 但是,您可能在一轮中将数据保留在外部文件中。
  • 两轮之间不得保留任何数据。
  • 您的输出必须有尾随换行符。
  • 除搜索结果以及问题的URL,标题,标签和文本(带有或不带有格式)外,您不得使用网站上的任何数据。例如,您不能使用出现在重复问题上的文本“被foo,bar ...标记为重复”。
  • 您可以通过data.SE或API直接从站点检索此数据。
  • 每个提交都必须有一个名称。
  • 每个提交必须具有清晰的版本编号。
  • 如果提交的内容在一定时限(有待确定;请说明提交的时间)后仍未产生输出,它将被杀死并失去8分。

2
1分钟不是主观的吗?网络连接和爬网将导致大量的Web请求。每个人可能很容易花费超过1分钟的时间:)
Optimizer

4
我认为我们不能直接得出这个数字,您可能必须自己编写一个示例程序(或使用第一个答案)来确定正确的阈值时间。
Optimizer

7
您应该浏览API,然后指定可以使用的字段,而不是抓取网站。
吉尔斯(Gillles)“所以-别再作恶了”

5
如果这个问题重复出现,那就太好笑了。.具有讽刺意味的xD
Teun Pronk 2014年

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 2014年

Answers:


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全局包装对象上的body参数和问题上的参数。

该条目发出两个API请求,再加上问题上的每个标签一个,再加上问题最少的标签中的一百个问题。如果它碰到了api油门(它不检查),它将引发一个urllib.error.HTTPError: HTTP Error 400: Bad Request

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.