def _translate(self, query: TranslationQuery) -> TranslationResponse:
        """

        :param query: 
        :return: 
        """

        pos = self._get_pos_tag(query)
        response = self.word_api.getDefinitions(query.query, partOfSpeech=pos)
        if not response:

            if self._query_is_uppercase(query):
                query.query = query.query.lower()
                return self._translate(query)

            elif self._query_starts_with_quote(query):
                # try to see whether the problem is due to 'quotes' around the word name
                self._remove_quotes(query)
                return self._translate(query)

        if not response:
            response = []

        translations = []
        quality = int(self.get_quality())

        for d in response[:query.max_translations]:
            quality -= 1

            try:
                definition = self.definition_without_example_and_without_see_synonims(d)
                if self.not_too_long(definition):
                    translations.append(self.make_translation(definition, quality))

                meta_defined_word = self.is_meta_definition(definition)
                if meta_defined_word:
                    response2 = self.word_api.getDefinitions(meta_defined_word)
                    for d2 in response2[:query.max_translations]:
                        d2clean = self.definition_without_example_and_without_see_synonims(d2)
                        if self.not_too_long(d2clean):
                            translations.append(self.make_translation(meta_defined_word + ": " + d2clean, quality))
            except Exception as e:
                logger.info(f"Can't parse definition: {e}")

        if not translations:
            # if we don't know the translation, just parrot back the question
            translations.append(self.make_translation(query.query, quality))

        rez = TranslationResponse(
            translations=translations,
            costs=TranslationCosts(
                money=0  # API is free
            )
        )

        return rez
示例#2
0
    def _translate(self, query: TranslationQuery) -> TranslationResponse:
        """

        :param query: 
        :return: 
        """

        pos = self._get_pos_tag(query)

        try:
            if pos:
                response = self.word_api.getDefinitions(query.query,
                                                        partOfSpeech=pos)
            else:
                response = self.word_api.getDefinitions(query.query)

        except HTTPError as e:
            print(
                f"error code returned: {e.code} when translating {query.query}"
            )
            if e.code == 429:
                logger.info("Wordnik returned 429: 'Too Many Requests'!")

            elif e.code == 404:
                # Wordnik API will return 404 for Uppercase or quoted words
                # in that case we adapt the query and retry
                if self._query_is_uppercase(query):
                    query.query = query.query.lower()
                    print(f"trying to translate {query.query} instead")
                    return self._translate(query)

                elif self._query_starts_with_quote(query):
                    # try to see whether the problem is due to 'quotes' around the word name
                    self._remove_quotes(query)
                    print(f"trying to translate {query.query} instead")
                    return self._translate(query)

        if not response:
            response = []

        translations = []
        quality = int(self.get_quality())

        for d in response[:query.max_translations]:
            quality -= 1

            try:
                definition = self.definition_without_example_and_without_see_synonims(
                    d)
                if self.not_too_long(definition):
                    translations.append(
                        self.make_translation(definition, quality))

                meta_defined_word = self.is_meta_definition(definition)
                if meta_defined_word:
                    response2 = self.word_api.getDefinitions(meta_defined_word)
                    for d2 in response2[:query.max_translations]:
                        d2clean = self.definition_without_example_and_without_see_synonims(
                            d2)
                        if self.not_too_long(d2clean):
                            translations.append(
                                self.make_translation(
                                    meta_defined_word + ": " + d2clean,
                                    quality))
            except Exception as e:
                logger.info(f"Can't parse definition: {e}")

        if not translations:
            # if we don't know the translation, just parrot back the question
            translations.append(self.make_translation(query.query, quality))

        rez = TranslationResponse(
            translations=translations,
            costs=TranslationCosts(money=0  # API is free
                                   ))

        return rez