input: Write a function to perform sentiment analysis on product reviews using natural language processing techniques. The function should tokenize the reviews, remove stopwords, lemmatize words, generate features using CountVectorizer, and use a Multinomial Naive Bayes classifier to predict sentiments. The function should also return a classification report showing the accuracy of the model. The function should be named `perform_sentiment_analysis`.
  
  assert perform_sentiment_analysis(pd.DataFrame({'review': ['I love this product!', 'This is a terrible product.'], 'sentiment': ['positive', 'negative']})).strip() == "              precision    recall  f1-score   support\n\n   negative       1.00      1.00      1.00         1\n   positive       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\n"
output: 
  def perform_sentiment_analysis(df):
      from sklearn.feature_extraction.text import CountVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.pipeline import Pipeline
      from sklearn.metrics import classification_report
      from nltk.corpus import stopwords
      from nltk.stem import WordNetLemmatizer
      from nltk.tokenize import word_tokenize
      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)
  
      df['review'] = df['review'].apply(preprocess)
  
      X_train, y_train = df['review'], df['sentiment']
  
      pipeline = Pipeline([
          ('vectorizer', CountVectorizer()),
          ('classifier', MultinomialNB())
      ])
  
      pipeline.fit(X_train, y_train)
      y_pred = pipeline.predict(X_train)
  
      return classification_report(y_train, y_pred)
  