input: Write a function to analyze the sentiment of a given text. The function should tokenize the text, stem the tokens, remove punctuation and stopwords, and then return the polarity score of the cleaned text. If the text is empty, return an empty dictionary.
  assert sentiment_analyzer("I love programming!") == {'neg': 0.0, 'neu': 0.275, 'pos': 0.725, 'compound': 0.8439}
  assert sentiment_analyzer("This is a terrible day.") == {'neg': 0.625, 'neu': 0.375, 'pos': 0.0, 'compound': -0.5423}
  assert sentiment_analyzer("") == {}
output: from nltk.tokenize import word_tokenize
  from nltk.stem import PorterStemmer
  from nltk.corpus import stopwords
  from string import punctuation
  from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
  
  def sentiment_analyzer(text):
      if not text:
          return {}
      
      tokens = word_tokenize(text.lower())
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      cleaned_tokens = [stemmer.stem(token) for token in tokens if token.isalnum() and token not in stop_words and token not in punctuation]
      
      analyzer = SentimentIntensityAnalyzer()
      cleaned_text = ' '.join(cleaned_tokens)
      sentiment_scores = analyzer.polarity_scores(cleaned_text)
      
      return sentiment_scores