class_docstr: Reader for the Customer Review Data dataset by Hu, Liu (2004).
  Note: we are not applying any sentence tokenization at the moment, just word
  tokenization.
  
      >>> from nltk.corpus import product_reviews_1
      >>> camera_reviews = product_reviews_1.reviews('Canon_G3.txt')
      >>> review = camera_reviews[0]
      >>> review.sents()[0] # doctest: +NORMALIZE_WHITESPACE
      ['i', 'recently', 'purchased', 'the', 'canon', 'powershot', 'g3', 'and', 'am',
      'extremely', 'satisfied', 'with', 'the', 'purchase', '.']
      >>> review.features() # doctest: +NORMALIZE_WHITESPACE
      [('canon powershot g3', '+3'), ('use', '+2'), ('picture', '+2'),
      ('picture quality', '+1'), ('picture quality', '+1'), ('camera', '+2'),
      ('use', '+2'), ('feature', '+1'), ('picture quality', '+3'), ('use', '+1'),
      ('option', '+1')]
  
  We can also reach the same information directly from the stream:
  
      >>> product_reviews_1.features('Canon_G3.txt')
      [('canon powershot g3', '+3'), ('use', '+2'), ...]
  
  We can compute stats for specific product features:
  
      >>> n_reviews = len([(feat,score) for (feat,score) in product_reviews_1.features('Canon_G3.txt') if feat=='picture'])
      >>> tot = sum([int(score) for (feat,score) in product_reviews_1.features('Canon_G3.txt') if feat=='picture'])
      >>> mean = tot / n_reviews
      >>> print(n_reviews, tot, mean)
      15 24 1.6
docstr: Return a list of features. Each feature is a tuple made of the specific
  item feature and the opinion strength about that feature.
  
  :param fileids: a list or regexp specifying the ids of the files whose
      features have to be returned.
  :return: all features for the item(s) in the given file(s).
  :rtype: list(tuple)
docstr_tok: ["Return","a","list","of","features",".","Each","feature","is","a","tuple","made","of","the","specific","item","feature","and","the","opinion","strength","about","that","feature",".",":","param","fileids",":","a","list","or","regexp","specifying","the","ids","of","the","files","whose","features","have","to","be","returned",".",":","return",":","all","features","for","the","item","(","s",")","in","the","given","file","(","s",")",".",":","rtype",":","list","(","tuple",")"]
code: def features(self, fileids=None):
      """
      Return a list of features. Each feature is a tuple made of the specific
      item feature and the opinion strength about that feature.
  
      :param fileids: a list or regexp specifying the ids of the files whose
          features have to be returned.
      :return: all features for the item(s) in the given file(s).
      :rtype: list(tuple)
      """
      if fileids is None:
          fileids = self._fileids
      elif isinstance(fileids, str):
          fileids = [fileids]
      return concat(
          [
              self.CorpusView(fileid, self._read_features, encoding=enc)
              for (fileid, enc) in self.abspaths(fileids, True)
          ]
      )
  
imports: import re
  from nltk.corpus.reader.api import *
  from nltk.tokenize import *
label_desc: Use image node_id 2 for calling the ReviewsCorpusReader obj's underlying member method code with example usage: obj.features(fileids) and returns: concat