Social Media Hashtag Splitting
Bugs
Try some simple test cases to find bugs:
def test_split(s):
    splitter = Splitter(s)
    print(s, &quot;⇒&quot;, splitter.split(s))

test_split('[')        #no word, just punctuation
test_split('cat')
test_split('cattree')
test_split('cathode')  #one word, not cat-hode
test_split('muscat')   #one word, not mus-cat
test_split('onetwothree')
test_split('one1two2') #multiple numbers
test_split('2014')     #multi-digit number
test_split('xyzzy')    #unknown word
test_split('cathodemuscat') #cathode-muscat, not cathodemus-cat or cat-hodemuscat

These reveal some bugs:

Only the first call to split works (even on separate instances). This is because Splitter.words is shared between instances but is modified by separateWords, and words remain in it after each call.

Unknown words are omitted. What should separateString return when it doesn't recognize a word? The whole input?

Words containing numbers are not handled in any reasonable way. Perhaps any sequence of digits should be parsed as a word?

Brackets are treated as letters. The regex in cleanString should be &quot;[^\da-z]*&quot;, not &quot;[^\d[a-z]]*&quot;, unless you want to keep square brackets.


When modifying separateString, be careful with the case where the whole input as one word — it's easy to break this or have it only work by accident.
The last test case ('cathodemuscat') is particularly hard. Hint: split the string, recurse on both halves, and check that both halves succeed.
Architecture and simplification
The Splitter class does nothing useful. Its methods should be top-level functions instead. (This contributes to the Splitter.words bug.)
It's not a good idea for separateString to communicate with its recursive call by modifying input and words. This is bug-prone (it contributes to the Splitter.words bug) and hard to read. Instead, separateString should pass the appropriate substring as an argument to the recursive call, and append its word to the result. It may look something like this:
return separateString(inp[:-ind]) + [word]

Callers probably want a list of words, rather than a space-separated string, so separateString should return the list without joining.
It would be clearer (and faster) to load the dictionary once, as a set, rather than reading it repeatedly:
dictionary = set([cleanString(w) for w in open('word.txt')])

partition is unnecessary. Just write inp[len(inp)-ind:], or even inp[-ind:] if ind is never 0. (Negative indexes count from the end.)