Python - Fusion liste de tuples de liste imbriquée

voix
2

Je liste de la liste des tuples que je veux fusionner. Ci-dessous le code combine les propriétés avec liste unique passé dans « classified_text », comment puis-je itérer ce concept pour la liste imbriquée de tuples? J'ai essayé d'ajouter une autre boucle et ajouter la méthode, mais je reçois une erreur différente. De toute façon simple de le faire? Merci!

Saisie de texte 1 - travail:

classified_text = [('John', 'PERSON'), ('Smith', 'PERSON'),('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('ABC', 'ORGANIZATION')] # Single list

Sortie texte 1 - travail:

[('PERSON      ', 'John Smith'), ('ORGANIZATION', 'University of ABC')]

Texte d'entrée 2 - ne fonctionne pas: liste nichés tuples

classified_text = [[('John', 'PERSON'), ('Smith', 'PERSON')], [('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('ABC', 'ORGANIZATION')], [('some', 'O'), ('text', 'O'), ('here', 'O')], [('Mark', 'O'), ('from', 'O'), ('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('CA', 'ORGANIZATION')]]

Code:

from itertools import groupby
entity_extracted_words = []
for tag, chunk in groupby(classified_text, lambda x:x[1]):
    if tag != O:
        info_ner = %-12s%tag,  .join(w for w, t in chunk)
        entity_extracted_words.append(info_ner)

print('entity_extracted_words:\n', entity_extracted_words)

Out Text 2 - Essayer d'obtenir ce résultat:

[('PERSON      ', 'John Smith'), ('ORGANIZATION', 'University of ABC'),('ORGANIZATION', 'University of CA')] 

Erreur: TypeError: pas tous les arguments convertis au cours de la mise en forme de chaîne

Créé 07/11/2018 à 20:23
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Essayez quelque chose comme ça. Tout simplement for-loopsur les sublists, combinant en une chaîne et les ajouter à lanewlist

classified_text = [[('John', 'PERSON'), ('Smith', 'PERSON')], 
                   [('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('ABC', 'ORGANIZATION')],
                   [('some', 'O'), ('text', 'O'), ('here', 'O')],
                   [('Mark', 'O'), ('from', 'O'), ('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('CA', 'ORGANIZATION')]]

newlist = []
for sublist in classified_text:
    combined = []
    for chunk, tag in sublist:
        if tag == 'O':
            continue
        combined_tag = tag
        combined.append(chunk)

    # Append tag and string to list
    if combined:
        # If you wanted to space filled as in your example, you can use
        # the strings ljust method
        newlist.append((combined_tag.ljust(12), ' '.join(combined)))

print(newlist)

#[('PERSON      ', 'John Smith'),
# ('ORGANIZATION', 'University of ABC'),
# ('ORGANIZATION', 'University of CA')]
Créé 07/11/2018 à 20:50
source utilisateur

voix
0

Vous pouvez d'abord aplatir votre liste de listes dans juste une liste:

flat_list = [item for sublist in classified_text for item in sublist]

Et cette liste à plat devrait fonctionner avec votre code d'origine.

Créé 07/11/2018 à 21:02
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more