input: Write a function to analyze the sentiment of a given text using natural language processing techniques. The function should tokenize the text, stem the words, remove punctuation, remove stopwords, and then calculate the polarity score using the VADER sentiment analysis tool.
  assert sentiment_analyzer("I love this product! It's amazing.")=={'neg': 0.0, 'neu': 0.308, 'pos': 0.692, 'compound': 0.6696}
  assert sentiment_analyzer("This is the worst experience I've ever had.")=={'neg': 0.677, 'neu': 0.323, 'pos': 0.0, 'compound': -0.6249}
  assert sentiment_analyzer("")=={'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
output: 
  from nltk.tokenize import word_tokenize
  from nltk.stem import PorterStemmer
  from nltk.corpus import stopwords
  from nltk.sentiment.vader import SentimentIntensityAnalyzer
  import string
  
  def sentiment_analyzer(text):
      # Tokenize the text
      tokens = word_tokenize(text.lower())
      
      # Remove punctuation
      tokens = [word for word in tokens if word.isalnum()]
      
      # Remove stopwords
      stop_words = set(stopwords.words('english'))
      tokens = [word for word in tokens if word not in stop_words]
      
      # Stem the words
      stemmer = PorterStemmer()
      tokens = [stemmer.stem(word) for word in tokens]
      
      # Join tokens back into a single string
      processed_text = ' '.join(tokens)
      
      # Calculate polarity score using VADER
      sia = SentimentIntensityAnalyzer()
      sentiment_scores = sia.polarity_scores(processed_text)
      
      return sentiment_scores
  