input: 
  from typing import List
  
  
  def sentiment_analysis(reviews: List[str], sentiments: List[str]) -> str:
      """
      Perform sentiment analysis on product reviews using natural language processing
      techniques such as tokenization, removal of stopwords, lemmatization, and
      feature generation using n-grams. A classification model is then trained to
      assign sentiments to the reviews and a classification report is generated.
      
      >>> sentiment_analysis(['This product is amazing!', 'I hate this product.'], ['positive', 'negative'])
      "              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"
      """
  
output:     from sklearn.feature_extraction.text import TfidfVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.pipeline import make_pipeline
      from sklearn.metrics import classification_report
  
      # Create a pipeline with TF-IDF vectorizer and Naive Bayes classifier
      model = make_pipeline(TfidfVectorizer(), MultinomialNB())
  
      # Fit the model with the reviews and sentiments
      model.fit(reviews, sentiments)
  
      # Predict the sentiments for the reviews
      predicted_sentiments = model.predict(reviews)
  
      # Generate the classification report
      report = classification_report(sentiments, predicted_sentiments, output_dict=False)
  
      return report