input: def sentiment_analysis(data: pd.DataFrame) -> str:
      """
      Perform sentiment analysis on product reviews using natural language processing techniques.
      The function takes a DataFrame containing product reviews and sentiment labels, tokenizes the reviews,
      removes stopwords, normalizes the words using lemmatization, and generates features using CountVectorizer.
      The generated features are then used to train a Multinomial Naive Bayes model to predict sentiments.
      Finally, a classification report is generated and returned as a string.
      
      >>> df = pd.DataFrame({
      ...     'review': ['This product is amazing!', 'Terrible experience with this product.'],
      ...     'sentiment': ['positive', 'negative']
      ... })
      >>> sentiment_analysis(df)
      '              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\\navg / total       1.00      1.00      1.00         2\\n'
      """
output:     
      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.tokenize import word_tokenize
      from nltk.stem import WordNetLemmatizer
      import nltk
      import string
  
      nltk.download('punkt')
      nltk.download('wordnet')
      nltk.download('stopwords')
  
      def preprocess_text(text):
          tokens = word_tokenize(text.lower())
          tokens = [token for token in tokens if token.isalpha()]
          tokens = [token for token in tokens if token not in stopwords.words('english')]
          lemmatizer = WordNetLemmatizer()
          tokens = [lemmatizer.lemmatize(token) for token in tokens]
          return ' '.join(tokens)
  
      data['review'] = data['review'].apply(preprocess_text)
  
      X = data['review']
      y = data['sentiment']
  
      pipeline = Pipeline([
          ('vectorizer', CountVectorizer()),
          ('classifier', MultinomialNB())
      ])
  
      pipeline.fit(X, y)
      y_pred = pipeline.predict(X)
  
      report = classification_report(y, y_pred, output_dict=False)
      return report
  