How to write a book in 1 week

21Feb09

howtowriteabook2

GET REAL. Een boek schrijven is belachelijk. Dat ligt vooral aan de personen die een boek willen schrijven en hun profileringsdrang. Toch zal ik voor jullie deze week een boek schrijven. Met behulp van wat natural language engineering, wat data en text mining en een paar eenvoudige scraping scripts moet dat lukken in 1 week. Boven zien jullie alvast het schema dat ik zal volgen.

Vandaag heb ik een scrapertje geschreven dat op zoek gaat naar alle links op de literatuur nieuwssite www.decontrabas.com en ze in een SQLite database stopt:

cd /home/jan/HVG/scraping/decontrabas

sqlite3 Scrapes_DeContrabas.sqlite3db

drop table if exists links;

create table links(

which varchar(100),

mainsite varchar(100),

searchTime DATE,

fullURL varchar(500)

);

create unique index if not exists idx_fullURL on links(fullURL);

## File:: getSites.py

/usr/bin/python

import urllib2

import re

import os

from time import gmtime, strftime, localtime

from pysqlite2 import dbapi2 as sqlite

from BeautifulSoup import BeautifulSoup

from BeautifulSoup import SoupStrainer

class ScrapeDatabase():

def __init__(self, path, dbname, dbtable):

self._dbpath = os.path.join(path, dbname)

self._dbtable = dbtable

def connect(self):

self._connection = sqlite.connect(self._dbpath)

cur = self._connection.cursor()

cur.execute(“select max(rowid) from ” + self._dbtable)

self._maxrowid = cur.fetchall()[0][0]

self._connection.commit()

cur.close()

def close(self):

self._connection.close()

def pr(self):

print self._maxrowid

def insert(self, which, mainsite, searchTime, fullURL):

cur = self._connection.cursor()

searchTime = str(strftime(“%Y%

m%

d %H:%M:%S”, gmtime()))

cur.execute(“INSERT INTO ” + self._dbtable + ” VALUES(?,?,?,?)”, (which, mainsite, searchTime, fullURL))

self._connection.commit()

cur.close()

def geallurls(self):

cur = self._connection.cursor()

cur.execute(“select distinct fullURL from ” + self._dbtable)

urls = cur.fetchall()

self._connection.commit()

cur.close()

return urls

which = “De Contrabas”

url = “http://www.decontrabas.com”

needToContain = “contrabas”

scrapedb = ScrapeDatabase(“/home/jan/HVG/scraping/decontrabas”, “Scrapes_DeContrabas.sqlite3db”, “links”)

## First loop

scrapedb.connect()

page = urllib2.urlopen(url)

soup = BeautifulSoup(page)

for link in soup.findAll(‘a’, href=True):

href = link.get(‘href’)

if re.search(needToContain, href) == None:

print href + ” does not contain ” + needToContain

else:

try:

scrapedb.insert(which, url, “”, href)

except:

print “Insertion in database failed for ” + href

## UP to 5 times

for i in range(0,5):

alreadythere = scrapedb.geallurls()

for urls in alreadythere:

url = urls[0]

errorMsg = “Loop” + str(i) + “:::” + url + “:::”

try:

page = urllib2.urlopen(url)

try:

soup = BeautifulSoup(page)

for link in soup.findAll(‘a’, href=True):

href = link.get(‘href’)

if re.search(needToContain, href) == None:

print href + ” does not contain ” + needToContain

else:

try:

scrapedb.insert(which, url, “”, href)

except:

errorMsg = errorMsg + ” insertion in database failed for ” + href

except:

errorMsg = errorMsg + “, cannot parse document ” + href

except:

errorMsg = errorMsg + “, cannot download document ” + href

print errorMsg

scrapedb.close()

 

Op dit moment heeft de scraper al een 7238 unieke sites gevonden waarin op zijn minst het woord contrabas voorkwam en gelinkt was tot in de 5e graad met http://www.decontrabas.com (maw stap 1:: getSites.py van het How-to-write-a-book schema is running). Morgen meer.

howtowriteabookpart1



