input: Write a python function to fit a Naive Bayes classifier to training data and evaluate its performance on test data using a confusion matrix.
  ```python
  import numpy as np
  import pandas as pd
  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 confusion_matrix
  
  def fit_and_evaluate_naive_bayes(data_path):
      dataset = pd.read_csv(data_path)
      
      # Cleaning the texts
      import re
      import nltk
      nltk.download('stopwords')
      from nltk.corpus import stopwords
      from nltk.stem.porter import PorterStemmer
      corpus = []
      for i in range(0, dataset.shape[0]):
          review = re.sub('[^a-zA-Z]', ' ', dataset['Message'][i])
          review = review.lower()
          review = review.split()
          ps = PorterStemmer()
          all_stopwords = stopwords.words('english')
          all_stopwords.remove('not')
          review = [ps.stem(word) for word in review if not word in set(all_stopwords)]
          review = ' '.join(review)
          corpus.append(review)
      
      # Creating the Bag of Words model
      cv = CountVectorizer()
      X = cv.fit_transform(corpus).toarray()
      y = dataset.iloc[:, -1].values
      
      # Splitting the dataset into the Training set and Test set
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
      
      # Fitting Naive Bayes to the Training set
      classifier = MultinomialNB()
      classifier.fit(X_train, y_train)
      
      # Predicting the Test set results
      y_pred = classifier.predict(X_test)
      
      # Making the Confusion Matrix
      cm = confusion_matrix(y_test, y_pred)
      
      return cm
  
  # Example usage
  assert np.array_equal(fit_and_evaluate_naive_bayes('spam.csv'), np.array([[947,  6], [  9, 153]]))  # Use actual confusion matrix values from your dataset
  assert np.array_equal(fit_and_evaluate_naive_bayes('spam.csv'), np.array([[947,  6], [  9, 153]]))  # Use actual confusion matrix values from your dataset
  assert np.array_equal(fit_and_evaluate_naive_bayes('spam.csv'), np.array([[947,  6], [  9, 153]]))  # Use actual confusion matrix values from your dataset
output: def fit_and_evaluate_naive_bayes(data_path):
      dataset = pd.read_csv(data_path)
      
      # Cleaning the texts
      import re
      import nltk
      nltk.download('stopwords')
      from nltk.corpus import stopwords
      from nltk.stem.porter import PorterStemmer
      corpus = []
      for i in range(0, dataset.shape[0]):
          review = re.sub('[^a-zA-Z]', ' ', dataset['Message'][i])
          review = review.lower()
          review = review.split()
          ps = PorterStemmer()
          all_stopwords = stopwords.words('english')
          all_stopwords.remove('not')
          review = [ps.stem(word) for word in review if not word in set(all_stopwords)]
          review = ' '.join(review)
          corpus.append(review)
      
      # Creating the Bag of Words model
      cv = CountVectorizer()
      X = cv.fit_transform(corpus).toarray()
      y = dataset.iloc[:, -1].values
      
      # Splitting the dataset into the Training set and Test set
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
      
      # Fitting Naive Bayes to the Training set
      classifier = MultinomialNB()
      classifier.fit(X_train, y_train)
      
      # Predicting the Test set results
      y_pred = classifier.predict(X_test)
      
      # Making the Confusion Matrix
      cm = confusion_matrix(y_test, y_pred)
      
      return cm