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 tokens, remove punctuation and stopwords, and then calculate the polarity score of the text using a sentiment intensity analyzer. Return the polarity score as a dictionary.
  assert sentiment_analyzer("I love this product!")=={'neg': 0.0, 'neu': 0.262, 'pos': 0.738, 'compound': 0.8516}
  assert sentiment_analyzer("This is the worst experience ever.")=={'neg': 0.64, 'neu': 0.36, 'pos': 0.0, 'compound': -0.765}
  assert sentiment_analyzer("The weather is neither good nor bad.")=={'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}
  assert sentiment_analyzer("I am feeling neutral about this.")=={'neg': 0.0, 'neu': 0.723, 'pos': 0.277, 'compound': 0.4215}
  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):
      sia = SentimentIntensityAnalyzer()
      tokens = word_tokenize(text.lower())
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalpha() and word not in stop_words]
      filtered_text = ' '.join(filtered_tokens)
      sentiment_scores = sia.polarity_scores(filtered_text)
      return sentiment_scores