2017-08-14 6 views
0

Aster utilisateur ici qui essaie de passer complètement à python pour l'analyse de texte de base. J'essaie de reproduire la sortie de ASTER ngram en Python en utilisant nltk ou un autre module. Je dois être en mesure de le faire pour ngrams de 1 à 4. Sortie à csv.Python et nGrams

DATA:

Unique_ID, Text_Narrative 

SORTIE Nécessaires:

Unique_id, ngram(token), ngram(frequency) 

Exemple sortie:

  • 023345 "I" 1
  • 023345 "Love" 1
  • 023345 "Python" 1
+0

Salut, bienvenue à SO, pouvez-vous inclure du code de ce que vous avez essayé? Quel est le problème principal? –

+0

Nous ne sommes pas un service de codage. S'il vous plaît montrez-nous ce que vous avez fait et où vous êtes coincé. –

+0

vous avez besoin de deux choses - 'open' ou' csv.writer' pour l'écriture du fichier, alors je recommanderais 'Counter' de' collections' et c'est à peu près tout. Voulez-vous la fréquence dans la chaîne unique_ID ou tout à fait? –

Répondre

0

J'ai écrit cette version simple uniquement avec la bibliothèque standard de python, pour des raisons pédagogiques.

Code de production devrait utiliser spacy et pandas

import collections 
from operator import itemgetter as at 
with open("input.csv",'r') as f: 
    data = [l.split(',', 2) for l in f.readlines()] 
spaced = lambda t: (t[0][0],' '.join(map(at(1), t))) if t[0][0]==t[1][0] else [] 
unigrams = [(i,w) for i, d in data for w in d.split()] 
bigrams = filter(any, map(spaced, zip(unigrams, unigrams[1:]))) 
trigrams = filter(any, map(spaced, zip(unigrams, unigrams[1:], unigrams[2:]))) 
with open("output.csv", 'w') as f: 
    for ngram in [unigrams, bigrams, trigrams]: 
     counts = collections.Counter(ngram) 
     for t,count in counts.items(): 
      f.write("{i},{w},{c}\n".format(c=count, i=t[0], w=t[1])) 
+0

merci Uri- ce code m'a obtenu à mi-chemin là. Pouvez-vous partager l'ajustement qui me permettrait d'exécuter un ngram de 2 mots, 3 mots, etc etc? –

+0

J'ai ajouté le calcul de bigrammes et de trigrammes. Veuillez accepter la réponse si cela vous a été utile. Si vous avez des demandes supplémentaires, posez une nouvelle question –

0

Comme les autres ont dit la question est vraiment vague, mais puisque vous êtes nouveau ici est un guide de forme longue. :-)

from collections import Counter 

#Your starting input - a phrase with an ID 
#I added some extra words to show count 
dict1 = {'023345': 'I love Python love Python Python'} 


#Split the dict vlue into a list for counting 
dict1['023345'] = dict1['023345'].split() 

#Use counter to count 
countlist = Counter(dict1['023345']) 

#count list is now "Counter({'I': 1, 'Python': 1, 'love': 1})" 

#If you want to output it like you requested, interate over the dict 
for key, value in dict1.iteritems(): 
    id1 = key 
    for key, value in countlist.iteritems(): 
     print id1, key, value