Gespeichert unter: Datamining, Visualisierung | Schlagworte: Blog, Data Mining, Information, Meta-Blogging, Visualization
Beeindruckend. Matthew Hurst hat in seinem Blog einige Blogosphären Visualisierungen veröffentlicht. Mein persönlicher Favorit ist die folgende:
Dazu schreibt Matthew:
The dark edges show the reciprocal links (where A has cited B and B has cited A), the lighter edges indicate a-reciprocal links. The larger, denser area of the graph is that part of the blogosphere generally characterised by socio-political discussion (the periphery contains some topical groupings). Above and to the left is that area of the blogosphere concerned with technical discussion and gadgetry.
Mehr Visualisierungen gibt es in seinem Artikel Science July 24th 2009.
-r-
Gespeichert unter: Datamining, In eigener Sache, Information, Studium | Schlagworte: Blog, Meta-Blogging, Data Mining, Qualität, J48
Hi everyone,
I have almost finished formating my work and I guess I will go and print it in the next few days. I have learnt a lot of things about cleansing data and problems you stumble upon while data mining. Before really closing this chapter here and getting on to other projects I thought I might give you some ideas on my results.
In general it works quite well to determine the high quality blogs with the features used, even with rather simple algorithms. The decision tree in J48 for recognizing the controlled collection consists only of three nodes but gives you an accuracy of 98% for the German collection. The most interesting feature seems to be relationOutLinksToSize. This is confirmed by other collections and algorithms, and is quite an intuitively important feature. Just imagine link-spam blogs with a huge amount of outgoing links but no own content! What is more, with all collections the link-based features as the number of incomings links were really good discriminating features.
Interestingly, the accuracy (this means, how many blogs they recognize correctly) is not determined by the number of features you consider, but rather by how good they work together. With only 10 attributes taken together I get about the same accuracy for most algorithms, while some others improve substantially. This shows how important it is to have reliable data. The more useless features you give your algorithms to analyze, the more unreliable the resulting models will be. So it is much better to take a reduced number, which is easier to analyze and make your results with these ones…

