input: from typing import List
  
  def perform_sentiment_analysis(reviews: List[str], sentiments: List[str], test_size: float = 0.2, random_state: int = 42) -> str:
      """ Perform sentiment analysis on a list of product reviews using natural language processing techniques. 
      The program tokenizes the texts, removes stopwords, normalizes words, generates features using CountVectorizer, 
      splits the data into training and test sets, trains a Naive Bayes classifier, and generates a classification report.
      >>> perform_sentiment_analysis(['Great product!', 'Terrible experience'], ['Positive', 'Negative'], test_size=0.5, random_state=1)
      '              precision    recall  f1-score   support
  
            Negative       1.00      1.00      1.00         1
            Positive       1.00      1.00      1.00         1
  
      accuracy                           1.00         2
      macro avg       1.00      1.00      1.00         2
      weighted avg    1.00      1.00      1.00         2
  
      '
      """
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
      from nltk.stem import WordNetLemmatizer
      import string
  
      # Tokenize and preprocess the reviews
      def preprocess(text):
          tokens = word_tokenize(text.lower())
          tokens = [word for word in tokens if word.isalpha()]
          tokens = [word for word in tokens if word not in stopwords.words('english')]
          lemmatizer = WordNetLemmatizer()
          tokens = [lemmatizer.lemmatize(word) for word in tokens]
          return ' '.join(tokens)
  
      preprocessed_reviews = [preprocess(review) for review in reviews]
  
      # Vectorize the preprocessed reviews
      vectorizer = CountVectorizer()
      X = vectorizer.fit_transform(preprocessed_reviews)
  
      # Split the data into training and test sets
      X_train, X_test, y_train, y_test = train_test_split(X, sentiments, test_size=test_size, random_state=random_state)
  
      # Train a Naive Bayes classifier
      classifier = MultinomialNB()
      classifier.fit(X_train, y_train)
  
      # Predict the sentiments for the test set
      y_pred = classifier.predict(X_test)
  
      # Generate the classification report
      report = classification_report(y_test, y_pred, output_dict=False)
  
      return report