重複した質問を検出


20

重複した質問を検出

むかしむかし、ゴルフ場がありました。問題がありました。人々は同じような質問を繰り返し投稿するでしょう。あなたはちょうど今まで〜だった選択された選択された強制徴集恐black 必要な手段を問わず、質問が既存の質問と重複しているかどうかを判断するプロセスを自動化するよう要求されました(ルールを参照)。

入力

プログラムは、入力として単一のURLを受け入れる必要があります。これはcodegolf.stackexchange.comでの質問につながると仮定するかもしれませ

出力

同様の質問については、サイトを検索してください。入力された質問が既存の質問と重複している(またはその逆)と思われる場合は、他の質問のURLを出力します。複数のURLを改行で区切って出力できます。出力の最後に、出力end(別の行に)。

得点

  • 出力した質問が実際に入力質問の複製としてマークされた場合(またはその逆)、4ポイントを獲得します。これは「正しい推測」です。
  • 各誤検知(別名「誤っ​​た推測」)に対して、2ポイントを失います。
  • 実際には重複していたが、出力に表示されない質問(別名「推測ミス」)ごとに、1ポイントを失います。

32個の入力質問を処理した後の最高スコアが勝ちます。これらの32の質問は「ラウンド」です。各ラウンドの開始時に、スコアは0にリセットされます。1ラウンドが数日ごとに実行され、各ラウンドの後にリーダーボードが更新されます。

ルール

  • 質問AとCの両方がBの複製として閉じられている場合、AはCの複製としてカウントされ、その逆も同様です。
  • 各ラウンドの開始時に、あなたのプログラムは、ウェブサイトの解析方法を除いて、質問に関するデータを持っていない可能性があります(ハードコーディングなし)。
  • ただし、ラウンド中は外部ファイルにデータを保持できます。
  • ラウンド間でデータを保持することはできません。
  • 出力には、末尾に改行が必要です。
  • 検索結果と、URL、タイトル、タグ、質問のテキスト以外のウェブサイトのデータは、フォーマットの有無にかかわらず使用できません。たとえば、重複する質問に表示される「foo、bar ...によって重複とマークされている」というテキストは使用できません。
  • このデータは、data.SEまたはAPIを介して、サイトから直接取得できます。
  • 各提出には名前が必要です。
  • 各提出には明確なバージョン番号が必要です。
  • 制限時間を過ぎても提出物が出力されない場合(未定。提出にかかる時間を明記してください)、それは強制終了され、8ポイントを失います。

2
1分間の主観ではありませんか?ネットワーク接続とクロールにより、膨大な数のWebリクエストが発生します。誰でも簡単に1分以上かかる場合があります:)
オプティマイザー14

4
私たちはその数に直接到達することはできないと思います。正しいしきい値時間を決定するために、サンプルプログラムを自分で書く(または最初の答えを使用する)必要があるかもしれません。
オプティマイザー14

7
サイトをスクレイピングする代わりに、APIを使用して、使用できるフィールドを指定する必要があります。
ジル「SO-悪であるのをやめる」14

5
この質問が重複した場合、それはとても面白いでしょう..皮肉なxD
Teun Pronk 14

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 14

回答:


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パラメーターと質問のパラメーターが含まれていました。

このエントリは、2つのAPIリクエストに加えて、質問のタグごとに1つと、最も使用頻度の低いタグの100の質問ごとに1つを作成します。apiスロッ​​トル(これはチェックしません)にヒットすると、urllib.error.HTTPError: HTTP Error 400: Bad Request

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.