2 votes

Générer des clés de façon itérative et compter le nombre de mots.

Existe-t-il un moyen d'itérer dans un dictionnaire pour compter le nombre de mots contenant la chaîne de caractères stockée dans le dictionnaire, et de l'enregistrer dans un nouveau dictionnaire qui renvoie le nombre de mots pour chaque élément de cette clé ?

Par exemple...

#Input:
inputdict = {
    'key1': 'The brown fox is brown and a fox.', 
    'key2': 'The red dog is the red and is a dog.'
}

newdict = {}
for k, v in inputdict:
    newdict(str(k) + "_" + str(v)) = count(v)

#Output:     
newdict = {
    'key1_the': 1, 'key1_brown': 2, 'key1_is': 1, # ...
    'key2_the': 2, 'key2_red': 2, # ...
}

Note complémentaire : Il s'agit d'une sorte de suivi d'un article à https://janav.wordpress.com/2013/10/27/tf-idf-and-cosine-similarity/ . Au lieu de lire des chaînes de caractères, j'essaie de lire des éléments d'un dictionnaire.

4voto

Martijn Pieters Points 271458

Oui, il suffit d'utiliser le collections.Counter() classe avec une expression de générateur produisant les valeurs que vous voulez compter :

from collections import Counter

Counter(f"{k}_{word}" for k, v in inputdict.items() for word in v.split())

J'ai supposé qu'une simple séparation sur les espaces blancs est suffisante, mais si vous avez besoin de quelque chose de plus sophistiqué, remplacez alors v.split() avec quelque chose qui produit un itérable de mots à compter.

Counter() est une sous-classe de dict mais avec quelques méthodes supplémentaires pour aider à gérer les comptages.

Démonstration :

>>> from collections import Counter
>>> inputdict = {
...     'key1': 'The brown fox is brown and a fox.',
...     'key2': 'The red dog is the red and is a dog.'
... }

>>> Counter(f"{k}_{word}" for k, v in inputdict.items() for word in v.split())
Counter({'key1_brown': 2, 'key2_red': 2, 'key2_is': 2, 'key1_The': 1, 'key1_fox': 1, 'key1_is': 1, 'key1_and': 1, 'key1_a': 1, 'key1_fox.': 1, 'key2_The': 1, 'key2_dog': 1, 'key2_the': 1, 'key2_and': 1, 'key2_a': 1, 'key2_dog.': 1})

Personnellement, je produirais des comptes séparés, en utilisant une structure de dictionnaire imbriquée :

{key: Counter(value.split()) for key, value in inputdict.items()}

et ainsi de suite :

{'key1': Counter({'brown': 2, 'The': 1, 'fox': 1, ... }),
 'key2': Counter({'red': 2, 'is': 2, 'The': 1, ... })}

afin que vous puissiez accéder aux comptes par phrase avec newdict["key1"] y newdict["key2"] .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X