input: 
  def perform_sentiment_analysis() -> str:
      """
      Perform sentiment analysis on product reviews using natural language processing techniques.
      The program tokenizes the reviews, removes stopwords, normalizes words, and generates features 
      using CountVectorizer. It then trains a Naive Bayes classifier and generates a classification 
      report based on test predictions.
      
      >>> perform_sentiment_analysis()
      "              precision    recall  f1-score   support\n\n           0       0.85      0.88      0.87       100\n           1       0.90      0.87      0.88       150\n\n    accuracy                           0.87       250\n   macro avg       0.88      0.88      0.88       250\nmicro avg       0.87      0.87      0.87       250\n"
      """
  
output:     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
      import string
  
      # Sample data
      reviews = [
          "This product is amazing!",
          "I love this product!",
          "Terrible product, would not recommend.",
          "Not worth the money.",
          "Great value for the price.",
          "Disappointed with the quality.",
          "Excellent service and product.",
          "Poor customer support.",
          "Highly recommend this product.",
          "Worst experience ever."
      ]
      labels = [1, 1, 0, 0, 1, 0, 1, 0, 1, 0]
  
      # Preprocessing
      stop_words = set(stopwords.words('english'))
      def preprocess(text):
          tokens = word_tokenize(text.lower())
          tokens = [word for word in tokens if word.isalpha() and word not in stop_words]
          return ' '.join(tokens)
  
      preprocessed_reviews = [preprocess(review) for review in reviews]
  
      # Feature extraction
      vectorizer = CountVectorizer()
      X = vectorizer.fit_transform(preprocessed_reviews)
  
      # Train-test split
      X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
  
      # Train Naive Bayes classifier
      classifier = MultinomialNB()
      classifier.fit(X_train, y_train)
  
      # Predict and generate classification report
      y_pred = classifier.predict(X_test)
      report = classification_report(y_test, y_pred, output_dict=True)
  
      # Format the report
      formatted_report = (
          f"              precision    recall  f1-score   support\n\n"
          f"           0        {report['0']['precision']:.2f}       {report['0']['recall']:.2f}       {report['0']['f1-score']:.2f}        {report['0']['support']}\n"
          f"           1        {report['1']['precision']:.2f}       {report['1']['recall']:.2f}       {report['1']['f1-score']:.2f}        {report['1']['support']}\n\n"
          f"    accuracy                            {report['accuracy']:.2f}       {report['macro avg']['support']}\n"
          f"   macro avg        {report['macro avg']['precision']:.2f}       {report['macro avg']['recall']:.2f}       {report['macro avg']['f1-score']:.2f}        {report['macro avg']['support']}\n"
          f"micro avg        {report['weighted avg']['precision']:.2f}       {report['weighted avg']['recall']:.2f}       {report['weighted avg']['f1-score']:.2f}        {report['weighted avg']['support']}\n"
      )
  
      return formatted_report