From: Daniel Moore Date: 2009-06-15T04:12:42+09:00 Subject: [QUIZ][SUMMARY] Twitter Personalities (#208) --001636e910efbdcd69046c53b9f9 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit There were two main components to this week's quiz, the interface to Twitter and the personality that generates messages. Let's start with the Twitter interfaces. Justin Collins' @ewdbot uses the Twitter4r gem[1]. The usage is straightforward. When given the account credentials it creates an object that provides methods to post status updates and get information from Twitter. def initialize @twitter = Twitter::Client.new :login => "?", :password => "?" end ... # Posting a quote @twitter.status :post, quote # Getting replies replies = @twitter.status(:replies) Sandro Pagonatti's @twsapiens uses the Twitter gem[2]. # Initialize Twitter credentials base = Twitter::Base.new(Twitter::HTTPAuth.new('twsapiens', )) # Get a random status text from the account's friends timeline base.friends_timeline.sort{|a,b| rand()<=>rand()}.first.text One comment about randomizing arrays is that Ruby 1.9.1 provides a `shuffle` method to `Array`, so now you no longer need to use `sort_by{ rand }` or the like if you are on 1.9.1. Both of the gems make connecting to Twitter via HTTP a breeze, though Twitter4r seems a little bit simpler to use. No matter which one you choose it shouldn't be more than a couple of lines to connect. Now that we're all connected to Twitter let's examine some ways to generate messages to send. @ewdbot by Justin selects a random Edsger Dijkstra quotation from the Edsger W. Dijkstra Archive[3]. The quotation is selected by downloading a random page from the archive, selecting sentences that meet certain size and regex requirements, then choosing a random sentence from that list. The trimmed word lists are cached locally to make future access easier. Justin's solution is well written and definitely worth examining if you are interested in learning more. Remember that Sandro was selecting a random status message from @twsapiens friends timeline? Well that message is used to seed the personality. Sandro uses the Linguistics gem[4] to create a collection of words related to the selected message. Those words are then arranged according to grammar rules from Ola Bini's port[5] of Peter Norvig's _Paradigms of Artificial Intelligence Programming_. Some of these sentences come out a little crudely constructed, but it is a very difficult problem for a program to construct it's own sentences. This sentence in particular is rather thought provoking: the character in table on a variation by he by volume with he on a variation typecast a notebook computer Thorsten Hater submitted a Markov chain text generator. I tested it out on some of the EWD quotations and it had some successful results. It would be interesting to combine the Markov chain text generation with trending topics in an attempt to create a popularity bot. Let the mailing list know when your bot hits 1,000,000 followers! Twitter Personality Accounts: * @iloveweather - Chris Shea * @ewdbot - Justin Collins * @twsapiens - Sandro Pagonatti Thank you everyone for your great responses to this week's quiz! [1]: http://twitter4r.rubyforge.org/ [2]: http://twitter.rubyforge.org/ [3]: http://www.cs.utexas.edu/~EWD/transcriptions/transcriptions.html [4]: http://www.deveiate.org/projects/Linguistics/ [5]: http://github.com/olabini/paipr/tree/7334d50b3b62924bc7c02effd22be0201658945b/lib/ch02 --001636e910efbdcd69046c53b9f9 Content-Type: application/x-gzip; name="208.tar.gz" Content-Disposition: attachment; filename="208.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fvy4n7et0 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 bnWrW93qVrf/WfsHWr1K0QB4AAA= --001636e910efbdcd69046c53b9f9--