2017-05-03 3 views
0

J'ai un fichier csv avec million + tweets. J'ai désinfecté les données et je veux trouver les expressions de mots 2/3/4 les plus fréquentes qui se produisent à travers le fichier. J'importe le csv sous forme de liste. Il est important que les bigrammes/trigrammes soient générés dans la ligne de liste. je. e. pour une liste: 'Sally est grand' 'Bob est pas'Les ngrams les plus fréquents dans un fichier CSV utilisant nltk

bigrams sera 'Sally est', 'est grand', 'Bob est', 'est pas'

Et pas 'grand Bob' (c.-à-lignes ne doivent pas être concaténées)

Voici le code:

#import necessary packages 
#read csv 
with open("small_sample.csv", 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    dfl = list(reader) 

#import ngrams function 
from nltk import ngrams 
#store bigrams in string_bigrams 
string_bigrams='' 
n=2 
for line in dfl: 
    string_bigrams += ngrams(str(line).split(),n) 

edit Puisque je ne peux pas utiliser + = avec l'objet générateur et que la conversion des ngrams en chaîne ne donne pas les résultats requis, j'ai utilisé itertools.chain pour ajouter à l'objet générateur.

code mis à jour:

for line in dfl: 
    string_bigrams 
    =itertools.chain(string_bigrams,ngrams(str(line).split(),n)) 

Cependant, la sortie ici a '[' concaténé à lui. i. e. si la liste est enregistrée comme [ 'Sally est grand', 'Bob est pas'] string_bigrams retourne

("['Sally", 'is') 
('is', "great']") 
("['Bob", 'is') 
('is', "not']") 

sortie prévue est

('Sally', 'is') 
('is', 'great') 
('Bob', 'is') 
('is', 'not') 

Pourquoi le [] en regard?

+0

Il y a une perte de choses confuses/indéfinies dans votre problème. Combien des plus fréquents voulez-vous? prenez-vous seulement des ngrams délimités par des espaces? – erip

+0

@erip # du plus fréquent dépendra des données. je. e. Je pourrais finir par prendre le top 10-20% du total des bigrams en fonction de la distribution de fréquence. si efficacement, j'aurais besoin de tous les ngrams classés par fréquence dans l'ordre décroissant. et oui, en regardant uniquement les ngrams délimités par des espaces – lilipunk

+0

J'espère que votre machine a beaucoup de mémoire pour les tweets> = 1M! Pouvez-vous montrer les deux premières lignes de votre fichier csv? – erip

Répondre

0
("['Sally", 'is') 
('is', "great']") 

Pourquoi le [] en regard?

Ce n'est pas seulement les parenthèses, vous avez également des citations parasites. Cela vient clairement de l'application de str à une liste, que les programmeurs Python novices font souvent pour éviter une erreur au lieu de déterminer d'où elle vient. D'où il vient doit être ceci: Votre "fichier csv" n'a pas réellement des colonnes, il a juste un message par ligne. Mais le module csv renvoie toujours le contenu de chaque ligne sous la forme d'une liste des colonnes, ce qui signifie que la variable line est une liste d'un élément qui ressemble à ceci:

['Sally is great'] 

Pour résoudre le problème, initialiser string_bigrams à une liste vide et changer cette

string_bigrams += ngrams(str(line).split(),n) 

à ceci:

string_bigrams.extend(ngrams(line[0].split(), n)) 

Et ne jamais, jamais appliquer str à une liste à nouveau.

+0

cela a résolu le problème. merci @alexis – lilipunk