input: Write a function to perform sentiment analysis on product reviews. 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 generate a classification report to evaluate the model's performance.
  assert sentiment_analysis([{'review': 'This product is amazing!', 'sentiment': 'positive'}])=='positive'
  assert sentiment_analysis([{'review': 'I hate this product!', 'sentiment': 'negative'}])=='negative'
  assert sentiment_analysis([{'review': 'It is just okay.', 'sentiment': 'neutral'}])=='neutral'
  assert sentiment_analysis([])=='No reviews provided'
output: def sentiment_analysis(reviews):
      if not reviews:
          return 'No reviews provided'
      
      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
  
      stop_words = set(stopwords.words('english'))
      lemmatizer = WordNetLemmatizer()
  
      def preprocess(text):
          tokens = word_tokenize(text.lower())
          tokens = [lemmatizer.lemmatize(word) for word in tokens if word.isalpha() and word not in stop_words]
          return ' '.join(tokens)
  
      texts = [preprocess(review['review']) for review in reviews]
      sentiments = [review['sentiment'] for review in reviews]
  
      vectorizer = CountVectorizer()
      X = vectorizer.fit_transform(texts)
  
      X_train, X_test, y_train, y_test = train_test_split(X, sentiments, test_size=0.2, random_state=42)
  
      model = MultinomialNB()
      model.fit(X_train, y_train)
  
      y_pred = model.predict(X_test)
      report = classification_report(y_test, y_pred, output_dict=True)
  
      return report['weighted avg']['precision']