input: Write a function to perform sentiment analysis on product reviews using natural language processing techniques like tokenization, stopword removal, lemmatization, and n-grams. The function should generate features for sentiment analysis using CountVectorizer and use a classification model to assign sentiments to the reviews. The function should read data from a CSV file named 'reviews.csv', which contains columns 'review' and 'sentiment'. It should return the classification report for the test set.
  assert sentiment_analysis(\{'review': ["Great product!", "Not satisfied at all.", "Loved it!", "Poor quality."], 'sentiment': [1, 0, 1, 0]\})==classification_report(y_test, predictions)
  assert sentiment_analysis(\{'review': ["Excellent!", "Terrible.", "Wonderful!", "Awful."], 'sentiment': [1, 0, 1, 0]\})==classification_report(y_test, predictions)
output: import pandas as pd
  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
  import nltk
  from nltk.corpus import stopwords
  from nltk.tokenize import word_tokenize
  from nltk.stem import WordNetLemmatizer
  
  def sentiment_analysis(data):
      df = pd.DataFrame(data)
      df['review'] = df['review'].apply(lambda x: ' '.join([WordNetLemmatizer().lemmatize(word.lower()) for word in word_tokenize(x) if word.isalpha() and word.lower() not in stopwords.words('english')]))
      X_train, X_test, y_train, y_test = train_test_split(df['review'], df['sentiment'], test_size=0.2, random_state=42)
      vectorizer = CountVectorizer(ngram_range=(1, 2))
      X_train_vec = vectorizer.fit_transform(X_train)
      X_test_vec = vectorizer.transform(X_test)
      model = MultinomialNB()
      model.fit(X_train_vec, y_train)
      predictions = model.predict(X_test_vec)
      return classification_report(y_test, predictions)