2017-04-25 1 views
1

J'essaie de classer les colonnes et les valeurs (colonne = valeur) de manière significative à partir d'une chaîne d'entrée en utilisant des dictionnaires Python.Comment créer des listes de paires de valeurs de colonnes significatives à partir d'une chaîne?

input_string = "the status is processing and product subtypes are HL year 30 ARM and applicant name is Ryan" 

J'ai créé des dictionnaires de paires de valeurs clés. Dans le premier scénario, la clé est le nom de la colonne. La valeur représente l'indice de clé le plus bas trouvé dans input_string.

Voici le dictionnaire des noms de colonnes:

dict_columns = {'status': 4, 'product subtypes': 29, 'applicant name': 69} 

Dans le dictionnaire ci-dessus, 'status' a l'indice le plus bas de 4 dans le input_string.


De même, voici le dictionnaire des valeurs:

dict_values = {'processing': 14, 'hl': 50, 'year': 53, '30': 58, 'arm': 61, 'ryan': 87} 

La question est:
Comment obtenir le ouput attendu que:

list_parsed_values = ['processing', 'hl year 30 arm', 'ryan'] 

et la liste (facultative) correspondante des colonnes a s:

list_parsed_columns = ['status', 'product subtypes', 'applicant name'] 

Comment distinguer clairement les valeurs dans une liste?

+1

travaillant sur des données brutes (unstructed), je vous suggère d'utiliser 'regex' ici –

+2

s'il vous plaît, ajouter d'autres exemples d'entrée et de sortie souhaitée –

+1

Une idée: 're.split' avec' r '\ b (?: status | sous-types de produits | nom du demandeur) \ b'', et [supprimer tous les mots vides des items reçus] (http://stackoverflow.com/questions/ 5486337/comment supprimer-stop-mots-using-nltk-ou-python). Jeter les éléments vides. Pour savoir quel type d'information il s'agit, vous pouvez diviser avec le même modèle que ci-dessus mais supprimer '?:'. Ensuite, vous pouvez vérifier chaque colonne impaire pour la valeur et même colonne pour la clé. –

Répondre

2

Vérifiez l'approche suivante:

  • Construire le regex pour supprimer des mots non pertinents des résultats en fonction de la liste des mots vides anglais
  • Construire l'expression rationnelle de scinder le texte en utilisant les dict_columns clés
  • Après la division, compresser la liste résultante en une liste de tuples
  • Supprimer les mots non pertinents des valeurs et supprimer les espaces

Voici le code que je suis venu à ce jour:

import nltk, re 
s = "the status is processing and product subtypes are HL year 30 ARM and applicant name is Ryan" 
dict_columns = {'status': 4, 'product subtypes': 29, 'applicant name': 69} 
dict_values = {'processing': 14, 'hl': 50, 'year': 53, '30': 58, 'arm': 61, 'ryan': 87} 
# Build the regex to remove irrelevant words from the results 
rx_stopwords = r"\b(?:{})\b".format("|".join([x for x in nltk.corpus.stopwords.words("English")])) 
# Build the regex to split the text with using the dict_columns keys 
rx_split = r"\b({})\b".format("|".join([x for x in dict_columns])) 
chunks = re.split(rx_split, s) 
# After splitting, zip the resulting list into a tuple list 
it = iter(chunks[1:]) 
lst = list(zip(it, it)) 
# Remove the irrelevant words from the values and trim them (this can be further enhanced 
res = [(x, re.sub(rx_stopwords, "", y).strip()) for x, y in lst] 
# => 
# [('status', 'processing'), ('product subtypes', 'HL year 30 ARM'), ('applicant name', 'Ryan')] 
# It can be cast to a dictionary 
dict(res) 
# => 
# {'product subtypes': 'HL year 30 ARM', 'status': 'processing', 'applicant name': 'Ryan'} 
+1

Merci beaucoup. J'ai vraiment apprécié votre aide. Cela fonctionne bien maintenant. – User456898