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']