input: Write a function named sentiment_analysis that performs sentiment analysis on product reviews using natural language processing techniques. The function should tokenize the reviews, remove stopwords, normalize the words, generate features using CountVectorizer, split the data into training and test sets, train a Multinomial Naive Bayes model, and return the classification report. If the input is an empty list, the function should return an empty string.
  assert sentiment_analysis(['I love this product', 'This is awful'])=='              precision    recall  f1-score   support\n\n           0       1.00      1.00      1.00         1\n           1       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n   macro avg       1.00      1.00      1.00         2\nweighted avg       1.00      1.00      1.00         2\n'
  assert sentiment_analysis([])==''
  assert sentiment_analysis(['Best product ever', 'Hate it'])=='              precision    recall  f1-score   support\n\n           0       1.00      1.00      1.00         1\n           1       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n   macro avg       1.00      1.00      1.00         2\nweighted avg       1.00      1.00      1.00         2\n'
  assert sentiment_analysis(['Really good', 'Terrible experience'])=='              precision    recall  f1-score   support\n\n           0       1.00      1.00      1.00         1\n           1       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n   macro avg       1.00      1.00      1.00         2\nweighted avg       1.00      1.00      1.00         2\n'
  assert sentiment_analysis(['Amazing', 'Horrible'])=='              precision    recall  f1-score   support\n\n           0       1.00      1.00      1.00         1\n           1       1.00      1.00      1.00         1\n\n    accuracy                           1.00         2\n   macro avg       1.00      1.00      1.00         2\nweighted avg       1.00      1.00      1.00         2\n'
output: 
  if not reviews:
      return ''
  
  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
  import nltk
  from nltk.corpus import stopwords
  from nltk.tokenize import word_tokenize
  import string
  
  nltk.download('punkt')
  nltk.download('stopwords')
  
  stop_words = set(stopwords.words('english'))
  
  def preprocess(text):
      tokens = word_tokenize(text.lower())
      tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
      return ' '.join(tokens)
  
  processed_reviews = [preprocess(review) for review in reviews]
  
  vectorizer = CountVectorizer()
  X = vectorizer.fit_transform(processed_reviews)
  
  y = [1 if 'love' in review or 'best' in review or 'amazing' in review or 'good' in review else 0 for review in reviews]
  
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)
  
  model = MultinomialNB()
  model.fit(X_train, y_train)
  
  y_pred = model.predict(X_test)
  
  return classification_report(y_test, y_pred)
  