Usando FreqDist e escrevendo para CSV

Sep 02 2020

Estou tentando usar nltk e pandas para encontrar as 100 palavras principais de outro csv e listá-las em um novo CSV. Consigo traçar as palavras, mas quando imprimo em CSV recebo

word | count
  52 |    7       <- This is current CSV output

Não tenho certeza onde estou errando, procurando alguma orientação.

Meu código é

words= []
with open('SECParse2.csv', encoding = 'utf-8') as csvfile:
    reader = csv.reader(csvfile)
    next(reader)
    freq_all = nltk.FreqDist()

    for row in reader:
        note = row[1]
        tokens = [t for t in note.split()] 

        freq = nltk.FreqDist(tokens) 
        fd_t100 = freq.most_common(100)
        freq_all.update(tokens)

    freq_all.plot(100, cumulative=False)

df3 = pd.DataFrame(freq_all,columns=['word','count'], index=[1])
df3.to_csv("./SECParse3.csv", sep=',',index=False)

Suponho que seja minha linha df3, mas, por mais que eu tente, não consigo fazer com que exiba a distribuição correta em CSV

Também tentei

df3 = pd.DataFrame(fd_t100,columns=['word','count'])

Alguns exemplos de conteúdo de CSV2-


filename                    text                                     
AAL_0000004515_10Q_20200331 generally industry may affected 
AAL_0000004515_10Q_20200331 material decrease demand international air travel
AAPL_0000320193_10Q_2020032 february following initial outbreak virus china 
AAP_0001158449_10Q_20200418 restructuring cost cost primarily relating early

Respostas

1 S3DEV Sep 03 2020 at 15:24

Aqui está. O código é bastante compactado, então sinta-se à vontade para expandir se desejar.

Primeiro, certifique-se de que o arquivo de origem seja realmente um arquivo CSV (ou seja, separado por vírgulas). Copiei / colei o texto de amostra da pergunta em um arquivo de texto e adicionei vírgulas (conforme mostrado abaixo).

Quebrando o código linha por linha:

  • Leia o CSV em um DataFrame
  • Extraia a textcoluna e aplique-a em uma sequência de palavras e crie tokens
  • Extraia as 100 palavras mais comuns
  • Grave os resultados em um novo arquivo CSV

Código:

import pandas as pd
from nltk import FreqDist, word_tokenize

df = pd.read_csv('./SECParse3.csv')
words = word_tokenize(' '.join([line for line in df['text'].to_numpy()]))
common = FreqDist(words).most_common(100)
pd.DataFrame(common, columns=['word', 'count']).to_csv('words_out.csv', index=False

Amostra de entrada:

filename,text
AAL_0000004515_10Q_20200331,generally industry may affected
AAL_0000004515_10Q_20200331,material decrease demand international air travel
AAPL_0000320193_10Q_2020032,february following initial outbreak virus china
AAP_0001158449_10Q_20200418,restructuring cost cost primarily relating early

Resultado:

word,count
cost,2
generally,1
industry,1
may,1
affected,1
material,1
decrease,1
...