input: from typing import List
  
  def sentiment_analysis(reviews: List[str]) -> str:
      """ Perform sentiment analysis on a list of product reviews using natural language processing techniques.
      The function will tokenize the reviews, remove stopwords, normalize the words, and generate features using CountVectorizer.
      A Multinomial Naive Bayes classifier will be trained and used to predict sentiments on the test set.
      The function will return a classification report of the predicted sentiments.
      >>> sentiment_analysis(["This product is amazing!", "I hated this product."])
      '              precision    recall  f1-score   support\\n\\n         0.50      0.50      0.50         2\\n         0.00      0.00      0.00         0\\n         0.00      0.00      0.00         0\\n\\n   micro avg       0.50      0.50      0.50         2\\n   macro avg       0.17      0.17      0.17         2\\nweighted avg       0.50      0.50      0.50         2\\n'
      """
      
      data = pd.DataFrame({'review': reviews, 'sentiment': ["positive", "negative"]})
      
      data['tokenised'] = data['review'].apply(word_tokenize)
      stop_words = set(stopwords.words('english'))
      data['filtered'] = data['tokenised'].apply(lambda x: [val for val in x if val not in stop_words])
      wordnet_lemmatizer = WordNetLemmatizer()
      data['normalised'] = data['filtered'].apply(lambda x: [wordnet_lemmatizer.lemmatize(val) for val in x])
      cv = CountVectorizer()
      data['features'] = cv.fit_transform(data['normalised'].astype('str')).toarray()
      
      X = data['features']
      y = data['sentiment']
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
      
      model = MultinomialNB(alpha=0.1)
      model.fit(X_train, y_train)
      
      predictions = model.predict(X_test)
      report = classification_report(y_test, predictions)
      return report
output:     import pandas as pd
      from nltk.tokenize import word_tokenize
      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