input: Write a function to analyze the sentiment of a text using natural language processing (NLP) techniques. The function should tokenize the text, remove punctuation and stopwords, stem the remaining words, and return the polarity score of the text. If the text is empty, return a default polarity score of {"neg": 0.0, "neu": 1.0, "pos": 0.0, "compound": 0.0}.
  assert sentiment_analyzer("I love this product!")=={"neg": 0.0, "neu": 0.254, "pos": 0.746, "compound": 0.8316}
  assert sentiment_analyzer("This is the worst day ever.")=={"neg": 0.625, "neu": 0.375, "pos": 0.0, "compound": -0.6249}
  assert sentiment_analyzer("")=={"neg": 0.0, "neu": 1.0, "pos": 0.0, "compound": 0.0}
  assert sentiment_analyzer("The movie was average, nothing special.")=={"neg": 0.0, "neu": 0.756, "pos": 0.244, "compound": 0.2755}
  assert sentiment_analyzer("Absolutely fantastic!")=={"neg": 0.0, "neu": 0.0, "pos": 1.0, "compound": 0.8225}
output: from nltk.sentiment import SentimentIntensityAnalyzer
  from nltk.tokenize import word_tokenize
  from nltk.corpus import stopwords
  from nltk.stem import PorterStemmer
  import string
  
  def sentiment_analyzer(text):
      if not text.strip():
          return {"neg": 0.0, "neu": 1.0, "pos": 0.0, "compound": 0.0}
      
      sia = SentimentIntensityAnalyzer()
      tokens = word_tokenize(text.lower())
      tokens = [word for word in tokens if word.isalpha()]
      tokens = [word for word in tokens if word not in stopwords.words('english')]
      stemmer = PorterStemmer()
      tokens = [stemmer.stem(word) for word in tokens]
      cleaned_text = ' '.join(tokens)
      
      sentiment = sia.polarity_scores(cleaned_text)
      return sentiment