Last week, I read an article about Latent Semantic Indexing (
which has been stewing in my mind ever since. I thought I’d sit down
and make a link to it here, and as I started the search for the article I
realized that I should have bookmarked it. So I thought, "Maybe I
did bookmark it, but just forgot." I looked in my bookmarks
list, and there were five or six unrecognizable links there. So, I headed
back to Google and restarted the longer-than-it-needed-to-be process of
relocating the article.

I don’t know why I’ve never taught myself to use bookmarks
effectively. If I remember correctly, they’ve been around since the
first version of Mosaic that I used several years ago. It’s probably
largely a result of laziness, though I don’t think that’s the
whole story. I think it’s mostly driven by the way I use the web.
It’s very rare that I load up my browser with the specific intent of
visiting one page on the internet. My typical information-addicted browsing
scenario (I optimistically and euphemistcally refer to it as "checking
my email") starts with scanning the messages from the various mailing
lists I’m subscribed to. Usually one or more messages will catch my
eye. Some will contain URLs that I will follow. Some contain a subject I
want to follow up on, which leads me to a search engine. Some just get me
thinking about something that may or may not even be related.

More often than not, the initial scan of my inbox leads to the spawning of
multiple unrelated threads. For example, I might have several browser
windows dedicated to a linguistics topic, a couple loading up BusinessWeek
and Forbes, and a third set pointing to something related to Ruby
programming. And, from here, the same behaviour that got me started comes
into play. Each new page has the potential of forking off several new
threads on potentially unrelated topics. It’s a potentially infinite
recursive loop.

If I tried to bookmark all this stuff, I would spend as much time
bookmarking and organizing as I do reading the content. Interestingly, the
topic of this post, which has led me into this explanation of why I
don’t use bookmarks is itself a potential solution to the problem.

Latent Semantic Indexing (LSI) is a technique used for indexing and
relating information based on its semantic "closeness". I’m
certainly not an expert, having only read a few articles on it now, but
here’s a probably-bad explanation of how it works: For each document
in a set, it generates a vector showing the document’s inclusion or
non-inclusion of the words in a master word list. It then uses a technique
called Singular Value Decomposition (
to compress the many relationships in this "term/document grid"
into fewer relationships—basically converging some of the things that
were different into sameness. At this point, you can calculate any
vector’s closeness (as in physical closeness—using Math
I never learned in school) to another, giving you an indication of how
semantically close the two are.

For example, imagine you have a collection of documents, about computer
programming topics. As a human, you could read an article about object
oriented programming, another about UML, and another about Martin
Fowler’s book "UML Distilled". Even if the last article
didn’t specifically contain the text "Object Oriented
Programming", you would be able to make the mental connection between
Martin Fowler and object oriented programming, because you know that UML is
related to OOP and that Martin Fowler is a UML guru. With a typical,
keyword-based search engine, the last article I mentioned wouldn’t
appear in a set of search results for "object oriented
programming", because it didn’t contain the text you were
searching for. A search engine using Latent Semantic Indexing, would be
able to determine that Martin Fowler is semantically close to object
oriented programming and would still return the UML article as a match for
the search.

So what does this have to do with bookmarks? I was lucky in that one of my
multiple browsing threads on the day I came across LSI led me to Agent
Frank (
Agent Frank is a personal web proxy. You run it on your PC, and it tracks,
archives, and indexes the sites you visit. It can also do things that
I’m not as exicted about like blocking banner ads. The really
exciting thing here is that it is a step toward smart bookmarks. If Agent
Frank can track everything I look at, I don’t have to worry about
remembering which sites I’ve seen. Now, imagine coupling this
capability with LSI. A personal web proxy that archives the content you
visit and then indexes it with LSI, could remind you of related
pages you’ve seen as you browse. It could, of course, as Agent Frank
already does, include a search engine so that you could find pages you had
seen before—but without the hassle of having to remember keywords
that appeared in the pages. It could also use the semantic closeness of the
documents you view to build an index of what you are interested in. After a
browsing session, it could present you with an intelligently constructed
list of the categories of the information you have been browsing.

I really like the idea of reading a new page, thinking "This page
reminds me of something…", and clicking a browser button
labeled "Recall Similar".

I’ve been playing around with my own implementation of almost-LSI,
inspired by a nice tutorial (
by Maciej Ceglowski ( My version is, as
you might guess, in Ruby. And, it integrates with my weblog software (
As is the case with many of the Ruby projects I’ve worked on, I was
surprised to discover that shortly after I started working on it, I had a
functional piece of software that could calculate semantic sameness given a
search query or an existing document. If I can find the time to clean it up
over the next week, you might find a "What’s Related" link
for each story on my website.

Hopefully, though I’m still learning this stuff, it will be a little
less braindead than Google’s "What’s Related" (,
which returns a mix of pages that I have linked to, have linked to me, or
seem to have no logical relationship whatsoever. There are at least a
couple that I’d really not like to think of as "Similar",
as Google labels them.

I also started today on my own Agent Frank replacement, with builtin LSI.
I’ve got a stupid simple HTTP Proxy working and archiving everything
I view. If all goes well and I don’t lose focus (AttentionSpanChallenged)
I might have something basic working in the next week or so. Exciting
stuff. I’m glad I don’t do this for a living…it might not
be as fun.