Mises Tagging Overview
The framework used to tag pages on Mises.org is a tagging
library I developed to tag any kind of content on Mises.org. The tag library references GUID's assigned to
all objects in the Mises.org databases.
It tracks users by username or IP address as well as the date that each
tag was added. It includes spam/badword
filtering and has some simple tag rewriting to automatically correct misspelled
words and incomplete names. For a simple
tag example, see business cycle.
Update: Mises Tagging is now an open source project! See the project page for details.
The database schema gives a good indication of the
The interface is organized into self-contained user
- DocumentTags.ascx - an editable list of tags for a particular
- Tags.aspx: delete tags, delete all tags by a particular user
and search/replace tags
You might have noticed that 99% of all tags are entered by
the MisesBot. The bot is an application
that uses the meta tags collected by the MetaParser (detailed in a future post)
as well as other available metadata to add tags to document.
- Cloud Control for ASP.Net - displays a list of hyperlinks in
varying styles depending on a weight.
- Toxi - the inspiration for the tag schema
- Freetag, an Open Source Tagging / Folksonomy module for
PHP/MySQL applications - the inspiration for the business logic layer
- Community Server - Inspired the tag browser interface and provided the banned words list.
- Did you notice the TagAuthority field in the tag
schema? A future version of the MisesBot
will automatically determine the "authoritative" document for each tag.
- Automatically mark up content. If we know the authoritative document for a
tag, we can automatically link to it when that tag appears in the document text.
- Improving the "related tags" algorithm. I could use some help with this:
Here is the query to get related tags. The problem is that it currently ranks tags according to their total popularity, not their "related-ness."
SET @TagId =
(SELECT TagId FROM Tag WHERE Tag = @Tag)
SELECT TOP 30 Tag.Tag,
COUNT(TagMap.TagId) AS 'Count'
INNER JOIN Tag
ON TagMap.TagId = Tag.TagId
WHERE [TagMap].TagId <> @TagId
AND (TagMap.TagId IN
(SELECT DISTINCT TagId
WHERE (ObjectId IN
(SELECT ObjectId FROM TagMap WHERE (TagId = @TagId)))
GROUP BY TagMap.TagId,
ORDER BY 'Count' DESC