J48 decision tree
So, what about the other collections? Here is the offside. The models seem to be at least partly language specific although I cannot really tell to what extent. All I can tell is that the Russian and the English collection created different models. While I achieved somewhat weaker results with the Russian one (67% with J48), the English collection was really a catastrophy: J48 got only 8% correct. I wondered why that was and tried to reduce the number of features considered, but only the Russian collection improved substantially through this (78% with J48). The English one stayed on that low level.
I guess the reason for the difference in accuracy is due to a certain lack of homogenity of the data. While I got rather homogenous collections in Russian and German, there are a lot of people blogging in English (as me right now). Necessarily the amount of different types of blogs raises in this language, and the overall number of blogs available increases. What is more, the average quality does not increase, so I get a random collection which is really heterogenous and the classifier does not know how to determine a profile of high qulity blogs. However, this idea needs to be proven by other results.
So, what do you think? Anybody caring for the results of the language recognition (russian blogs work best!)?
-r-
Gespeichert unter: Datamining, Information, Kultur, Studium | Schlagworte: Blog, Data Mining, Meta-Blogging, Persian, Russian
I just used the crawler on a random collection of Persian and Russian blogs. I expect interesting outcomes from applying data mining methods on the attributes coming from culture specific blog collections, so trying if the parsers work for these types was an important step. Of course I have already used it on blogs from the U.S., but the differences really were not at all grave. I fear there are no structural difference between English and German blogs, so the next idea would be to apply it to some more distant language area.
I downloaded a stopword list in Russian and integrated it in the search. Looking at the results at first I thought I had an character encoding issue. While a German blog has about 300 stopwords per page, a russian one has between 15 to 30, while the overall number of words does not decrease. I asked a Russian friend of mine, what the matter with my list could be and he had a look at the page and stopwords in question. Obviously the algorithm, the list and the pages were all normal, and he supposed that the difference was due to a factual difference in the structure of spoken language. While the number of Russian stopwords was actually at least the same as in German, articles were in fact rarely used on the web pages. If you consider the structure of German or English which are languages that demand articles all the time, I may have bumped into a structural feature which might really help me tell German blogs apart from Russian ones.
Another issue I am facing now is the lack of a controlled collection in Farsi. My friend Max has already helped me finding the Top 100 or so blog in Russian, but Farsi seems to be a much harder nut to crack. Does anybody know a Persian or even better both Persian language and a collection of Top300 Persian blogs? Help is highly appreciated…
-r-
Gespeichert unter: Datamining, In eigener Sache, Information, Studium | Schlagworte: Blog, Data Mining, Java, Meta-Blogging, Studium
Again, I was pointed at something by a friend which I had not thought of before. Of course it had occurred to me that the issue I am covering with my thesis might be interested to the English-speaking world, but up until now I was quite unsure whether to change the way I write (and publicly and unchangebly leave my English traces in the never-forgetting web). However, the decision is taken and this will be my first English post.
Aquaint Blog crawler project
As I introduced before, I am currently writing my master thesis on an issue which may be drafted „Quality Models and Data Mining in Blogs“. I explained to the German speaking readers, that I was going to implement a webcrawler based on an implementation from the Hildesheim University AQUAINT project. The bot is to crawl through a controlled collection of Weblogs and record attributes (currently 150) which could be of interest for the statistical creation of binary, quality based model. Using the popular WEKA-toolset, I am confident that it will be possible to find signigicant patterns in the entity of the quality-labeled blogs. These patterns will help us discriminating from a random collection of much bigger size, equally „good“ (i.e. reliable, of high quality, high reputation, A-Listers) blogs from blogs which do not reach up to the standard of the controlled collection. However, this is not the only goal of collecting those features: we might find different structures in e.g. German and English blogs, or which is even more probable European and Asian blogs. The range of possibilites is huge once the crawler is running in a stable version and I am sure the features I am recording really express what I think they do.
The current implementation…
Currently, the crawler is runs on a server and collects a number of random German blogs. I have run some trials with WEKA and it seems my idea is not all that dumb as I am able to successfully tell apart high-quality blogs from a random collection using the learned model using different algorithms (the weakest of which is Naive Bayes with an accuracy of 50%, the strongest being (currently) J48 with about 92%).
… and my current challenge: Coherence Analyis
What I am currently working at is a notion of cohesiveness of a blog, which I would like to explain in this post. What do I mean by „cohesiveness“? I would like to introduce this as a measure determining the topic variation of a certain blog. There may be blogs which cover e.g. the issues „dogs“ and „cats“, which occupy themselves with pets. On the other hand there may be bloggers writing on „cats“, „cars“, „computers“. As you can see, the range of different topics is bigger in the latter example. This means the blogger is less focussed on a specific range of topics.
How can we measure this cohesiveness and see how many topics the blogger is writing about? I consider the usage of tags and categories an important clue, as most bloggers use them to organize their post semantically. And what is more important, tags are even linked to a page which collects and displays all the posts marked with the specific tag. This page may be considered the blogger’s concept of the tag he uses. This is an important notion, as one blog might use the tag „cats“ to write on animals, while another one might use it as an acronym for „Computer Assisted Trading System„. So we can assume, the absolute meaning of the terms and their distane does not determine as good the actual topical difference of the blog as the blog-specific term-usage.
Now we can assume, that each of our tag-pages (or respectively categories page) which links to a same host page is representing one of the issues the blog is dealing with. How can we determine the similarity of the issues? One way, and this is the most obvious one, I guess, is to determine the similarity of each tag page as a basis to calculate the overall cohesiveness. This approach is not all new and it has been successfully used by a group of dutch scientist some time ago. I modified it to fit my needs and I would like to introduce some of the results here, including their shortcomings.
Jiyin He Coherence
There are a couple of possible approaches. The one I currently consider most applicable and quite sophisticated uses a package called simmetrics which allows the application of various string comparison algorithms, including some vector space models as cosine similarity and euclidean distance. It offers some other, more basic functionalities as qgram or dice, but I was primarily focussing on the vector space models.
One of my latest approaches is to use the cohesiveness notion introduced by the above mentioned group to calculate the similarity of all the links to the tag pages. The coherence ranges from 0 (meaning none) to 1 (meaning same documents). In my crawler, it is called „JiyinHeCoherencePerUrls“ after the person who introduced it (to me!). The pseudo-code is as follows:
For a given Blog, get all the Tag-Pages.
Take the first Tag-Page and get all the text on the page;
For each of the Tag-Pages,
{
take the next Tag-Page and get all the text on the page;
Compare the two texts using the simmetrics package and save the result;
Cummulate the results of the comparisons;
Count how many comparisons we have done;
Set first Tag-Page to next Tag-Page.
}
Set the Coherence to the cumulated similarities per number of thecomparisons.
However, this way of measurement has some offsides which I can only partly compensate:
- The simmetrics calculation using Vector space models is not stable. It sometimes just hangs up. I don’t know why. However, I am not sure if using character-based models is an appropriate alternative.
- As you see, I copy the text of the second page once. This is to avoid double server access to download the same page. We are opening up 10 pages per second if we do not reduce server strain, so this is why I set a delay to each page access which is between 4 seconds (trial) and 12 seconds (real crawling situation).
- This method eats up a lot of resources. I reduced the size of the strings to compare using just the link labels of a page, which is an approach which had been favoured by a lot of search engines in former times (maybe up till now). This is due to the fact that usually the content of pages can be quite well determined if you take into account the links they use. However, I still have the problem with the Vector space calculation hang-up with some pages…
Simple Term-based coherence
Another notion of coherence I have been experimenting with is a more simple, but also more stable one. I have refrained from calculating the similarity, I have just defined the coherence from to pages as the number of same words on two pages per number of all words on the pages. Of course we only consider unique terms, ignore double occurences, space, punctuation etc. This leads to a really simple model, the pseudo code of which is following:
For a given Blog,
get all the Tag-Pages.
Take the first Tag-Page and get all the text on the page;
Tokenize the content to words.
For each of the Tag-Pages,
{
take the next Tag-Page and get all the text on the page;
Tokenize the content to words.
For each of the words of the first Tag page
For each of the words of the next Tag page
If word#1 equals word#2
increment nr of same words per url;
Division: Divide the nr of same words pre url per words first Tag page + words on next Tag page;
Set first Tag page text to next Tag page text
}
Calculate Standard Deviation, Mean and Median for all the Divisions done throughout the page comparisons.
This approach is much faster and more stable, however one can doubt (as Max usually does), the validity of the calculated feature.
After all, I am not sure which algorithm to use in the end. Actually I prefer the first one, but as the Vector based similarity approach is not working, I doubt whether the second one is worse than qGram analyis. After all we must not forget, that the feature I am discussing here will not be used as an isolated instance but is an attribute next to about 149 which are less complicated I feel. While you can surely argue the validity of the coherence measure, there is less uncertainty on attributes as the number of H1 tags or outlinks. But I need to say, this one has been most interesting so far.
Anyway, hints on how to use to Vector based simmetrics here and why they hang up are highly appreciated, and so are ideas on which measure is the more appropriate one. I will happily provide the source code of the classes upon request. Usually I would publish it right away, but you see, I am still to be evaluated so I will better avoid bumbing into allegations I had commited plagiarism from an Internet source…
So, if you like it, there is more to come.
Good Night.
-r-
Gespeichert unter: Datamining, In eigener Sache, Studium | Schlagworte: Blog, Crawling, Data Mining, Meta-Blogging
Marcel hat gerade die 5000-Comments-Challenge des Smashing-Magazine als Herausforderung für den Crawler zugetwittert, die ich gerne annehme.
Die ersten drei Mal habe ich einen Timeout bekommen, was mir im Augeblick aber auch im Browser passiert und bei einer 1,6 MB großen HTML (denke ich) für das erste ok ist. Das vierte Mal lief der Crawler erfolgreich durch, wenn auch nicht schnell. Damit ergeben sich einige interessante mitgeloggte Features, von denen ich hier einen Teil aufführe. Ich widme sie: Marcel.
nrOutLinks: 2629
nrOutLinksSameHost: 258
fileSize: 1572606
nrDOMElems: 20672
nrTagMeta: 8
nrTagTable: 2
nrTagTd: 6
nrTagTr: 3
nrTagH1: 2
nrTagH2: 1
nrTagP: 0
nrTagB: 0
nrTagScript: 38
nrTagLayer: 0
nrTagStyle: 0
nrTagHr: 0
nrTextLayoutTags: 2298
nrTagCursBold: 17
nrTagFont: 0
linkLabelLengthDev: 13.0
linkLabelLengthMedian: 13.0
linkLabelLengthAve: 13191616766467000
nrTagFrameset: 0
nrTagForm: 2
nrSentenceMarkers: 6171
nrTableInTables: 0
blanksInText: 54122
lengthTitle: 73
lengthPureText: 304992
uniqueWordsPureText: 3895
nrWordsPureText: 16835
nrStopwordsPureText: 5623
nrImgLinks: 2322
relationLinksToLinksToSameHost: 0.09813617
nrhtmlLinkstoFeeds: 7
nrAlternateLinkstoFeeds: 1
Wer will, kann gerne nachzählen.
-r-
Gespeichert unter: Datamining, In eigener Sache, Studium | Schlagworte: Blog, Crawling, Data Mining, Meta-Blogging
Nachdem ich ja kürzlich schon grob auf die Kernidee meiner Arbeit eingegangen bin, will ich jetzt die Gelegenheit nutzen, über meine Erfahrungen mit dem Crawler ein wenig mehr zu berichten.
Mein Bot basiert auf dem OpenSource-Projekt JoBo1.4. Auf der Seite wird ein wenig tiefer gestapelt als notwenig, denn es heißt, JoBo verfolge Links und lade die Seiten herunter, im Prinzip es ist aber ein tolle Grundlage für einen Crawler. Mit dem Aufrufen der Seiten ist aber noch nicht getan, denn ich könnte im besten Fall einen Batzen Quellcode auslesen, ohne aber auf die Struktur des Dokuments schließen zu können, in der ganz wesentliche Informationen über die Seite stecken. In AQUAINT wurde schon implementiert, dass die aufgerufenen HTML-Seiten mit JTidy geparst und in DOM überführt werden, so dass ich die Markup-Informationen effektiv nutzen kann.
In diesem Rahmen sind nun die anderen Pakete und Klassen angeordnet, die unterschiedliche Fähigkeiten haben, und unterschiedliche Teile eines Blogs analysieren:
HTMLAnalyzer
Aus AQUAINT stammt der HTML-Analyzer, der gut 100 Markups analysiert und mitloggt. Wenn sich herausstellt, dass die Seite, auf die der Crawler trifft eine Blog sein sollte, wird diese Klasse aufgerufen, um entsprechende Features mitzuloggen. Wie ich schon im letzten Beitrag geschrieben habe, passiert die Überprüfung, ob ein Blog vorliegt, ganz simpel mit der Analyse, ob im Header des Blogs die Information über einen verfügbaren ALTERNATE Feed vorliegt. Mir ist bewusst, dass das kaum ausreicht, um definitiv zu sagen, ob ein Blog vorliegt, denn auch Seiten, die keine Blogs, sondern ganz einfach redaktionell erstellte Nachrichten sind, verfügen inzwischen über Aggregationen. Dennoch will ich den Raum für alle Arten von möglichen Blogs übrig lassen, denn es gibt auch ausgezeichnete redaktionell erstellte Blogs, die zwar geprüft sind, und eher dem Konzept einer Zeitung näher kommen, aber immernoch der Kategorie Blog zuzuzählen sind. Der Übergang ist leider fließend, und ohne einen Katalog, die Reduzierung auf einige blogtypische Hosts wie WordPress oder Blogspot, oder eine qualitative Analyse, ist wirklich schwer zu sagen, ob ein Blog vorliegt oder Online-Nachrichten. Das ist leider eine Ungenauigkeit, die ich wohl akzeptieren muss.
Wrapper
Zusätzlich ist ein Wrapper implementiert, d.h. eine Klasse, die eine Reihe von Suchmaschinen aufruft, um Rang, Inlinks der Seite usw. zu prüfen. Beliebt ist diese Methode nicht gerade bei Suchmaschinenanbietern, weil sie eine Menge Last erzeugt. Um meine IP nicht bei der dritten Seite bannen lassen zu müssen, habe ich eine Verzögerung im Wrapper eingebaut, die soweit angepasst werden kann, dass der Wrapper in seinem Seitenaufrufverhalten kaum von einem echten Nutzer zu unterscheiden sein sollte. Er funktioniert bei den meisten Seiten recht problemlos.
Bloganalyzer
Eine Kernklasse des Blog-Bots ist der BlogAnalyzer. Er analysiert all die Kriterien eines Blogs, die HTMLs üblicherweise nicht haben, und die der HTML-Analyzer dementsprechend auch nicht analysiert. Dazu gehören z.B. die Anzahl der Kommentare auf einer Seite, die Anzahl der Tags und Kategorien, usw. Problematisch ist hier vor allem, dass Standards fehlen und mein BlogAnalyzer natürlich oft nicht weiß, wonach er suchen soll. Ich hatte anfangs die Idee, die Blogroll zu analysieren, soweit vorhanden. Auch, wenn es einige wirklich gute Initiativen gibt, z.B. XOXO als Standard durchzusetzen, halten sich nicht alle Blogger und Bloganbieter daran, so dass es hier kein standardisiertes Markup gibt. Blogrollanalyse böte zwar interessante weitere Möglichkeite, z.B. zu prüfen welche Authority die verlinkten Sites besitzen, scheitert vorerst aber ganz trivial am Fehlen der Standards.
FeedAnalyzer
Eine weitere wesentliche Klasse, und eine, auf die ich besonders stolz bin, ist mein FeedAnalyzer. Der FeedAnalyzer z.B. liefert mir Informationen über die Anzahl der Beiträge, die durchschnittlichen Intervalle zwischen den Veröffentlichungen einzelner Posts und über die Länge ihrer Titel. Besonders interessant werden die Möglichkeiten bei Kommentarfeeds, über die z.B. die Anzahl der Kommentierenden ermittelt werden kann. Ich analysiere nur RSS2.0-Feeds, weil die vermeintlich am weitesten verbreitet sind. Atom ist zwar das neuere und stärker detaillierte Format, allerdings wird es nicht von allen Blogs angeboten, und so ist RSS2.0 meist der kleinste gemeinsame Nenner. Bei allen modellierten Features ist es wichtig, dass sie beim Großteil aller Blogs mehr oder weniger gut funktionieren, denn wenn eine hochspezialisierte Methode bei 3/4 der Kollektion Exceptions wirft und abstürzt, habe ich keine aussagekräftigen Zahlen. RSS bietet schon eine ganze Menge, ist schon schön in XML aufbereitet und kann gut von einem weiteren auf SAX basierenden Parser analysiert werden. Ich hatte an dieser Stelle auch versucht mit ROME zu arbeiten, das eine Weiterentwicklung für alle möglichen Aggregationsformate darstellt, bin aber leider gescheitert: irgendwie hat ROME nicht die Funktionen bereitgestellt, die ich brauchte, und so kam es zu kaum ordentlichen Ergebnissen. Zwar wurde die Seite schön geparst, ich konnte aber nicht auf einzelne Elemente von Feeds zugreifen. So nutze ich ROME derzeit nur, um zu prüfen, welche Art von Feed vorliegt, bevor ich den FeedAnalyzer losschicke, was eigentlich Verschwendung ist… Wenn sich jemand gut mit ROME auskennen sollte, sind Tips hoch geschätzt!
Die Sache mit der Zeit…
Der Crawler ruft, wenn man ihm eine Kollektion von Seiten gibt, nicht nur durch den Wrapper, sondern vor allem durch den BlogAnalyzer eine ganze Menge zusätzlicher Seiten auf, d.h. für jede Seite, die ich ihm zur Analyse vorgebe greift er gut 25 Mal auf per HTTP-GET auf irgendeinen Server zu. Demenstprechend produziert er ein wenig Last. Ich habe die Belastung anderer Server zwar durch die Drosselung verringert, allerdings grenzt das aufrufen von 25 Seiten innerhalb von 1,5 Minuten schon an geschäftliche Nutzung, so dass es nur eine Frage der Zeit ist, bis mein Provider mir zornige Emails schreibt. Der Crawler läuft also seit geraumer Zeit nur noch auf dem Server der Uni. Das hat weitere Vorteile, denn der Server ist natürlich auch um einiges fixer als mein Rechner bei der Berechnung einiger Features. Trotzdem ist es vielleicht von Interesse, wenn ich einige Zahlen nenne, damit ihr die Dauer einer Crawlsession einschätzen könnt:
Für die Analyse einer Seite braucht der Crawler gut 1,5 Minuten, ruft dabei 25 weitere Seiten auf und pausiert einige Sekunden zwischen ihnen. Meine kleine kontrollierte Kollektion von Blogs ist 300 Seiten dick, meine unkontrollierte derzeit 2400. Für die Analyse meiner kontrollierten Kollektion braucht mein Crawler vom Server aus etwa einen Tag, bei der großen hat es letztens 4-5 gedauert. Diese Dauer wird noch um einiges vervielfacht, wenn ich einige meiner Testanalysen zuschalte, die sich noch akut im Beta-Stadium befinden, und so noch nicht zur Analyse großer Kollektionen herangezogen werden.
Wie eine LogFile des Servers aussehen kann, seht ihr unten. Die Analyse ist nicht ganz sauber gelungen, was in diesem Fall an unsauberem XML im Feed lag.
http://bulgariana.blogspot.com/ 19 Feb 2009 16:31:27 GMT
text/html; charset=UTF-8
***Alternate feed found. Should be a Blog here!
***Starting to log HTML features!
***Starting Stopword Analysis
***Starting Wrapper with 11 sec SleepTime
***Finishing Wrapper
***Starting BlogAnalyzer
***Finishing BlogAnalyzer
***Trying to find Alternate Feeds
***Alternate Feed found: http://bulgariana.blogspot.com/feeds/posts/default
***Feed Type: rss_2.0
***Alternate Feed found: http://bulgariana.blogspot.com/feeds/posts/default?alt=rss
***Feed Type: rss_2.0
***More than single alternate RSS2.0 feed found: 2
***Applying heuristics.
***Got single alternate feed: http://bulgariana.blogspot.com/feeds/posts/default
***Starting to log RSS features
19.02.2009 17:32:49 hellmann.quality.AnalyzedURL setFeature
SCHWERWIEGEND: Fehler bei SetFeature: null
***Feed successfully analyzed.
***Processing HTMLLinks heuristically to find Comments Feed
*Error parsing CommentsFeed: Invalid XML: Error on line 42: The entity name must immediately follow the ‘&’ in the entity reference.
*Error parsing CommentsFeed: Invalid document
***RSS Comments Feed Determination failed
-r-
Gespeichert unter: Datamining, In eigener Sache, Netzkultur, Studium | Schlagworte: Web2.0, Blog, Meta-Blogging, Data Mining, Crawling
Ich muss nicht in meiner Freizeit bloggen, denn mit Blogs beschäftige ich mich schon jetzt auch während der Uni bis zum Umfallen. Ich habe Marcel davon erzählt und auch Stefan, und alle waren der Meinung, dass ich über meine Blog-Magisterarbeit bloggen soll. Meta-Blogging sozusagen. Ich habe das lange vor mir hergeschoben, aber inzwischen will mir niemand mehr zuhören (ich scheine ein ziemlicher Fachidiot geworden zu sein in den letzten Wochen), und ich fange lieber an, das jetzt als Beitrag zu verarbeiten, bevor ich tatsächlich Freunde verliere.
Seit Robert Basic seinen Blog verkauft hat, ist endlich auch in Deutschland klar, dass Blogs von hoher Qualität sowohl wirtschaftliche als auch gesellschaftliche Bedeutung haben können. In den Staaten gibt es diesen Trend schon lange: Huffingtonpost ist (zumindest gefühlt) seitdem es das Internet gibt auf Platz 1 bei Technorati. Blogs sind also zu einem mehr oder weniger festen Bestandteil unserer Medienlandschaft geworden, und vor allem den besonders hochwertigen und oft referenzierten A-Listern (oder auch Power-Bloggern) scheint dieser Trend zuzuschreiben zu sein.
Unser Blog ist kein A-Lister. Er ist vielleicht auch nicht besonders hochwertig. Trotzdem hat er sicherlich einige Kriterien, die ihn wiederum qualitativ von schlechteren Blogs abheben. Vielleicht ist es eine gewisse Update-Frequenz, allerdings kann man Blogs auch mit Spam updaten. Möglicherweise ist es eine bestimmte Bandbreite an Themen, oder aber auch eine gewisse Sorgfalt, mit der er designt und die Beiträge verfasst wurden. Vielleicht ist es die Beitragslänge. Oder aber die Länge aller Beiträge zusammen. Oder die Kombination mehrerer Kriterien. Keiner kann das so definitiv sagen, und wenn auch die meisten bestimmte Vermutungen haben („NEIN! Die Anzahl der Zeichenumbrüche kann es niemals sein!“), geht das, was man mit Sicherheit sagen kann, bislang nicht allzu weit über eben diese Vermutungen hinaus.
Hier kommt jetzt meine Arbeit ins Spiel. Keiner möchte Tausende von Blogs auf übereinstimmende Kriterien überprüfen, zumindest nicht händisch (auch, wenn Leitfragen zu konstruieren und Sie anhand von 7 Blogs exemplarisch zu beantworten, die normale Vorgehensweise an unserer Uni wäre). Was man dazu braucht, ist ein ordentlicher Bot, der eine vorgegebene Kollektion durchgeht, Links verfolgt, und alle interessanten Features mitloggt. Genau das passiert hier.
Ich bin sicherlich kein guter Programmierer. Da sind andere besser, und ich danke dem OpenSource-Prinzip und allen, die irgendwie etwas mit ihm zutun haben, schon einmal pauschal: Mein Crawler basiert auf Java1.6 und nutzt crawlerseitig ganz wesentlich die Bestandteile des OpenSource-Tools JoBo, das im Rahmen des Projektes AQUAINT an der Uni Hildesheim für die Automatische Qualitätsabschätzung von HTML in Form einer Suchmaschine implementiert wurde. Ich nutze einen Teil der in AQUAINT modellierten Features und Klassen, und habe auf Basis einiger weiter frei verfügbarer Klassen einen Crawler mit folgender Struktur zusammenprogrammiert:

