code: def _extract_features(self):
          
          for parsed_line in self.parsed_lines:
  
              # If it's ssh, we can handle it
              if parsed_line.get('program') == 'sshd':
                  result = self._parse_auth_message(parsed_line['message'])
  
                  # Add the ip if we have it
                  if 'ip' in result:
                      self.features['ips'].append(result['ip'])
  
                      # If we haven't seen the ip, add it
                      if result['ip'] not in self.ips_to_pids:
                          # Make the value a list of pids
                          self.ips_to_pids[result['ip']] = [parsed_line['processid']]
                      else:
                          # If we have seen the ip before, add the pid if it's a new one
                          if parsed_line['processid'] not in self.ips_to_pids[result['ip']]:
                              self.ips_to_pids[result['ip']].append(parsed_line['processid'])
docs: Extracts and sets the feature data from the log file necessary for a reduction