# Class to solve Shortforms, data comes from Abkuerzungen.txt import hickle as hkl import FASTsearch class SolveShorts(object): def __init__(self, hklDatabaseDir_Shorts, hklDatabaseDir_Shorts_All): self.ShortsDB_All = hkl.load(hklDatabaseDir_Shorts_All) self.ShortsDB = hkl.load(hklDatabaseDir_Shorts) # Input: csv file with the form ['d.h.', n] , ['das', 'heißt'] for each line # Output: hkl dump of array in form [[1],[d.h.],['das', 'heißt']] def create_hklDB_from_csv(self, csvDbDir): with open(csvDbDir) as lines: ShortsDB_All = [] for line in lines: ShortsDB_All.append(list(eval(line))) #print(ShortsDB_All) #print(ShortsDB_All[0][0]) hkldbShorts = [] counter = 0 for n in range(len(ShortsDB_All)): counter += 1 #if counter % 1000 == 0: #print(counter) hkldbShorts.append([ShortsDB_All[n][0][0]]) #print('hkldbShorts', hkldbShorts) #print('creating the hkl dump of ShortsDBAll') hkl.dump(ShortsDB_All, 'hkldbShorts_All.hkl', mode='w', compression='gzip') #print('done..') #print('Creating the hkl dump of ShortsDB') hkl.dump(hkldbShorts, 'hkldbShorts.hkl', mode='w', compression='gzip') #print('done..') return 'done' def load_DB_into_FASTsearch(self): #print('loading hkldbShorts ..') self.fsearch1 = FASTsearch.FASTsearch('hkldbShorts.hkl') #print('done') #print('generating BoW Model..') #self.fsearch1.Gen_BoW_Model(3000, "word", punctuation = True) #print('done') #print('loading the bow model') self.fsearch1.Load_BoW_Model('bagofwordshkldbShorts.pkl', 'DataBaseOneZeroshkldbShorts.hkl') #print('done') import spacy #print('loading the german spacy model..') self.nlp = spacy.load('de_core_news_sm') #print('done') #print('oi thats the get_feature_names', self.fsearch1.vectorizer.get_feature_names()) def ExplainShortsInSentencesWithBrackets(self, sentences): outsentences = [] count = 0 for sentence in sentences: count += 1 #print('processing sentence', count) nshort = [] therewasapossibleshort = 0 explanationlist = [] doc = self.nlp(' '.join(sentence)) #print('da sentence', sentence) newshorts = [] wordcount = 0 for oriword in sentence: wordcount += 1 if wordcount == len(sentence): word = oriword + '.' else: word = oriword newshort = [] prenewshort = [] punctcount = list(word).count('.') #print(word, list(word), punctcount) if punctcount > 1: replaceindex = sentence.index(oriword) dacount = 0 for letter in list(word): #print('letter in word split', letter) prenewshort.append(letter) if letter == '.': dacount += 1 newshort.append(''.join(prenewshort)) prenewshort = [] if dacount == punctcount: newshorts.append([newshort, replaceindex]) #print(newshorts) for newshort in newshorts[::-1]: if len(newshort) > 0: del sentence[newshort[1]] for part in newshort[0][::-1]: sentence.insert(newshort[1], part) #print('sentence after newshortreplace', sentence) for n in range(len(sentence)): NhasToBeChecked = True for r in range(len(explanationlist)): if explanationlist[r][3] <= n < explanationlist[r][1]: NhasToBeChecked = False # Liste von falsch erkannten, zb er sollte nicht erkannt werden :) if sentence[n] in ['Er', 'er', 'ab', 'Ab', 'so', 'da', 'an', 'mit', 'Am', 'am']: NhasToBeChecked = False if n != 0 and sentence[n][-1] != '.' and doc[n - 1].dep_[:2] != 'ART': NhasToBeChecked = False if NhasToBeChecked == True: bestmatches1, matchindex = self.fsearch1.search_with_highest_multiplikation_Output(sentence[n], 1) #print(bestmatches1, matchindex) interestingindex = 0 if sentence[n][-1] == '.': #print(sentence[n]) #print('oioioioioi') if len(sentence) - n > 5: for m in range(5): #print(n, m, n+m+1, len(sentence)) if sentence[n + m][-1] == '.' and sentence[n + m + 1][-1] != '.': interestingindex = m break if len(sentence) - n <= 5 and n != len(sentence) - 1: for m in range((len(sentence) - n)): #print('oleolaolu',n, m, n+m+1, len(sentence)) if m == (len(sentence) - n) - 1: if sentence[n + m][-1] == '.': interestingindex = m break else: if sentence[n + m][-1] == '.' and sentence[n + m + 1][-1] != '.' : interestingindex = m break #print(interestingindex, 'interestingindex') if interestingindex == 0: finalmatchindex = matchindex if interestingindex >= 1: thesentence = '' for i in range(interestingindex + 1): #print('sentence', sentence[n+i]) #print(thesentence + sentence[n+i]) if i == 0: presentence = sentence[n + i] if i >= 1: presentence = ' ' + sentence[n + i] thesentence = thesentence + presentence #print('thesentence',thesentence) mbestmatches, mmatchindex = self.fsearch1.search_with_highest_multiplikation_Output(thesentence , 1) #print(mmatchindex) finalmatchindex = mmatchindex if finalmatchindex[1] == 1: wordexplanationIndex = finalmatchindex[0] wordexplanation = self.ShortsDB_All[wordexplanationIndex][1] explanationlist.insert(0, [wordexplanation, n + interestingindex + 1, interestingindex, n]) #print('explanationlist', explanationlist) for i in range(len(explanationlist)): for k in range(len(explanationlist)): if explanationlist[i][3] == explanationlist[k][3] and i != k: if explanationlist[i][2] > explanationlist[k][2]: del explanationlist[k] if explanationlist[i][2] < explanationlist[k][2]: del explanationlist[i] for j in range(len(explanationlist)): sentence.insert(explanationlist[j][1], '(' + ' '.join(explanationlist[j][0]) + ')') #print(sentence) outsentences.append(sentence) # if uebereinstimmung, go to index and exchange return outsentences