input: Write a function to analyze the sentiment of a text using tokenization, stemming, and polarity scoring. The function should tokenize the text, stem the tokens, remove punctuation and stopwords, and then calculate the polarity score of the cleaned text. Return the polarity score.
  
  assert sentiment_analyzer("I love this product! It's amazing.")=={'neg': 0.0, 'neu': 0.229, 'pos': 0.771, 'compound': 0.8439}
  assert sentiment_analyzer("I hate this so much, it's terrible.")=={'neg': 0.538, 'neu': 0.462, 'pos': 0.0, 'compound': -0.6705}
  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 import SentimentIntensityAnalyzer
  import string
  
  def sentiment_analyzer(text):
      sia = SentimentIntensityAnalyzer()
      tokens = word_tokenize(text.lower())
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      cleaned_tokens = [stemmer.stem(word) for word in tokens if word.isalnum() and word not in stop_words and word not in string.punctuation]
      cleaned_text = ' '.join(cleaned_tokens)
      return sia.polarity_scores(cleaned_text)