2017-10-09 3 views
0

Ich habe Daten, die einen Satz und eine Gruppe (Label) enthält -> Schlüssel, Wert-Paar ist (Gruppe, Satz) zu starten und ich möchte die teilen Satz in Wörter, so dass ich mit (Gruppe, Wort) Paare für alle Wörter in allen Sätzen enden. Wie kann ich das in einer Pipeline machen? Betrachten Sie dieses TestbeispielApache Beam Python Split-Satz in Schlüssel, Wert-Paar für jedes Wort

test_input = [{'group': '1', 'sentence': 'This is a sentence'}, 
       {'group': '1', 'sentence': 'This is another sentence'}, 
       {'group': '2', 'sentence': 'Here is a third sentence'}, 
       {'group': '3', 'sentence': 'The last example'}] 

test_transformation = (test_input 
         | 'split' >> beam.FlatMap(lambda x: (x["group"], x["sentence"].split())) 
        ) 

test_transformation 

Das obige Beispiel aufgeteilt ist, den Satz in eine Liste von Wörtern, sondern auch die gesamte Liste wird mit dem Wort gepaart. Wie kann ich diese Liste weiter aufschlüsseln? Der Ausgang für die erste Zeile unter:

['1',['This', 'is', 'a', 'sentence']] 

Während, was ich will, ist etwas mehr wie

[('1', 'This'), ('1', 'is'), ('1', 'a'), ('1', 'sentence')] 

Das fühlt sich an, als ob es sein sollte tun können, aber ich kann nicht herausfinden, wie man zu Dies.

Antwort

2

Dies scheint eher eine Python Frage zu sein, als ein Strahl Frage, weil weder das Problem selbst noch die Lösung einbeziehen Beam-APIs. Sie können ein Python list comprehension:

>>> x = {'group': '1', 'sentence': 'This is a sentence'} 

>>> (x['group'], x['sentence'].split()) 
('1', ['This', 'is', 'a', 'sentence']) 

>>> [(x['group'], word) for word in x['sentence'].split()] 
[('1', 'This'), ('1', 'is'), ('1', 'a'), ('1', 'sentence')] 
verwenden
0

Sie benötigen Ihr Lambda, um eine Liste mit einem Ausgabetupel für jedes Wort im Satz zu erstellen. Etwas wie:

test_transformation = (test_input 
        | 'split' >> beam.FlatMap(lambda x: [(x["group"], word) for word in x["sentence"].split())) 
        )