Hashtag Creator: Find frequent words and display their occurrences
From what I can tell, the &quot;weirdest&quot; thing in your code is the following:
Avoid list comprehensions if all you want are side-effects
In your Word class you have the following:
def add_sentences(self, *sentences):
    [self.sentences.append(s) for s in sentences]

That is a weird function because generally list comprehensions are created because we care about the list they actually build, not because we want side-effects.
Therefore, if you wanted to create a loop to do the .append you do, you would write something like
def add_sentences(self, *sentences):
    for s in sentences:
        self.sentences.append(s)

Having said that, your sentences is an iterable so what you can do is
def add_sentences(self, *sentences):
    self.sentences.extend(sentences)

*args is nice but not always necessary
Now, if we keep dissecting this function, we see that it is often called with a single argument, which is an iterable (usually a list), so while the *args pattern is nice, it is useless if everything you are going to do is call the function with
word.add_sentences(*iterable)

The *args syntax is useful for when you don't know how many arguments you are getting and it makes sense to call the function with many arguments.
For your use case, I don't think we will see things like
the = Word(&quot;the&quot;)
the.add_sentences(&quot;The cat is nice&quot;, &quot;I love the Python language&quot;)

This means that you can very well define your code to be
def add_sentences(self, sentences):
    self.sentences.extend(sentences)

And later you call it with
word.add_sentences(list_of_sentences)