Blogcrawler Architektur in Java1.6
Die Dokumente, auf die der Crawler stößt, werden mit den org.w3c Paketen in ein DOM überführt, sofern es sich um HTML-Dokumente handelt. Ich verfolge keine Dokumente weiter, die keine HTMLs sind, allerdings verzichte ich auch auf Dokumente, die keine Feeds in ihrem Header ausgezeichnet haben. Wenn man davon ausgeht, dass die Möglichkeit, einen Blog per Feed zu abonieren, ein wesentliches Kriterium für einen Blog ist, kann man hier schon die erste Einschränkung machen, um eine saubere Kollektion zu gewährleisten, sodass im Endeffekt folgende Zeilen bestimmen, ob die Site weiterverfolgt werden soll oder nicht. In unserem Fall sieht der relevante Teil des Headers folgendermaßen aus:
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de"> <head> <title> Rafazwonull vs Joe I/O</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style type="text/css" media="screen"> @import url( http://s3.wordpress.com/wp-content/themes/pub/benevolence/style.css?m=1232213194b ); </style> <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://rafazwonull.wordpress.com/feed/" /> <link rel="pingback" href="http://rafazwonull.wordpress.com/xmlrpc.php" />
Was bedeuten diese Zeilen für die Analyse? Allein durch den Header, lassen sich an sich schon folgende Aussagen treffen:
- Es könnte sich um einen Blog handeln, denn wir können ihn abonieren.
- Es ist ein Blog, der nur das Format RSS2.0 unterstützt.
- Der Titel ist in unserem Fall 23 Zeichen lang, was relevant wird, wenn man bedenkt, dass es Spamblogs gibt, die etwa den Titel „Zeichnen-Backen-Basteln-mit-Fingermalfarben-und-Salzteig“ haben…
Ich habe mich inzwischen auf diese und ähnliche Weise mit Blogs beschäftigt, und rund 150 Features in Java modelliert, die z.T. aus der Literatur, teils aus AQUAINT kommen, und z.T. selbst entwickelt sind. Sie lassen sich grob in die folgenden Bereiche gliedern:
- Datei-Maße (z.B. Dateigröße).
- HTML- Maße (z.B. <br>-Tags).
- Tabellen-Maße
- Listen-Maße (z.B. <li>-Tags)
- Farbmaße
- Verhältnismaße (d.h. Berechnung von Featuren, oder Kombination)
- Sprachliche Maße (d.h. Anzahl von Wörtern und Satzzeichen).
- RSS-Maße (d.h. alles, was man über die Feeds erfährt)
- Reputationsmaße (d.h. alles, was mit durch HITS oder PageRank-basierte Verfahren erfährt)
Eines dieser Kriterien sagt sicherlich nichts isoliert über die Beschaffenheit von qualitativ hochwertigen Blogs aus, die eine große Leserschafft haben, hochwertige Artikel und ein gutes Renommé. In ihrer Kombination, und sagen wir mal, über eine Kollektion von einem guten Tausend Blogs schaffen wir es durch den Abgleich und die Prüfung von sinntragenden Strukturen Korrelationen zu ermitteln, Features sinnvoll zu clustern usw. – kurz, alles, was mit durch die Möglichkeiten des Data Mining über zusammenhangslos scheinenden Daten ermitteln kann. Einige von diesen Zusammenhängen sind sicherlich offensichtlich, z.B. der Zusammenhang von Authority und InLinks. Bei anderen greift wiederum nur die statistische Analyse von großen Mengen an Datensätzen.
Mal schauen wie es damit weitergeht, vielleicht schreibe ich beizeiten noch ein wenig mehr hierzu, und halte euch auf dem Laufenden.
Soviel dazu. Gute Nacht.
-r-









