So you would like to provide one or more words and return all posts which contain either the word(s), or synonyms of the word(s), you provided.
It appears finding synonyms of a word is tricky. Some have suggested using WordNet. I'll assume the synonyms you need to consider are more limited, and you're alright with all the importance of synonyms within a given group having the same relationships and weight.
Then you can approach it using graph data structures and develop one graph for each set of word with the same meaning. I'm using the implementation of Graph
found in this post below – probably overkill but helps get the point across quickly.
# Produce a set of synonyms for each idea you're interested in searching for
synonyms = ["scam", "fraud", "sham", "swindle", "hustle", "racket"]
# Create a complete graph which connects each word in
# a group of synonyms to every other with equal weight
synonyms = [(x, y) for x in synonyms for y in synonyms]
print synonyms
'''
[('scam', 'scam'),
('scam', 'fraud'),
('scam', 'sham'),
('scam', 'swindle'),
('scam', 'hustle'),
('scam', 'racket'),
('fraud', 'scam'),
('fraud', 'fraud'),
('fraud', 'sham'),
('fraud', 'swindle'),
('fraud', 'hustle'),
('fraud', 'racket'),
('sham', 'scam'),
('sham', 'fraud'),
('sham', 'sham'),
('sham', 'swindle'),
('sham', 'hustle'),
('sham', 'racket'),
('swindle', 'scam'),
('swindle', 'fraud'),
('swindle', 'sham'),
('swindle', 'swindle'),
('swindle', 'hustle'),
('swindle', 'racket'),
('hustle', 'scam'),
('hustle', 'fraud'),
('hustle', 'sham'),
('hustle', 'swindle'),
('hustle', 'hustle'),
('hustle', 'racket'),
('racket', 'scam'),
('racket', 'fraud'),
('racket', 'sham'),
('racket', 'swindle'),
('racket', 'hustle'),
('racket', 'racket')]
'''
synonyms_graph = Graph(synonyms)
print synonyms_graph
'''
Graph({'fraud': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle']), 'scam': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle']), 'racket': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle']), 'swindle': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle']), 'hustle': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle']), 'sham': set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle'])})
'''
# Add another network of synonyms for a different topic
synonyms = ["flag", "problem", "issue", "worry", "concern"]
synonyms_graph.add_connections([(x, y) for x in synonyms for y in synonyms])
# Now you can provide any word in a synonym group and get all the other synonyms
print synonyms_graph._graph["scam"]
'''
set(['fraud', 'scam', 'sham', 'racket', 'hustle', 'swindle'])
'''
print synonyms_graph._graph["flag"]
'''
set(['flag', 'issue', 'problem', 'worry', 'concern'])
'''
# Apply this to your dataframe
df["Post_Word_Set"] = df["Post_Text_lowercase"].apply(lambda x: set(x.split()))
df["scam"] = df.apply(lambda x: 1 if x.Post_Word_Set.intersection(synonyms_graph._graph["scam"]) else 0, axis=1)
df["flag"] = df.apply(lambda x: 1 if x.Post_Word_Set.intersection(synonyms_graph._graph["flag"]) else 0, axis=1)
posts_of_interest = df[(df.scam.values == 1) | (df.flag.values == 1)].Post_Text_lowercase
print posts_of_interest
'''
This makes me worry. Maybe it's a scam
Big red flag here
So sick of all this fraud
Name: Post_Text_lowercase, dtype: object
'''
Definitely some potential to optimize here. You mentioned stemming and lemmatization, that's probably a good idea to incorporate. I'd also consider removing punctuation so you don't miss things like "this is a scam.".