input: def perform_sentiment_analysis(data: pd.DataFrame) -> str:
      """ Perform sentiment analysis on product reviews using natural language processing techniques.
      Tokenize the texts, remove stopwords, normalize words, and generate features using CountVectorizer.
      Split the data into training and test sets, train a Multinomial Naive Bayes model, and generate
      a classification report.
      >>> data = pd.DataFrame({
      ...     'review': ["This product is amazing!", "Very disappointed in the quality", "Loved it!"],
      ...     'sentiment': [1, 0, 1]
      ... })
      >>> perform_sentiment_analysis(data)
                   precision    recall  f1-score   support
      
                0       1.00      1.00      1.00         1
                1       1.00      1.00      1.00         2
      
      micro avg       1.00      1.00      1.00         3
      macro avg       1.00      1.00      1.00         3
      weighted avg    1.00      1.00      1.00         3
      """
      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:     return report