コード例 #1
0
    def analyse_entry(self, entry, activity):
        params = activity.params

        txt = entry['nif:isString']
        api = 'http://api.meaningcloud.com/'
        lang = params.get("language")
        model = "general"
        key = params["apikey"]
        parameters = {
            'key': key,
            'model': model,
            'lang': lang,
            'of': 'json',
            'txt': txt,
            'tt': 'a'
        }
        try:
            r = requests.post(api + "sentiment-2.1",
                              params=parameters,
                              timeout=3)
            parameters['lang'] = r.json()['model'].split('_')[1]
            lang = parameters['lang']
            r2 = requests.post(api + "topics-2.0",
                               params=parameters,
                               timeout=3)
        except requests.exceptions.Timeout:
            raise Error("Meaning Cloud API does not response")

        api_response = r.json()
        api_response_topics = r2.json()
        if not api_response.get('score_tag'):
            raise Error(r.json())
        entry['language_detected'] = lang
        self.log.debug(api_response)
        agg_polarity, agg_polarityValue = self._polarity(
            api_response.get('score_tag', None))
        agg_opinion = Sentiment(id="Opinion0",
                                marl__hasPolarity=agg_polarity,
                                marl__polarityValue=agg_polarityValue,
                                marl__opinionCount=len(
                                    api_response['sentence_list']))
        agg_opinion.prov(self)
        entry.sentiments.append(agg_opinion)
        self.log.debug(api_response['sentence_list'])
        count = 1

        for sentence in api_response['sentence_list']:
            for nopinion in sentence['segment_list']:
                self.log.debug(nopinion)
                polarity, polarityValue = self._polarity(
                    nopinion.get('score_tag', None))
                opinion = Sentiment(
                    id="Opinion{}".format(count),
                    marl__hasPolarity=polarity,
                    marl__polarityValue=polarityValue,
                    marl__aggregatesOpinion=agg_opinion.get('id'),
                    nif__anchorOf=nopinion.get('text', None),
                    nif__beginIndex=int(nopinion.get('inip', None)),
                    nif__endIndex=int(nopinion.get('endp', None)))
                count += 1
                opinion.prov(self)
                entry.sentiments.append(opinion)

        mapper = {
            'es': 'es.',
            'en': '',
            'ca': 'es.',
            'it': 'it.',
            'fr': 'fr.',
            'pt': 'pt.'
        }

        for sent_entity in api_response_topics['entity_list']:
            resource = "_".join(sent_entity.get('form', None).split())
            entity = Entity(
                id="Entity{}".format(sent_entity.get('id')),
                itsrdf__taIdentRef="http://{}dbpedia.org/resource/{}".format(
                    mapper[lang], resource),
                nif__anchorOf=sent_entity.get('form', None),
                nif__beginIndex=int(sent_entity['variant_list'][0].get(
                    'inip', None)),
                nif__endIndex=int(sent_entity['variant_list'][0].get(
                    'endp', None)))
            sementity = sent_entity['sementity'].get('type',
                                                     None).split(">")[-1]
            entity['@type'] = "ODENTITY_{}".format(sementity)
            entity.prov(self)
            if 'senpy:hasEntity' not in entry:
                entry['senpy:hasEntity'] = []
            entry['senpy:hasEntity'].append(entity)

        for topic in api_response_topics['concept_list']:
            if 'semtheme_list' in topic:
                for theme in topic['semtheme_list']:
                    concept = Topic()
                    concept.id = "Topic{}".format(topic.get('id'))
                    concept['@type'] = "ODTHEME_{}".format(
                        theme['type'].split(">")[-1])
                    concept[
                        'fam:topic-reference'] = "http://dbpedia.org/resource/{}".format(
                            theme['type'].split('>')[-1])
                    entry.prov(self)
                    if 'senpy:hasTopic' not in entry:
                        entry['senpy:hasTopic'] = []
                    entry['senpy:hasTopic'].append(concept)
        yield entry