def guess_keywords(obj, eng): """Workflow task to ask Magpie API for a keywords assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="keywords") try: results = json_api_request(magpie_url, payload) except requests.exceptions.RequestException: results = {} if results: labels = results.get('labels', []) keywords = labels[:10] keywords = [{'label': k[0], 'score': k[1], 'accept': k[1] >= 0.09} for k in keywords] obj.extra_data["keywords_prediction"] = dict( keywords=keywords ) current_app.logger.info("Keyword prediction (top 10): {0}".format( obj.extra_data["keywords_prediction"]["keywords"] ))
def guess_experiments(obj, eng): """Workflow task to ask Magpie API for a subject area assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="experiments") results = json_api_request(magpie_url, payload) if results: all_predictions = results.get('labels', []) selected_experiments = filter_magpie_response( all_predictions, limit=0.5, ) selected_experiments = [ {'label': e[0], 'score': e[1]} for e in selected_experiments ] obj.extra_data["experiments_prediction"] = dict( experiments=selected_experiments, ) current_app.logger.info("Experiment prediction: {0}".format( obj.extra_data["experiments_prediction"]["experiments"] ))
def test_json_api_request_retries_on_connection_error(): with requests_mock.Mocker() as requests_mocker: body = {'foo': 'bar'} requests_mocker.register_uri( 'POST', 'http://example.org/api', [ {'exc': requests.packages.urllib3.exceptions.ConnectionError}, {'json': body}, ]) expected = {'foo': 'bar'} result = json_api_request('http://example.org/api', {}) assert expected == result
def guess_experiments(obj, eng): """Workflow task to ask Magpie API for a subject area assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="experiments") results = json_api_request(magpie_url, payload) if results: labels = results.get('labels', []) experiments = filter_magpie_response(labels, limit=0.5) obj.extra_data["experiments_prediction"] = dict( labels=labels, experiments=experiments) current_app.logger.info("Experiment prediction: {0}".format( obj.extra_data["experiments_prediction"]["experiments"]))
def guess_coreness(obj, eng): """Workflow task to ask Beard API for a coreness assessment.""" predictor_url = get_beard_url() if not predictor_url: return # FIXME: Have option to select different prediction models when # available in the API payload = prepare_payload(obj.data) try: results = json_api_request(predictor_url, payload) except requests.exceptions.RequestException: results = {} if results: scores = results.get('scores') or [] max_score = max(scores) decision = results.get('decision') scores = { "CORE": scores[0], "Non-CORE": scores[1], "Rejected": scores[2], } # Generate a normalized relevance_score useful for sorting # We assume a CORE paper to have the highest relevance so we add a # significant value to seperate it from Non-Core and Rejected. # Normally scores range from -2 / +2 so 10 is significant. # Non-CORE scores are untouched, while Rejected is substracted -10. # Finally this provides one normalized score of relevance across # all categories of papers. relevance_score = max_score if decision == "CORE": relevance_score += 10 elif decision == "Rejected": relevance_score = (max_score * -1) - 10 # FIXME: Add top_words info when available from the API obj.extra_data["relevance_prediction"] = dict( max_score=max_score, decision=decision, scores=scores, relevance_score=relevance_score ) current_app.logger.info("Prediction results: {0}".format( obj.extra_data["relevance_prediction"]) )
def test_json_api_request_retries_on_connection_error(): with requests_mock.Mocker() as requests_mocker: body = {'foo': 'bar'} requests_mocker.register_uri('POST', 'http://example.org/api', [ { 'exc': requests.packages.urllib3.exceptions.ConnectionError }, { 'json': body }, ]) expected = {'foo': 'bar'} result = json_api_request('http://example.org/api', {}) assert expected == result
def guess_categories(obj, eng): """Workflow task to ask Magpie API for a subject area assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="categories") results = json_api_request(magpie_url, payload) if results: labels = results.get('labels', []) categories = filter_magpie_response(labels, limit=0.22) categories = [{ 'label': c[0], 'score': c[1], 'accept': c[1] >= 0.25 } for c in categories] obj.extra_data["categories_prediction"] = dict(categories=categories) current_app.logger.info("Category prediction: {0}".format( obj.extra_data["categories_prediction"]["categories"]))
def guess_categories(obj, eng): """Workflow task to ask Magpie API for a subject area assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="categories") results = json_api_request(magpie_url, payload) if results: labels = results.get('labels', []) categories = filter_magpie_response(labels, limit=0.22) categories = [{'label': c[0], 'score': c[1], 'accept': c[1] >= 0.25} for c in categories] obj.extra_data["categories_prediction"] = dict( categories=categories ) current_app.logger.info("Category prediction: {0}".format( obj.extra_data["categories_prediction"]["categories"] ))
def guess_keywords(obj, eng): """Workflow task to ask Magpie API for a keywords assessment.""" magpie_url = get_magpie_url() if not magpie_url: # Skip task if no API URL set return payload = prepare_magpie_payload(obj.data, corpus="keywords") try: results = json_api_request(magpie_url, payload) except requests.exceptions.RequestException: results = {} if results: labels = results.get('labels', []) keywords = labels[:10] keywords = [{ 'label': k[0], 'score': k[1], 'accept': k[1] >= 0.09 } for k in keywords] obj.extra_data["keywords_prediction"] = dict(keywords=keywords) current_app.logger.info("Keyword prediction (top 10): {0}".format( obj.extra_data["keywords_prediction"]["keywords"]))