input: def sentiment_analysis(reviews: List[str]) -> str:
      """
      Perform sentiment analysis on a list of product reviews using natural language processing techniques.
      Tokenize the reviews, remove stopwords, lemmatize words, and generate features using CountVectorizer.
      Then, train a Naive Bayes classifier and output a classification report.
  
      >>> sentiment_analysis(['This product is amazing!', 'I really hated this product.'])
      '              precision    recall  f1-score   support\n\n    positive       1.00      1.00      1.00         1\n    negative       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n    macro avg       1.00      1.00      1.00         2\n    weighted avg       1.00      1.00      1.00         2\n\n'
      >>> sentiment_analysis(['I love this product.', 'This product is terrible.'])
      '              precision    recall  f1-score   support\n\n    positive       1.00      1.00      1.00         1\n    negative       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n    macro avg       1.00      1.00      1.00         2\n    weighted avg       1.00      1.00      1.00         2\n\n'
      """
output:     
      from sklearn.feature_extraction.text import CountVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.pipeline import make_pipeline
      from sklearn.metrics import classification_report
      from nltk.tokenize import word_tokenize
      from nltk.corpus import stopwords
      from nltk.stem import WordNetLemmatizer
      import string
  
      def preprocess(text):
          tokens = word_tokenize(text.lower())
          tokens = [t for t in tokens if t.isalpha()]
          tokens = [t for t in tokens if t not in stopwords.words('english')]
          lemmatizer = WordNetLemmatizer()
          tokens = [lemmatizer.lemmatize(t) for t in tokens]
          return ' '.join(tokens)
  
      preprocessed_reviews = [preprocess(review) for review in reviews]
      labels = ['positive' if '!' in review or 'love' in review.lower() else 'negative' for review in reviews]
  
      model = make_pipeline(CountVectorizer(), MultinomialNB())
      model.fit(preprocessed_reviews, labels)
      predictions = model.predict(preprocessed_reviews)
  
      return classification_report(labels, predictions)
  