input: Write a function to analyze the sentiment of a given text by tokenizing the text, stemming the tokens, removing punctuation and stopwords, and finally calculating the sentiment polarity score using the VADER sentiment analysis tool. If the input text is empty, return an empty dictionary.
  assert sentiment_analyzer("I love programming!")=={'neg': 0.0, 'neu': 0.295, 'pos': 0.705, 'compound': 0.802}
  assert sentiment_analyzer("This is a terrible day.")=={'neg': 0.625, 'neu': 0.375, 'pos': 0.0, 'compound': -0.4767}
  assert sentiment_analyzer("Python is a great language.")=={'neg': 0.0, 'neu': 0.319, 'pos': 0.681, 'compound': 0.6249}
  assert sentiment_analyzer("")=={}
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):
      if not text:
          return {}
      
      tokens = word_tokenize(text.lower())
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalnum() and word not in stop_words]
      
      analyzer = SentimentIntensityAnalyzer()
      sentiment_scores = analyzer.polarity_scores(' '.join(filtered_tokens))
      
      return sentiment_scores