input: Write a function to perform sentiment analysis on product reviews using natural language processing techniques like tokenization, stopword removal, lemmatization, and n-gram feature extraction, and then classify the reviews using a Naive Bayes classifier. Return the classification report for the test set. If the input data is empty, raise a ValueError.
  def sentiment_analysis(data, path):
      if data.empty:
          raise ValueError("Input data is empty")
      
      data['tokenised'] = data['review'].apply(word_tokenize)
      stop_words = set(stopwords.words('english'))
      data['filtered'] = data['tokenised'].apply(lambda x: [val for val in x if val not in stop_words])
      wordnet_lemmatizer = WordNetLemmatizer()
      data['normalised'] = data['filtered'].apply(lambda x: [wordnet_lemmatizer.lemmatize(val) for val in x])
      cv = CountVectorizer()
      data['features'] = cv.fit_transform(data['normalised'].astype('str')).toarray()
      X = data['features']
      y = data['sentiment']
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
      model = MultinomialNB(alpha=0.1)
      model.fit(X_train, y_train)
      predictions = model.predict(X_test)
      report = classification_report(y_test, predictions)
      return report
  
  assert sentiment_analysis(pd.DataFrame({'review': ['Great product!', 'Terrible experience'], 'sentiment': ['positive', 'negative']}), 'reviews.csv')==classification_report(y_test, predictions)
output: def sentiment_analysis(data, path):
      if data.empty:
          raise ValueError("Input data is empty")
      
      data['tokenised'] = data['review'].apply(word_tokenize)
      stop_words = set(stopwords.words('english'))
      data['filtered'] = data['tokenised'].apply(lambda x: [val for val in x if val not in stop_words])
      wordnet_lemmatizer = WordNetLemmatizer()
      data['normalised'] = data['filtered'].apply(lambda x: [wordnet_lemmatizer.lemmatize(val) for val in x])
      cv = CountVectorizer()
      data['features'] = cv.fit_transform(data['normalised'].astype('str')).toarray()
      X = data['features']
      y = data['sentiment']
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
      model = MultinomialNB(alpha=0.1)
      model.fit(X_train, y_train)
      predictions = model.predict(X_test)
      report = classification_report(y_test, predictions)
      return report