input: def sentiment_analysis_pipeline(data: pd.DataFrame) -> float:
      """ Perform sentiment analysis on product reviews using natural language processing techniques. 
      The program uses tokenization to break down reviews into tokens, removes stopwords, normalizes 
      words using lemmatization, and generates features using CountVectorizer. A classification model 
      (Multinomial Naive Bayes) is then used to predict the sentiment of the reviews. The function 
      returns the accuracy score of the model on the test set.
      >>> data = pd.DataFrame({
      ...     'review': ['This product is amazing!', 'I hate this product.'],
      ...     'sentiment': ['positive', 'negative']
      ... })
      >>> sentiment_analysis_pipeline(data)
      1.0
      """
output:     
      from sklearn.model_selection import train_test_split
      from sklearn.feature_extraction.text import CountVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.metrics import accuracy_score
      from nltk.tokenize import word_tokenize
      from nltk.corpus import stopwords
      from nltk.stem import WordNetLemmatizer
      import nltk
      nltk.download('punkt')
      nltk.download('stopwords')
      nltk.download('wordnet')
  
      def preprocess_text(text):
          tokens = word_tokenize(text.lower())
          stop_words = set(stopwords.words('english'))
          tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
          lemmatizer = WordNetLemmatizer()
          tokens = [lemmatizer.lemmatize(word) for word in tokens]
          return ' '.join(tokens)
  
      data['review'] = data['review'].apply(preprocess_text)
      X_train, X_test, y_train, y_test = train_test_split(data['review'], data['sentiment'], test_size=0.2, random_state=42)
      vectorizer = CountVectorizer()
      X_train_vec = vectorizer.fit_transform(X_train)
      X_test_vec = vectorizer.transform(X_test)
      model = MultinomialNB()
      model.fit(X_train_vec, y_train)
      y_pred = model.predict(X_test_vec)
      return accuracy_score(y_test, y_pred)
  