docs: def analyze(self,
                  features,
                  text=None,
                  html=None,
                  url=None,
                  clean=None,
                  xpath=None,
                  fallback_to_raw=None,
                  return_analyzed_text=None,
                  language=None,
                  limit_text_characters=None,
                  **kwargs):
          """
          Analyze text.
  
          Analyzes text, HTML, or a public webpage for the following features:
          - Categories
          - Concepts
          - Emotion
          - Entities
          - Keywords
          - Metadata
          - Relations
          - Semantic roles
          - Sentiment
          - Syntax (Experimental).
  
          :param Features features: Specific features to analyze the document for.
          :param str text: The plain text to analyze. One of the `text`, `html`, or `url`
          parameters is required.
          :param str html: The HTML file to analyze. One of the `text`, `html`, or `url`
          parameters is required.
          :param str url: The webpage to analyze. One of the `text`, `html`, or `url`
          parameters is required.
          :param bool clean: Set this to `false` to disable webpage cleaning. To learn more
          about webpage cleaning, see the [Analyzing
          webpages](https://cloud.ibm.com/docs/services/natural-language-understanding/analyzing-webpages.html)
          documentation.
          :param str xpath: An [XPath
          query](https://cloud.ibm.com/docs/services/natural-language-understanding/analyzing-webpages.html#xpath)
          to perform on `html` or `url` input. Results of the query will be appended to the
          cleaned webpage text before it is analyzed. To analyze only the results of the
          XPath query, set the `clean` parameter to `false`.
          :param bool fallback_to_raw: Whether to use raw HTML content if text cleaning
          fails.
          :param bool return_analyzed_text: Whether or not to return the analyzed text.
          :param str language: ISO 639-1 code that specifies the language of your text. This
          overrides automatic language detection. Language support differs depending on the
          features you include in your analysis. See [Language
          support](https://www.bluemix.net/docs/services/natural-language-understanding/language-support.html)
          for more information.
          :param int limit_text_characters: Sets the maximum number of characters that are
          processed by the service.
          :param dict headers: A `dict` containing the request headers
          :return: A `DetailedResponse` containing the result, headers and HTTP status code.
          :rtype: DetailedResponse
          """
  
          if features is None:
              raise ValueError('features must be provided')
          features = self._convert_model(features, Features)
  
          headers = {}
          if 'headers' in kwargs:
              headers.update(kwargs.get('headers'))
          sdk_headers = get_sdk_headers('natural-language-understanding', 'V1',
                                        'analyze')
          headers.update(sdk_headers)
  
          params = {'version': self.version}
  
          data = {
              'features': features,
              'text': text,
              'html': html,
              'url': url,
              'clean': clean,
              'xpath': xpath,
              'fallback_to_raw': fallback_to_raw,
              'return_analyzed_text': return_analyzed_text,
              'language': language,
              'limit_text_characters': limit_text_characters
          }
  
          url = '/v1/analyze'
          response = self.request(
              method='POST',
              url=url,
              headers=headers,
              params=params,
              json=data,
              accept_json=True)
          return response