J'ai regardé autour de moi et je n'ai pas vraiment pu regrouper les informations dans différentes solutions partielles que j'ai trouvées, alors voici le problème:

Lors de l'analyse des avis Amazon, j'ai organisé les données dans un cadre de données et créé une colonne avec le nombre de chaque mot utilisé dans chaque avis. J'ai donc une colonne où chaque ligne contient une liste de tuples.

Je recherche un moyen efficace (mon ensemble de données contient des millions de critiques) pour fusionner toutes ces listes de tuples dans un seul dictionnaire. Idéalement, ce dictionnaire contiendrait déjà le poids de chaque mot (qui est le nombre de votes de leur critique respective), bien que je puisse le comprendre plus tard, si c'est trop demander.

Voici un exemple:

df['words'] = [('thank', 2),('you',2),('this',5)],
              [('interesting',1),('this',3)],
              [('thank,3),('me',2),('later',2)],
              [('me',2),('interesting',1)],
              [('thank',2),('you',1),('again',1)]
df['votes'] = 10
               5
               2
               1
               1

Sortie souhaitée (ou comme dict imbriqué) - le 1er nombre est la somme de la fréquence, présente dans les tuples, tandis que le 2ème est la somme du poids, situé dans la colonne 'votes':

top_words = {'this':(8,15),'thank':(7,13),'me':(4,3),'you':(3,11),'interesting':(2,6),'later':(2,2),'again':(1,1)}

J'ai essayé dict (zip (* df [mots]) et d'autres méthodes similaires, mais j'ai toujours des erreurs (les informations pondérées ajoutées seraient géniales mais ne sont pas encore strictement nécessaires). J'ai le sentiment que la réponse est assez simple, mais ça m'échappe.

Suggestions?

0
Luis Magalhaes 28 août 2020 à 15:04

2 réponses

Meilleure réponse

Vous pouvez utiliser la fonction de réduction et numpy pour cela.

df = {}
df['words'] = [[('thank', 2),('you',2),('this',5)],
              [('interesting',1),('this',3)],
              [('thank',3),('me',2),('later',2)],
              [('me',2),('interesting',1)],
              [('thank',2),('you',1),('again',1)]]
df['votes'] = [10,5,2,1,1]

from functools import reduce
import numpy as np

data = dict(zip(df['votes'], df['words']))
'''
{
 1: [('thank', 2), ('you', 1), ('again', 1)],
 2: [('thank', 3), ('me', 2), ('later', 2)],
 5: [('interesting', 1), ('this', 3)],
 10: [('thank', 2), ('you', 2), ('this', 5)]
}
'''

def add(a, x, data):
  for word in data[x]:
    if word[0] not in list(a.keys()):
      a[word[0]] = (0, 0)
    a[word[0]] = tuple(np.add(a[word[0]], (word[1], x)))
  return a

output = reduce(lambda a, x: add(a, x, data), data, {})

'''
{
 'again': (1, 1),
 'interesting': (1, 5),
 'later': (2, 2),
 'me': (2, 2),
 'thank': (7, 13),
 'this': (8, 15),
 'you': (3, 11)
}
'''

J'ai utilisé dict(zip(df['votes'], df['words'])) parce que la fonction de réduction a besoin que l'entrée soit du même type que la sortie.

1
Metehan Kutlu 28 août 2020 à 13:11

Essayez-le:

import numpy as np

top_words = {}
for ind, row in df.iterrows():
    for word in row["words"]:
        top_words[word[0]] = (sum(j[1] for i in df["words"]  for j in i if j[0] == word[0]), 
                              sum(i["votes"] for ind, i in df.iterrows() if word[0] in np.array(i["words"])))
0
dimay 28 août 2020 à 13:12