Exemple #1
0
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"]
        ))
Exemple #2
0
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
Exemple #4
0
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"]))
Exemple #5
0
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"])
        )
Exemple #6
0
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"])
        )
Exemple #7
0
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
Exemple #8
0
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"]))
Exemple #9
0
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"]
        ))
Exemple #10
0
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"]))