wikipedia_searcher.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import logging
  2. from core.NeuronModule import NeuronModule, InvalidParameterException
  3. import wikipedia
  4. logging.basicConfig()
  5. logger = logging.getLogger("kalliope")
  6. class Wikipedia_searcher(NeuronModule):
  7. def __init__(self, **kwargs):
  8. # we don't need the TTS cache for this neuron
  9. cache = kwargs.get('cache', None)
  10. if cache is None:
  11. cache = False
  12. kwargs["cache"] = cache
  13. super(Wikipedia_searcher, self).__init__(**kwargs)
  14. # get parameters form the neuron
  15. self.query = kwargs.get('query', None)
  16. self.language = kwargs.get('language', None)
  17. self.sentences = kwargs.get('sentences', None)
  18. self.may_refer = None
  19. self.returncode = None
  20. self.message = None
  21. # check parameters
  22. if self._is_parameters_ok():
  23. # set the language
  24. wikipedia.set_lang(self.language)
  25. # do the summary search
  26. try:
  27. summary = wikipedia.summary(self.query, auto_suggest=True, sentences=self.sentences)
  28. # if we are here, no exception raised, we got a summary
  29. self.returncode = "SummaryFound"
  30. except wikipedia.exceptions.DisambiguationError, e:
  31. # Exception raised when a page resolves to a Disambiguation page.
  32. # The options property contains a list of titles of Wikipedia pages that the query may refer to.
  33. self.may_refer = e.options
  34. # Removing duplicates in lists.
  35. self.may_refer = list(set(self.may_refer))
  36. self.returncode = "DisambiguationError"
  37. summary = ""
  38. except wikipedia.exceptions.PageError:
  39. # Exception raised when no Wikipedia matched a query.
  40. self.returncode = "PageError"
  41. summary = ""
  42. self.message = {
  43. "summary": summary,
  44. "may_refer": self.may_refer,
  45. "returncode": self.returncode
  46. }
  47. logger.debug("Wikipedia returned message: %s" % str(self.message))
  48. self.say(self.message)
  49. def _is_parameters_ok(self):
  50. """
  51. Check if received parameters are ok to perform operations in the neuron
  52. :return: true if parameters are ok, raise an exception otherwise
  53. .. raises:: InvalidParameterException
  54. """
  55. if self.query is None:
  56. raise InvalidParameterException("Wikipedia needs a query")
  57. if self.language is None:
  58. raise InvalidParameterException("Wikipedia needs a language")
  59. valid_language = wikipedia.languages().keys()
  60. if self.language not in valid_language:
  61. raise InvalidParameterException("Wikipedia needs a valid language: %s" % valid_language)
  62. if self.sentences is not None:
  63. if not isinstance(self.sentences, int):
  64. raise InvalidParameterException("Number of sentences must be an integer")
  65. return True