Home > Enterprise >  getting all possible products of translation
getting all possible products of translation

Time:12-15

I have a tuple in Python that stores the translation of some English words in German that looks like this:

[("mother", ["Mutter"]), ("and", ["und"]), ("father", ["Vater"]), ("I", ["ich", "mich"]),("not", ["nicht"]), ("at", ["dort", "da"]), ("home", ["Haus", "Zuhause"]), ("now", ["jetzt"])]

As you can see, some of the English words have 2 possible translations in German

I need to create an Output which automatically gives all possible translations of a sentence. E.g.

[’ Vater ich nicht dort Haus jetzt ’,
’Vater ich nicht dort Zuhause jetzt ’,
’Vater ich nicht da Haus jetzt ’,
’Vater ich nicht da Zuhause jetzt ’,
’Vater mich nicht dort Haus jetzt ’,
’Vater mich nicht dort Zuhause jetzt ’,
’Vater mich nicht da Haus jetzt ’,
’Vater mich nicht da Zuhause jetzt ’] 

My first idea was to store the tuple in two different lists like this:

english = []
german = []

for pair in wordlist:
  english.append(pair[0])
  for item in pair[1]: german.append(item)

but I am not sure how to get the second German translation into another list, and how to make the Cartesian product of those lists, so that they appear in the right place

Could somebody help me with what do do here?

CodePudding user response:

You can use itertools.product:

from itertools import product


lst = [("mother", ["Mutter"]), ("and", ["und"]), ("father", ["Vater"]), ("I", ["ich", "mich"]),("not", ["nicht"]), ("at", ["dort", "da"]), ("home", ["Haus", "Zuhause"]), ("now", ["jetzt"])]

ger = [i[1] for i in lst] # get only german words

out = [' '.join(i) for i in list(product(*ger))] # combine words into string
Mutter und Vater ich nicht dort Haus jetzt
Mutter und Vater ich nicht dort Zuhause jetzt
Mutter und Vater ich nicht da Haus jetzt
Mutter und Vater ich nicht da Zuhause jetzt
Mutter und Vater mich nicht dort Haus jetzt
Mutter und Vater mich nicht dort Zuhause jetzt
Mutter und Vater mich nicht da Haus jetzt
Mutter und Vater mich nicht da Zuhause jetzt

CodePudding user response:

dataset = [("Mother", ["Mutter"]), ("and", ["und"]), ("father", ["Vater"]), ("I", ["ich", "mich"]),("not", ["nicht"]), ("at", ["dort", "da"]), ("home", ["Haus", "Zuhause"]), ("now", ["jetzt"])]

sent = "Mother I at home"
def translate(database, sampleSentence):
    dataDict = {k[0].lower() : k[1] for k in database} # convert to lowercase ; optional
    sentLst = sampleSentence.lower().strip().split() # convert sentence to list
    allTranslatons = [] # we'll hold translations here
    for wrd in sentLst:
        allCombs = dataDict[wrd] # get all combinatons of this word in German
        if len(allTranslatons) == 0: # if the list is empty, it means we haven't done anything
            allTranslatons.extend(allCombs) # add the first combination then
        else:
            holdout = [] # if not empty, then we need to add words to all the elements there
            for i in range(len(allTranslatons)): #loopng through them
                temp = allTranslatons[i] # get the word
                for allC in allCombs: #loop through the combinations
                    holdout.append(temp   " "   allC) # add this added combo to a temp list

            allTranslatons.clear() # once done, clean the allTranslations list to add fresh values
            allTranslatons.extend(holdout) # add the temp combos
    return allTranslatons

print(translate(dataset,sent ))
>>> ['Mutter ich dort Haus', 'Mutter ich dort Zuhause', 'Mutter ich da Haus', 'Mutter ich da Zuhause', 'Mutter mich dort Haus', 'Mutter mich dort Zuhause', 'Mutter mich da Haus', 'Mutter mich da Zuhause']
  • Related