Esta es la muestra de mi marco de datos Pandas, que contiene 30,000 filas [excluyendo encabezados de columna]. La expresión viene con dos clases, principalmente Triste y Feliz.

Expression              Description
Sad                     "people are sad because they got no money."
Happy                   "people are happy because ..."
Sad                     "people are miserable because they broke up"
Happy                   "They got good money"

Basado en el ejemplo anterior, me gustaría contar la cantidad de frecuencias, lo que me permite la cantidad de palabras que aparecen en la descripción de la expresión "Triste" y "Feliz" en un diccionario. p.ej. {triste: {gente: 2}, feliz: {feliz: 1}}

Este es mi código:

 def calculate_word_frequency(lst, classes):
        #variable
        wordlist = []
        dict_output = {}
        count = 0
        term = ""

data = [lst.columns.values.tolist()] + lst.values.tolist() #to convert into a list


for i in range(1,len(data)):
    if data[i][0] == classes[0]:
        wordlist = data[i][1].lower().split(" ")

        for words in wordlist:
            wordlist.append(words)

            for word in wordlist:
              if word in dict_output:
                dict_output[wordlist] += 1
              else: 
                dict_output[wordlist] == 1
                print(dict_output)

El resultado esperado se basaría en el número de palabras que aparecen en cada Expresión, respectivamente.

#Test case:
  words, freqs_per_expression = calculate_word_frequency(social_df, ["Sad", "Happy"])
  #output: 538212

print(freqs_per_class["sad"]["people"]) #output: 203

Debido al conjunto de datos, a menudo enfrento frecuentes bloqueos y retrasos en mi VS. Por lo tanto, no puedo recuperar ningún resultado. Me preguntaba si hay mejores técnicas que pueda utilizar para lograr los datos deseados de {word: count}.

¡Gracias!

0
yan 17 dic. 2019 a las 04:00

2 respuestas

Podemos lograr los resultados deseados en unos pocos pasos. Si está utilizando pandas >= 0.25, puede utilizar la nueva función explode; de lo contrario, esta solución logrará lo que desea.

from collections import defaultdict

exploded = df.set_index('Expression') \
             .stack() \
             .str.split(' ', expand=True) \
             .stack() \
             .reset_index() \
             .drop(['level_1', 'level_2'], axis=1) \
             .rename(columns={0: 'Word'})

print(exploded)

   Expression       Word
0         Sad     people
1         Sad        are
2         Sad        sad
3         Sad    because
4         Sad       they
...

counts = pd.DataFrame(exploded.groupby('Expression')['Word'].value_counts()) \
                              .rename(columns={'Word': 'Count'}).reset_index().to_dict('records')

d = defaultdict(dict)

for rec in counts:
    key = rec.get('Expression')
    word = rec.get('Word')
    count = rec.get('Count')
    d[key].update({word: count})

print(d)

defaultdict(dict,
            {'Happy': {'...': 1,
              'They': 1,
              'are': 1,
              'because': 1,
              'good': 1,
              'got': 1,
              'happy': 1,
              'money': 1,
              'people': 1},
             'Sad': {'are': 2,
              'because': 2,
              'broke': 1,
              'got': 1,
              'miserable': 1,
              'money.': 1,
              'no': 1,
              'people': 2,
              'sad': 1,
              'they': 2,
              'up': 1}})
0
aws_apprentice 17 dic. 2019 a las 02:04

Aquí un ejemplo, tal vez esto ayude a completar su código:

from collections import Counter
from io import StringIO
import pandas as pd

data = """
Expression,Description
Sad,"people are sad because they got no money."
Happy,"people are happy because ..really."
Sad,"people are miserable because they broke up"
Happy,"They got good money"
"""
#read csv
df = pd.read_csv(StringIO(data),sep=',')
#Only select result where Expression = 'Sad'
dfToList=df[df['Expression']=='Sad']['Description'].tolist()
# All dict 
print(dict(Counter(" ".join(dfToList).split(" ")).items()))

words=dict(Counter(" ".join(dfToList).split(" ")).items())

for key in words:
  # Here your conditions what you want
  print(key, '->', words[key])

También puedes usar isin () para múltiples condiciones ... Feliz ... Malo ... etc:

dfToList=df[df['Expression'].isin(['Bad', 'Happy'])]['Description'].tolist()

Salida:

{'people': 2, 'are': 2, 'sad': 1, 'because': 2, 'they': 2, 'got': 1, 'no': 1, 'money.': 1, 'miserable': 1, 'broke': 1, 'up': 1}
people -> 2
are -> 2
sad -> 1
because -> 2
they -> 2
got -> 1
no -> 1
money. -> 1
miserable -> 1
broke -> 1
up -> 1
-2
GiovaniSalazar 17 dic. 2019 a las 02:11