Python and nGrams

378 Views Asked by At

Aster user here that is trying to move completely over to python for basic text analytics. I am trying to replicate the output of ASTER ngram in Python using nltk or some other module. I need to be able to do this for ngrams of 1 thru 4. Output to csv.

DATA:

Unique_ID, Text_Narrative

OUTPUT NEEDED:

Unique_id, ngram(token), ngram(frequency)

Example output:

  • 023345 "I" 1
  • 023345 "Love" 1
  • 023345 "Python" 1
2

There are 2 best solutions below

2
Uri Goren On BEST ANSWER

I wrote this simple version only with python's standard library, for educational reasons.

Production code should use spacy and 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
Axle Max On

As the others said the question is really vague but since you are new here's a long form guide. :-)

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