4 Responses to “How to write a book in 1 week”

  1. Jan,

    Ik ben benieuwd naar het eindresultaat. Kun je werkelijk het schrijven van een boek automatiseren? Hoe zit het dan met “de ziel” van het werk? Of is dat sowieso iets dat de lezer erin blaast? Of is de ziel belichaamd door het corpus van de auteur die je als uitgangspunt gebruikt in je schema?

    Laatst bedacht ik me, toen ik een aantal flarf-poëtica’s las, dat we vanuit ons dada-geïnspireerd gedachtengoed (falderalderisme) ergens een fout maken: het niet hebben van een mening, of die mening bijna op het manische af te ontwijken, plaatst je eigenlijk in een gemakkelijk daglicht. Er is geen kritiek mogelijk, want er is geen mening die onderuit gehaald kan worden, behalve dan het niet hebben van een mening.

    Ik geloof dat de uitwisseling van meningen het net interessant maakt. Je eigen stellingname kan sterker worden of als een levend wezen zich aanpassen en veranderen.

    Je zegt hier dat het schrijven van een boek belachelijk is. Dat is een mening. Dat het te maken heeft met profileringsdrang. Op dat tweede punt geef ik je gelijk: het gaat over het profileren van meningen. Sowieso. Zelfs een boek dat enkel observaties weergeeft, vertelt een mening. Een auteur veredelt een stuk dat eigen is aan de mens: communicatie. Schrijven is geen natuurlijke communicatie, maar geknutseld, doelgericht, als een versterkt fort, waarbij een eerlijke dialoog haast niet meer mogelijk is. De schrijver plaatst zichzelf op de troon van een godheid, regeert er een wereld, die hij of zij met enkele woorden laat bewegen in de richting die hij of zij verkiest. Enzovoort. Hoge profilering, dus.

    Misschien is dat inderdaad belachelijk. Of gaat het hier eerder over een bolwerk van meningen, dat getoetst wil worden aan de wereld? Welke meningen worden onderuit gehaald en door wie? Welke meningen nemen anderen op?

    Ik geloof dat met het schrijven van een boek een auteur zijn of haar wereldbeeld laat testen.
    Welk wereldbeeld wil jij laten testen?

  2. 2 schaufestspiele

    Denis. My point is
    1/ Je kan het schrijven van een boek automatiseren == Mening
    2/ Ik zal dat bewijzen door dat deze week te doen
    3/ Een Turing test zal uitwijzen dat dit geautomatiseerd boek een boek is
    4/ Je opmerking ivm de ‘ziel’ van een boek. Lees eerst even http://en.wikipedia.org/wiki/Chinese_Room. Maar JA, ik zal er dus de ziel inblazen via de syntax, maar ook iets meer (zie maar naar de schematische plot onder links).
    5/ Ik ben ook benieuwd naar het resultaat

  3. Jan,

    Bedankt voor de uitleg. De Chinese Room discussie is interessant. De conclusie van Searle dat programma’s geen semantiek hebben, maar dat programma’s enkel een syntax hebben en dat syntax niet voldoende is voor semantiek of om een “mind” te vormen, probeer je als ik het snap aan te vullen door concepten en onderwerpen te lokaliseren in de gevonden webteksten en deze te gebruiken om de brontekst (hier: Shakespeare) aan te passen of te transformeren.

    Wat me nog niet helemaal duidelijk is: is dit dan een syntactische ingreep of zit hier een beperkte vorm van semantiek in? Er worden syntactische categorieën gezocht: adjectieven, werkwoorden, … Deze worden dan verticaal vervangen door andere concepten en onderwerpen, binnen dezelfde categorie, waardoor een nieuwe tekst ontstaat uit de brontekst.

    Met het zoeken naar concepten en onderwerpen zit je toch in het veld van de betekenis?

    Straf man.

  4. 4 schaufestspiele

    be patient my friend, ik zit enkel nog maar in de beginfase.
    maar for clarity: de concepten en onderwerpen zullen gevonden worden adhv latent semantic analysis (http://en.wikipedia.org/wiki/Latent_semantic_analysis), hidden topic markov models (http://www.youtube.com/watch?v=vgqWMGT9haY) en concept nets (http://web.media.mit.edu/~hugo/conceptnet/). Dat zijn en principe ook puur syntactische regels want het is code geschreven in python, C, of R.


Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s


%d bloggers op de volgende wijze: