{"action":"created","comment":{"url":"https://api.github.com/repos/castorini/Anserini/pulls/comments/195913281","pull_request_review_id":129374061,"id":195913281,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NTkxMzI4MQ==","diff_hunk":"@@ -0,0 +1,302 @@\n+package io.anserini.rerank;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import com.google.common.base.Preconditions;\n+import io.anserini.index.generator.LuceneDocumentGenerator;\n+\n+import org.apache.commons.lang3.ArrayUtils;\n+import org.apache.commons.lang3.tuple.Pair;\n+import org.apache.logging.log4j.LogManager;\n+import org.apache.logging.log4j.Logger;\n+import org.apache.lucene.analysis.Analyzer;\n+import org.apache.lucene.index.IndexReader;\n+import org.apache.lucene.index.Terms;\n+import org.apache.lucene.index.TermsEnum;\n+import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser;\n+import org.apache.lucene.search.BooleanClause;\n+import org.apache.lucene.search.BooleanQuery;\n+import org.apache.lucene.search.IndexSearcher;\n+import org.apache.lucene.search.Query;\n+import org.apache.lucene.search.TopDocs;\n+\n+import java.io.IOException;\n+import java.util.ArrayList;\n+import java.util.Arrays;\n+import java.util.Comparator;\n+import java.util.HashMap;\n+import java.util.HashSet;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.PriorityQueue;\n+import java.util.Random;\n+import java.util.Set;\n+import java.util.regex.Pattern;\n+\n+public class AxiomReranker implements Reranker {\n+  private static final Logger LOG = LogManager.getLogger(AxiomReranker.class);\n+\n+  private final Analyzer analyzer;\n+  private final String field;\n+\n+  private int R = 30; // factor that used in extracting random documents, we will extract R*M randomly select documents\n+  private int M = 20; // number of top documents in initial results\n+  private int L = 1000; // top similar terms\n+  private int K = 20; // number of expansion terms\n+  private float beta; // scaling parameter\n+\n+  public AxiomReranker(Analyzer analyzer, String field, String stoplist, Boolean fromResource, float beta) {\n+    this.analyzer = analyzer;\n+    this.field = field;\n+    this.beta = beta;\n+  }\n+\n+  @Override\n+  public ScoredDocuments rerank(ScoredDocuments docs, RerankerContext context) {\n+    Preconditions.checkState(docs.documents.length == docs.scores.length);\n+\n+    try {\n+      // Select R*M docs from the original ranking list as the reranking pool\n+      Set<Integer> usedDocs = selectDocs(docs, context);\n+      // Extract an inverted list from the reranking pool\n+      Map<String, Set<Integer>> termInvertedList = extractTerms(usedDocs, context, null);\n+      // Calculate all the terms in the reranking pool and pick top K of them\n+      Map<String, Double> expandedTermScores = calTermScore(termInvertedList, context);\n+      StringBuilder builder = new StringBuilder();\n+      for (Map.Entry<String, Double> termScore : expandedTermScores.entrySet()) {\n+        String term = termScore.getKey();\n+        double score = termScore.getValue();\n+        builder.append(term + \"^\" + score + \" \");\n+      }\n+      String queryText = builder.toString().trim();\n+\n+      if (queryText.isEmpty()) {\n+        LOG.info(\"[Empty Expanded Query]: \" + context.getQueryTokens());\n+        queryText = context.getQueryText();\n+      }\n+\n+      StandardQueryParser p = new StandardQueryParser();\n+      Query nq = null;\n+      nq = p.parse(queryText, this.field);\n+      LOG.info(\"Original Query: \" + context.getQueryTokens());\n+      LOG.info(\"Running new query: \" + nq);\n+\n+      TopDocs rs = null;\n+      IndexSearcher searcher = context.getIndexSearcher();\n+      if (context.getFilter() == null) {\n+        rs = searcher.search(nq, 1000);\n+      } else {\n+        BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();\n+        bqBuilder.add(context.getFilter(), BooleanClause.Occur.FILTER);\n+        bqBuilder.add(nq, BooleanClause.Occur.MUST);\n+        Query q = bqBuilder.build();\n+        rs = searcher.search(q, 1000);\n+      }\n+\n+      return ScoredDocuments.fromTopDocs(rs, searcher);\n+    } catch (Exception e) {\n+      System.out.println(e);\n+    }\n+    return null;\n+  }\n+\n+  /** Select R*M docs from the ranking results and the index as the reranking pool.\n+   *  The process is:\n+   *  1. Keep the top M documents in the original ranking list\n+   *  2. Randomly pick (R-1)*M documents from the rest of the index so in total we have R*M documents\n+   *\n+   *  @param docs      The initial ranking results\n+   *  @param context   An instance of RerankerContext\n+   *\n+   *  @return a Set of R*M document Ids\n+   */\n+  @VisibleForTesting\n+  private Set<Integer> selectDocs(ScoredDocuments docs, RerankerContext context)\n+      throws IOException {\n+    Set<Integer> docidSet = new HashSet<>(Arrays.asList(ArrayUtils.toObject(\n+        Arrays.copyOfRange(docs.ids, 0, Math.min(this.M, docs.ids.length)))));\n+    long targetSize = this.R * this.M;\n+\n+    if (docidSet.size() < targetSize) {\n+      IndexSearcher searcher = context.getIndexSearcher();\n+      IndexReader reader = searcher.getIndexReader();\n+      int availableDocsCnt = reader.getDocCount(this.field);\n+      List<Integer> docidsPoolList = new ArrayList<>();\n+      for (int i = 1; i <= availableDocsCnt; i++) {\n+        docidsPoolList.add(i);\n+      }\n+      Random random = new Random();\n+      while (docidSet.size() < targetSize) {\n+        docidSet.add(docidsPoolList.get(random.nextInt(docidsPoolList.size())));\n+      }\n+    }\n+\n+    return docidSet;\n+  }\n+\n+  /** Extract ALL the terms from the documents pool.\n+   *\n+   *  @param docIds          The reranking pool, see {@link #selectDocs} for explanations\n+   *  @param context         An instance of RerankerContext\n+   *  @param filterPattern   A Regex pattern that terms are collected only they matches the pattern, could be null\n+   *\n+   *  @return A Map of <term -> Set<docId>> kind of a small inverted list where the Set of docIds is where the term occurs\n+   */\n+  @VisibleForTesting\n+  private Map<String, Set<Integer>> extractTerms(Set<Integer> docIds, RerankerContext context,\n+                                                 Pattern filterPattern) throws Exception, IOException {\n+    IndexSearcher searcher = context.getIndexSearcher();\n+    IndexReader reader = searcher.getIndexReader();\n+    Map<String, Set<Integer>> termDocidSets = new HashMap<>();\n+    for (int docid : docIds) {\n+      Terms terms = reader.getTermVector(docid, LuceneDocumentGenerator.FIELD_BODY);\n+      if (terms == null) {\n+        LOG.info(\"Document vector not stored for docid: \" + docid);\n+        continue;\n+      }\n+      TermsEnum te = terms.iterator();\n+      if (te == null) {\n+        LOG.info(\"Document vector not stored for docid: \" + docid);\n+        continue;\n+      }\n+      while ((te.next()) != null) {\n+        String term = te.term().utf8ToString();\n+        if (term.length() < 2) continue;\n+        if (!term.matches(\"[a-z]+\")) continue;\n+        //System.out.println(te.term().utf8ToString() + \" \" + te.totalTermFreq());","path":"src/main/java/io/anserini/rerank/AxiomReranker.java","position":165,"original_position":165,"commit_id":"8fa01a76eba232192a9e87d58f2364b6cab2c26c","original_commit_id":"8fa01a76eba232192a9e87d58f2364b6cab2c26c","user":{"login":"Peilin-Yang","id":3334391,"node_id":"MDQ6VXNlcjMzMzQzOTE=","avatar_url":"https://avatars3.githubusercontent.com/u/3334391?v=4","gravatar_id":"","url":"https://api.github.com/users/Peilin-Yang","html_url":"https://github.com/Peilin-Yang","followers_url":"https://api.github.com/users/Peilin-Yang/followers","following_url":"https://api.github.com/users/Peilin-Yang/following{/other_user}","gists_url":"https://api.github.com/users/Peilin-Yang/gists{/gist_id}","starred_url":"https://api.github.com/users/Peilin-Yang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Peilin-Yang/subscriptions","organizations_url":"https://api.github.com/users/Peilin-Yang/orgs","repos_url":"https://api.github.com/users/Peilin-Yang/repos","events_url":"https://api.github.com/users/Peilin-Yang/events{/privacy}","received_events_url":"https://api.github.com/users/Peilin-Yang/received_events","type":"User","site_admin":false},"body":"sure","created_at":"2018-06-16T22:12:50Z","updated_at":"2018-06-16T22:12:50Z","html_url":"https://github.com/castorini/Anserini/pull/247#discussion_r195913281","pull_request_url":"https://api.github.com/repos/castorini/Anserini/pulls/247","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/comments/195913281"},"html":{"href":"https://github.com/castorini/Anserini/pull/247#discussion_r195913281"},"pull_request":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/247"}},"in_reply_to_id":195912991},"pull_request":{"url":"https://api.github.com/repos/castorini/Anserini/pulls/247","id":195313368,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk1MzEzMzY4","html_url":"https://github.com/castorini/Anserini/pull/247","diff_url":"https://github.com/castorini/Anserini/pull/247.diff","patch_url":"https://github.com/castorini/Anserini/pull/247.patch","issue_url":"https://api.github.com/repos/castorini/Anserini/issues/247","number":247,"state":"open","locked":false,"title":"Axiomatic reranking","user":{"login":"Peilin-Yang","id":3334391,"node_id":"MDQ6VXNlcjMzMzQzOTE=","avatar_url":"https://avatars3.githubusercontent.com/u/3334391?v=4","gravatar_id":"","url":"https://api.github.com/users/Peilin-Yang","html_url":"https://github.com/Peilin-Yang","followers_url":"https://api.github.com/users/Peilin-Yang/followers","following_url":"https://api.github.com/users/Peilin-Yang/following{/other_user}","gists_url":"https://api.github.com/users/Peilin-Yang/gists{/gist_id}","starred_url":"https://api.github.com/users/Peilin-Yang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Peilin-Yang/subscriptions","organizations_url":"https://api.github.com/users/Peilin-Yang/orgs","repos_url":"https://api.github.com/users/Peilin-Yang/repos","events_url":"https://api.github.com/users/Peilin-Yang/events{/privacy}","received_events_url":"https://api.github.com/users/Peilin-Yang/received_events","type":"User","site_admin":false},"body":"This PR is for adding axiomatic reranking, see https://trec.nist.gov/pubs/trec22/papers/udel_fang-web.pdf \r\nOne thing to notice is that I do not include performances references. The reason: The algorithm itself intentionally has a random reranking documents pool construction which makes it hard to reproduce in nature. Also, the algorithm typically involves in the parameter tuning of `beta` and this also introduces variables, e.g. how to train/test is totally up to the user of the algorithm.\r\nBut I do run it against all collections. The parameter `beta` is set to a hard value 0.4 which is an empirical value which is more likely to perform well on TREC Adhoc Collections. And the results confirm this: For TREC Adhoc Collections the performances are better than RM3 in general while for TREC Web Collections it may or may not perform very well.","created_at":"2018-06-16T02:33:01Z","updated_at":"2018-06-16T22:12:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"06d17d248bc07bd7287d66cef5484d0bab768859","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/castorini/Anserini/pulls/247/commits","review_comments_url":"https://api.github.com/repos/castorini/Anserini/pulls/247/comments","review_comment_url":"https://api.github.com/repos/castorini/Anserini/pulls/comments{/number}","comments_url":"https://api.github.com/repos/castorini/Anserini/issues/247/comments","statuses_url":"https://api.github.com/repos/castorini/Anserini/statuses/8fa01a76eba232192a9e87d58f2364b6cab2c26c","head":{"label":"castorini:axiomatic_rerank","ref":"axiomatic_rerank","sha":"8fa01a76eba232192a9e87d58f2364b6cab2c26c","user":{"login":"castorini","id":26842848,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODQyODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/26842848?v=4","gravatar_id":"","url":"https://api.github.com/users/castorini","html_url":"https://github.com/castorini","followers_url":"https://api.github.com/users/castorini/followers","following_url":"https://api.github.com/users/castorini/following{/other_user}","gists_url":"https://api.github.com/users/castorini/gists{/gist_id}","starred_url":"https://api.github.com/users/castorini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/castorini/subscriptions","organizations_url":"https://api.github.com/users/castorini/orgs","repos_url":"https://api.github.com/users/castorini/repos","events_url":"https://api.github.com/users/castorini/events{/privacy}","received_events_url":"https://api.github.com/users/castorini/received_events","type":"Organization","site_admin":false},"repo":{"id":43719677,"node_id":"MDEwOlJlcG9zaXRvcnk0MzcxOTY3Nw==","name":"Anserini","full_name":"castorini/Anserini","owner":{"login":"castorini","id":26842848,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODQyODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/26842848?v=4","gravatar_id":"","url":"https://api.github.com/users/castorini","html_url":"https://github.com/castorini","followers_url":"https://api.github.com/users/castorini/followers","following_url":"https://api.github.com/users/castorini/following{/other_user}","gists_url":"https://api.github.com/users/castorini/gists{/gist_id}","starred_url":"https://api.github.com/users/castorini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/castorini/subscriptions","organizations_url":"https://api.github.com/users/castorini/orgs","repos_url":"https://api.github.com/users/castorini/repos","events_url":"https://api.github.com/users/castorini/events{/privacy}","received_events_url":"https://api.github.com/users/castorini/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/castorini/Anserini","description":"An information retrieval toolkit built on Lucene","fork":false,"url":"https://api.github.com/repos/castorini/Anserini","forks_url":"https://api.github.com/repos/castorini/Anserini/forks","keys_url":"https://api.github.com/repos/castorini/Anserini/keys{/key_id}","collaborators_url":"https://api.github.com/repos/castorini/Anserini/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/castorini/Anserini/teams","hooks_url":"https://api.github.com/repos/castorini/Anserini/hooks","issue_events_url":"https://api.github.com/repos/castorini/Anserini/issues/events{/number}","events_url":"https://api.github.com/repos/castorini/Anserini/events","assignees_url":"https://api.github.com/repos/castorini/Anserini/assignees{/user}","branches_url":"https://api.github.com/repos/castorini/Anserini/branches{/branch}","tags_url":"https://api.github.com/repos/castorini/Anserini/tags","blobs_url":"https://api.github.com/repos/castorini/Anserini/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/castorini/Anserini/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/castorini/Anserini/git/refs{/sha}","trees_url":"https://api.github.com/repos/castorini/Anserini/git/trees{/sha}","statuses_url":"https://api.github.com/repos/castorini/Anserini/statuses/{sha}","languages_url":"https://api.github.com/repos/castorini/Anserini/languages","stargazers_url":"https://api.github.com/repos/castorini/Anserini/stargazers","contributors_url":"https://api.github.com/repos/castorini/Anserini/contributors","subscribers_url":"https://api.github.com/repos/castorini/Anserini/subscribers","subscription_url":"https://api.github.com/repos/castorini/Anserini/subscription","commits_url":"https://api.github.com/repos/castorini/Anserini/commits{/sha}","git_commits_url":"https://api.github.com/repos/castorini/Anserini/git/commits{/sha}","comments_url":"https://api.github.com/repos/castorini/Anserini/comments{/number}","issue_comment_url":"https://api.github.com/repos/castorini/Anserini/issues/comments{/number}","contents_url":"https://api.github.com/repos/castorini/Anserini/contents/{+path}","compare_url":"https://api.github.com/repos/castorini/Anserini/compare/{base}...{head}","merges_url":"https://api.github.com/repos/castorini/Anserini/merges","archive_url":"https://api.github.com/repos/castorini/Anserini/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/castorini/Anserini/downloads","issues_url":"https://api.github.com/repos/castorini/Anserini/issues{/number}","pulls_url":"https://api.github.com/repos/castorini/Anserini/pulls{/number}","milestones_url":"https://api.github.com/repos/castorini/Anserini/milestones{/number}","notifications_url":"https://api.github.com/repos/castorini/Anserini/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/castorini/Anserini/labels{/name}","releases_url":"https://api.github.com/repos/castorini/Anserini/releases{/id}","deployments_url":"https://api.github.com/repos/castorini/Anserini/deployments","created_at":"2015-10-05T23:27:54Z","updated_at":"2018-06-16T16:21:53Z","pushed_at":"2018-06-16T21:51:52Z","git_url":"git://github.com/castorini/Anserini.git","ssh_url":"git@github.com:castorini/Anserini.git","clone_url":"https://github.com/castorini/Anserini.git","svn_url":"https://github.com/castorini/Anserini","homepage":"http://anserini.io/","size":8819,"stargazers_count":41,"watchers_count":41,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"archived":false,"open_issues_count":29,"license":null,"forks":42,"open_issues":29,"watchers":41,"default_branch":"master"}},"base":{"label":"castorini:master","ref":"master","sha":"90f2e11b7dad83b3aae8a408bc06db1b76a34aef","user":{"login":"castorini","id":26842848,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODQyODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/26842848?v=4","gravatar_id":"","url":"https://api.github.com/users/castorini","html_url":"https://github.com/castorini","followers_url":"https://api.github.com/users/castorini/followers","following_url":"https://api.github.com/users/castorini/following{/other_user}","gists_url":"https://api.github.com/users/castorini/gists{/gist_id}","starred_url":"https://api.github.com/users/castorini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/castorini/subscriptions","organizations_url":"https://api.github.com/users/castorini/orgs","repos_url":"https://api.github.com/users/castorini/repos","events_url":"https://api.github.com/users/castorini/events{/privacy}","received_events_url":"https://api.github.com/users/castorini/received_events","type":"Organization","site_admin":false},"repo":{"id":43719677,"node_id":"MDEwOlJlcG9zaXRvcnk0MzcxOTY3Nw==","name":"Anserini","full_name":"castorini/Anserini","owner":{"login":"castorini","id":26842848,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODQyODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/26842848?v=4","gravatar_id":"","url":"https://api.github.com/users/castorini","html_url":"https://github.com/castorini","followers_url":"https://api.github.com/users/castorini/followers","following_url":"https://api.github.com/users/castorini/following{/other_user}","gists_url":"https://api.github.com/users/castorini/gists{/gist_id}","starred_url":"https://api.github.com/users/castorini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/castorini/subscriptions","organizations_url":"https://api.github.com/users/castorini/orgs","repos_url":"https://api.github.com/users/castorini/repos","events_url":"https://api.github.com/users/castorini/events{/privacy}","received_events_url":"https://api.github.com/users/castorini/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/castorini/Anserini","description":"An information retrieval toolkit built on Lucene","fork":false,"url":"https://api.github.com/repos/castorini/Anserini","forks_url":"https://api.github.com/repos/castorini/Anserini/forks","keys_url":"https://api.github.com/repos/castorini/Anserini/keys{/key_id}","collaborators_url":"https://api.github.com/repos/castorini/Anserini/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/castorini/Anserini/teams","hooks_url":"https://api.github.com/repos/castorini/Anserini/hooks","issue_events_url":"https://api.github.com/repos/castorini/Anserini/issues/events{/number}","events_url":"https://api.github.com/repos/castorini/Anserini/events","assignees_url":"https://api.github.com/repos/castorini/Anserini/assignees{/user}","branches_url":"https://api.github.com/repos/castorini/Anserini/branches{/branch}","tags_url":"https://api.github.com/repos/castorini/Anserini/tags","blobs_url":"https://api.github.com/repos/castorini/Anserini/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/castorini/Anserini/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/castorini/Anserini/git/refs{/sha}","trees_url":"https://api.github.com/repos/castorini/Anserini/git/trees{/sha}","statuses_url":"https://api.github.com/repos/castorini/Anserini/statuses/{sha}","languages_url":"https://api.github.com/repos/castorini/Anserini/languages","stargazers_url":"https://api.github.com/repos/castorini/Anserini/stargazers","contributors_url":"https://api.github.com/repos/castorini/Anserini/contributors","subscribers_url":"https://api.github.com/repos/castorini/Anserini/subscribers","subscription_url":"https://api.github.com/repos/castorini/Anserini/subscription","commits_url":"https://api.github.com/repos/castorini/Anserini/commits{/sha}","git_commits_url":"https://api.github.com/repos/castorini/Anserini/git/commits{/sha}","comments_url":"https://api.github.com/repos/castorini/Anserini/comments{/number}","issue_comment_url":"https://api.github.com/repos/castorini/Anserini/issues/comments{/number}","contents_url":"https://api.github.com/repos/castorini/Anserini/contents/{+path}","compare_url":"https://api.github.com/repos/castorini/Anserini/compare/{base}...{head}","merges_url":"https://api.github.com/repos/castorini/Anserini/merges","archive_url":"https://api.github.com/repos/castorini/Anserini/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/castorini/Anserini/downloads","issues_url":"https://api.github.com/repos/castorini/Anserini/issues{/number}","pulls_url":"https://api.github.com/repos/castorini/Anserini/pulls{/number}","milestones_url":"https://api.github.com/repos/castorini/Anserini/milestones{/number}","notifications_url":"https://api.github.com/repos/castorini/Anserini/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/castorini/Anserini/labels{/name}","releases_url":"https://api.github.com/repos/castorini/Anserini/releases{/id}","deployments_url":"https://api.github.com/repos/castorini/Anserini/deployments","created_at":"2015-10-05T23:27:54Z","updated_at":"2018-06-16T16:21:53Z","pushed_at":"2018-06-16T21:51:52Z","git_url":"git://github.com/castorini/Anserini.git","ssh_url":"git@github.com:castorini/Anserini.git","clone_url":"https://github.com/castorini/Anserini.git","svn_url":"https://github.com/castorini/Anserini","homepage":"http://anserini.io/","size":8819,"stargazers_count":41,"watchers_count":41,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"archived":false,"open_issues_count":29,"license":null,"forks":42,"open_issues":29,"watchers":41,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/247"},"html":{"href":"https://github.com/castorini/Anserini/pull/247"},"issue":{"href":"https://api.github.com/repos/castorini/Anserini/issues/247"},"comments":{"href":"https://api.github.com/repos/castorini/Anserini/issues/247/comments"},"review_comments":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/247/comments"},"review_comment":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/castorini/Anserini/pulls/247/commits"},"statuses":{"href":"https://api.github.com/repos/castorini/Anserini/statuses/8fa01a76eba232192a9e87d58f2364b6cab2c26c"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"Peilin-Yang"}}