input: from typing import Tuple
  import numpy as np
  import pandas as pd
  import nltk
  from nltk.tokenize import word_tokenize
  import matplotlib.pyplot as plt
  from nltk.corpus import stopwords
  from nltk.stem import WordNetLemmatizer 
  from sklearn.feature_extraction.text import CountVectorizer
  from sklearn.model_selection import train_test_split
  from sklearn.naive_bayes import MultinomialNB
  from sklearn.metrics import classification_report
  
  def sentiment_analysis(reviews_data: pd.DataFrame) -> Tuple[str, np.ndarray, np.ndarray]:
      """ Perform sentiment analysis on product reviews using natural language processing techniques.
      This function tokenizes the reviews, removes stopwords, normalizes the words, and then generates features using CountVectorizer.
      A MultinomialNB model is trained on the features and used to predict sentiments on the test set.
      The classification report is printed and the trained model, test features, and test labels are returned.
      
      >>> data = pd.DataFrame({'review': ["Great product!", "Terrible experience."], 'sentiment': [1, 0]})
      >>> report, _, _ = sentiment_analysis(data)
      >>> print(report)
      (classification_report output)
      """
      # Tokenise the texts
      reviews_data['tokenised'] = reviews_data['review'].apply(word_tokenize)
  
      # Remove stopwords
      stop_words = set(stopwords.words('english'))
      reviews_data['filtered'] = reviews_data['tokenised'].apply(lambda x: [val for val in x if val not in stop_words])
  
      # Normalize words
      wordnet_lemmatizer = WordNetLemmatizer()
      reviews_data['normalised'] = reviews_data['filtered'].apply(lambda x: [wordnet_lemmatizer.lemmatize(val) for val in x])
  
      # Generate features using CountVectorizer
      cv = CountVectorizer()
      reviews_data['features'] = cv.fit_transform(reviews_data['normalised'].astype('str')).toarray()
  
      # Split into training and test sets
      X = reviews_data['features']
      y = reviews_data['sentiment']
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  
      # Train model
      model = MultinomialNB(alpha=0.1)
      model.fit(X_train, y_train)
  
      # Predict using the test set
      predictions = model.predict(X_test)
  
      # Generate a classification report
      report = classification_report(y_test, predictions)
      print(report)
  
      return report, X_test, y_test
output:     return report, X_test, y_test