input: from typing import List, Tuple
  
  
  def sentiment_analysis(input_data: List[Tuple[str, str]]) -> str:
      """Perform sentiment analysis on product reviews using natural language processing techniques. 
      Tokenize the texts, remove stopwords, normalize words, and generate features using CountVectorizer.
      Split the data into training and test sets, train a Multinomial Naive Bayes model, and generate a 
      classification report.
      >>> sentiment_analysis([('This is an amazing product!', 'positive'), ('Terrible experience with this.', 'negative')])
      '              precision    recall  f1-score   support\n\n   negative       0.00      0.00      0.00         1\n   positive       0.00      0.00      0.00         1\n\n avg / total       0.00      0.00      0.00         2\n'
      """
output:     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
      from nltk.corpus import stopwords
      from nltk.tokenize import word_tokenize
      from nltk.stem import WordNetLemmatizer
      import string
  
      # Tokenize and preprocess the text
      def preprocess(text):
          tokens = word_tokenize(text.lower())
          tokens = [word for word in tokens if word.isalnum()]
          tokens = [word for word in tokens if word not in stopwords.words('english')]
          tokens = [WordNetLemmatizer().lemmatize(word) for word in tokens]
          return ' '.join(tokens)
  
      texts, labels = zip(*input_data)
      texts = [preprocess(text) for text in texts]
  
      # Vectorize the text data
      vectorizer = CountVectorizer()
      X = vectorizer.fit_transform(texts)
  
      # Split the data into training and test sets
      X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
  
      # Train a Multinomial Naive Bayes model
      model = MultinomialNB()
      model.fit(X_train, y_train)
  
      # Generate predictions
      y_pred = model.predict(X_test)
  
      # Generate classification report
      report = classification_report(y_test, y_pred, output_dict=False)
      return report