#!/usr/bin/env python
#-*- coding: UTF-8 -*-
#
# Aufgabe 7: Stemmer für deutsche Verben
# Author: Matthias Rebel, 731220 

import sys


verbparadigmaSuffixe = { 'e':1, 't':2, 'en':3, 'st':4, 'et':5, 'te':6, 'est':7, 'tet':8, 'ten':9, 'end':10, 'test':11}
verbparadigmaPraefixe = {'ge':1 }

praefixe = set(['ab', 'an', 'auf', 'aus', 'be', 'bei', 'beiein', 'da', 'dabei', 'daher', 'daneben', 'daran', 'darauf', 'darein', 'darin', 'darunter', 'darüber', 'dazu', 'dran', 'drauf', 'drein', 'drin', 'drunter', 'drüber', 'durch', 'ein', 'ent', 'entgegen', 'er', 'fort','her', 'herab', 'herauf', 'heraus', 'herein', 'herum', 'herunter', 'hervor', 'hin', 'hinab', 'hinan', 'hinauf', 'hinaus', 'hinunter', 'hoch', 'liegen', 'los', 'mit', 'nach', 'nieder', 'rauf', 'raus', 'rein', 'rum', 'runter', 'still', 'tot', 'um', 'ver', 'voll', 'vor', 'voran', 'weg', 'weiter', 'zer', 'zu', 'zurück', 'zusammenauf'])


def createStopWordDict():
    """ 4.4.5 Liste starker/unregelmäßiger Verben, www.duden.de/produkte/downloads/duden04_verben.pdf
        1. Stammform / 2., 3. Pers. Sg. Ind.; (Imperativ Sg.) / 2. Stammform / 1./3. Pers. Sg. Konj. II / 3. Stammform 
        ... allerdings fehlen z.B. bei 'sein' > 'bin' , 'sind' , 'seid' , '' :(   """

    count = 0
    for line in ausnahmeliste:

        l = line.split()
        # if the last sign of a line is '1', then exist two possible stemforms of the 3rd
        if l[::-1][0] == '1':
            stemForms['x'+str(count)] = (l[0], l[::-1][1], l[::-2][1])
            for a in l[0:-3]:
                irregularFormsDict[a] = ('x'+str(count))

        # otherwise take the first, and the last, an the last-1 as 1st, 2nd, 3rd Stemmform
        else:
            stemForms['x'+str(count)] = (l[0], l[::-1][0], l[::-1][1])
            for a in l[0:-1]:
                irregularFormsDict[a] = ('x'+str(count))

        count += 1



def checkStopWordDictFor(verb):
    """ überprüfe ob die Form und mögliche andere Formen (verb+n, verb[0:len(verb)-1]) im 
        StopWordDict stehen, andernfalls analysiere das Verb von vorne und hinten """
    try:
        eidie = irregularFormsDict[verb]
        return eidie
    except:
        try:
            # das könnte auch noch ein guter Kandidat sein
            eidie = irregularFormsDict[verb+'n']
            return eidie
        except:
            try:
                # das könnte auch noch ein guter Kandidat sein
                eidie = irregularFormsDict[verb[0:len(verb)-1]]
                return eidie
            except:
                return 'no'


def checkAgainStopWordDictFor(verb):
    """ der bis hier ermittelte Stamm kann auch in der StopWord Liste stehen > checkAgain """
    try:
        eidie = irregularFormsDict[verb]
        return eidie, verb
    except:
        try:
            # das könnte auch noch ein guter Kandidat sein > schnit + t
            eidie = irregularFormsDict[verb+verb[::-1][0]]
            return eidie, verb+verb[::-1][0]
        except:
            return 'no', verb


def checkVsuffix(verb):
    " check for paradigma suffix, die Längsten zuerst > bevorzugt 'test' gegenüber 'est' ..."
    tmp = range(5)
    tmp.reverse()
    for x in tmp:
        try:
            if len(verb)-x > 2:
                verbparadigmaSuffixe[verb[len(verb)-x:]]
                verb = verb[:len(verb)-x]
                #print 'yo',verb
                return verb
        except:
            1+1
    return verb


def checkVpraefix(verb):
    " check for possible prefixes "
    if len(verb) > 3:
        tmp = range(len(verb))
        tmp.reverse()
        for x in tmp:
            try:
                if verb[0:x] in praefixe:
                    verb = verb[x:]
            except:
                1+1
    return verb




#   HAUPTTEIL ______________________________________________________________________________________


if __name__ == "__main__":

    try:
        datei = file('aufgabe_7_data/irregularVerbForms',"r")
        ausnahmeliste = datei.readlines()
        datei.close()

    except IOError:
        print "Cannot read from file", filename


    irregularFormsDict = {}
    stemForms = {}

    # step 1
    createStopWordDict()

    # step 2
    verb = raw_input('Enter a german verb: ')

    # step 3
    value = checkStopWordDictFor(verb)


    # step 4
    if value == 'no':

        count = 0
        while len(verb) > 4 and count != 5:
            verb = checkVpraefix(verb)
            count +=1


        if len(verb) > 3:
            verb = checkVsuffix(verb)

            # difficult to differ: gemacht > mach vs. gelobt > gelob
            try:
                verbparadigmaPraefixe[verb[0:2]]
                print 'I am not sure, the stem is: '+verb + ' or ' + verb[2:]
            except:
                value,verb = checkAgainStopWordDictFor(verb)
                if value == 'no':
                    print "the stem is '"+verb+"'"
                else:
                    stems = stemForms[value]
                    print "'"+verb+"'", 'is a irregular verb,'
                    print " so you get the three Stemforms (1st, 2nd, 3rd): ",stems

    else:
        stems = stemForms[value]
        print "'"+verb+"'", 'is a irregular verb,'
        print " so you get the three Stemforms (1st, 2nd, 3rd): ",stems

#___________________________________________________________________________________________ EOF