Portugal international Almeida needed only a minute to score Werder's first goal of November in all competitions when he caught the St Pauli defence napping.
He doubled the lead in the 20th minute when Marko Marin broke quickly to send the striker through, and notched his hat-trick in the 64th, slotting through St Pauli keeper Thomas Kessler's legs for his ninth goal of the season.
But the 26-year-old lashed out at St Pauli central defender Carlos Zambrano after battling for possession 10 minutes from time and was shown a straight red card.
"I was being fouled throughout the game and I lost it at that moment," Almeida told reporters.
"That should not have happened and I would like to apologise to the team and the fans. Three goals are good but missing from the team now is not good," added Almeida, who can expect a ban.
St Pauli, who hit the woodwork twice in the game, were also left with 10 men after Markus Thorandt got his marching orders for a two-footed flying tackle on Werder captain Torsten Frings in the 90th minute.
Werder's win lifted them to 11th place on 18 points.
Bremen, who lost in the Champions League in midweek and are bottom of their group, had conceded 13 goals in the past four league matches.
They had not won any of their last seven games in all competitions and coach Thomas Schaaf, in charge since 1999, was under mounting pressure.
In the only other game on Sunday, a spectacular bicycle-kick by Cicero in the 81st minute cancelled out a Milivoje Novakovic goal to give visitors VfL Wolfsburg a 1-1 draw at Cologne, leaving the troubled hosts two spots off the bottom on 12 points.
On Saturday, Borussia Dortmund cruised past bottom-placed Borussia Moenchengladbach 4-1 to remain seven points clear of Mainz at the top with their 12th win in 14 games.
Bayern Munich moved up to fifth spot on 23 points after crushing Eintracht Frankfurt 4-1.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.