Basic User Interaction in Python - syntax, docstrings, performance
Snippet 1.


The way yinyang is organized is quite unconventional. I presume that

tries += 1


is a typo (tries -= 1 would make much more sense). Even than I don't see a need for a recursion. A simple loop will do.

assert(input) also misses the point. If raw_input() succeeds, an assertion cannot possibly trigger; if not, EOFError will be raised. For the same reason, there's no need to

input = None


Passing yes and no arguments to yinyang need some serious justification. Returning True/False would be as good.


Snippet 2.


PUNCTUATION doesn't feel right: string.punctuation is there for a reason.

word.strip(p) is palliative. What if a punctuation mark is in the middle of the word?

A try/except flow is supposed to deal with problems beyond your control. It is not an if substitute. Besides,

    lc.word = word.lower()
    word_type = type_words.get(lc_word, None)


may not possibly raise AssertionError. Thus they do not belong to the try clause.

Also I guess you are trying too hard with affirmatives. y/n is just than enough. 


Snippet 3.


I don't see a reason for class Sentence to exist. BTW it is not documented at all.