DBW

Darjeeling, Bergamot and Walnuts

Showing posts with label nltk. Show all posts
Showing posts with label nltk. Show all posts

19.4.10

god_writes_good_code.py

# Copyright (c) 2010 DBW.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# pygmentize -f html -o god_writes_good_code.html god_writes_good_code.py
# More info @ http://burstcoding.blogspot.com/2010/04/rendering-code-via-pygments-in-your.html

import nltk
from nltk.corpus import PlaintextCorpusReader as PtCr

import numpy
import os


def cache_url(url, gunzip=True):
    """fetch the url locally if not already local.
    gunzip - {True,False} - pass through gunzip or not
    """

    filename = os.path.split(url)[-1]
    ext = os.path.splitext(url)[-1]

    # will we be unzipping?
    if gunzip and ext==".gz":
        unzipped = filename[:-3]
        if not os.path.exists(unzipped):
            err = os.system("gunzip -f %s" % filename)
            if err!=0:
                raise OSError, "gunzip error on file: %s" % filename
    
        return unzipped


    elif not os.path.exists(filename):
        err = os.system('wget %s' % url)
        if err!=0:
            raise OSError, "wget error on url: %s" % url

    return filename


def draw_from_cfdist(cfdist):
    
    values = numpy.array(cfdist.values())
    keys = cfdist.keys()
    a = numpy.add.accumulate(values)
    # draw random integer upto end of a+1
    rndi = numpy.random.randint(a[-1]+1)
    idx = a.searchsorted(rndi)
    return keys[idx]
    
def generate_model(cfdist, word, num=15):

    for i in range(num):
        print word, 
        word = draw_from_cfdist(cfdist[word])


if __name__=="__main__":

    # King James bible and New Hacker's Dictionary.
    sources = {'kjv':'http://www.ccim.org/~bible/kjv.rawtxt.gz',
               'nhd':'http://catb.org/jargon/oldversions/jarg2912.txt'}

    urls = sources.values()

    # cache the urls and get filenames
    filenames = []
    for url in urls:
        filenames.append(cache_url(url))

    source_files = dict(zip(sources.keys(),filenames))

    # Make a corpus out of local cache
    local_corpus = PtCr('.',source_files.values())

    words = reduce(lambda x,y: x+y, [local_corpus.words(source_files[src]) for src in source_files])

    print "Generating bigrams."

    bigrams = nltk.bigrams(words)

    print "Generating cfd."

    cfd = nltk.ConditionalFreqDist(bigrams)


    for i in range(20):
        generate_model(cfd,'God')
        print "\n"

Foray into Natural Language Processing

Python 2.6.4 (r264:75706, Dec 7 2009, 18:43:55)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import nltk
>>> nltk.chat.chatbots()

Which chatbot would you like to talk to?
1: Eliza (psycho-babble)
2: Iesha (teen anime junky)
3: Rude (abusive bot)
4: Suntsu (Chinese sayings)
5: Zen (gems of wisdom)

Enter a number in the range 1-5: 4

Talk to the program by typing in plain English, using normal upper-
and lower-case letters and punctuation. Enter "quit" when done.
========================================================================
You seek enlightenment?
>indeed
One may know how to conquer without being able to do it.
>why conquer?
Ask me no questions!
>I seek enlightenment
Heaven signifies night and day, cold and heat, times and seasons.
>And conquer
Attack him where he is unprepared, appear where you are not expected.
>is it worthwhile?
Please consider whether you can answer your own question.
>I cannot
The good fighters of old first put themselves beyond the possibility of defeat, and then waited for an opportunity of defeating the enemy.
>
>>> nltk.chat.chatbots()
Which chatbot would you like to talk to?
1: Eliza (psycho-babble)
2: Iesha (teen anime junky)
3: Rude (abusive bot)
4: Suntsu (Chinese sayings)
5: Zen (gems of wisdom)

Enter a number in the range 1-5: 5
***************************************************************************
Zen Chatbot!
***************************************************************************
"Look beyond mere words and letters - look into your mind"
* Talk your way to truth with Zen Chatbot.
* Type 'quit' when you have had enough.
***************************************************************************
Welcome, my child.
>Hello
Greetings. I sense your mind is troubled. Tell me of your troubles.
>Why conquer?
Why do you think conquer?
>One school might argue that it is a necessity of life
Form is emptiness, and emptiness is form.
>Conquer life, and life conquers us
The reverse side also has a reverse side.
>Submit to life, and life submits to us
When you're enlightened, every word is wisdom.
>Amen
Random talk is useless.
>Amen
The reverse side also has a reverse side.
>Random talk is useless
Form is emptiness, and emptiness is form.
>And so it is revealed that you are only the shadow of a zen master
I pour out a cup of water. Is the cup empty?