[Checkins] SVN: lovely.tag/trunk/src/lovely/tag/ Added
getRelatedItems and getRelatedUsers to the tagging engine.
Jürgen Kartnaller
juergen at kartnaller.at
Sat Mar 3 09:47:08 EST 2007
Log message for revision 72966:
Added getRelatedItems and getRelatedUsers to the tagging engine.
Changed:
U lovely.tag/trunk/src/lovely/tag/README.txt
U lovely.tag/trunk/src/lovely/tag/engine.py
U lovely.tag/trunk/src/lovely/tag/interfaces.py
-=-
Modified: lovely.tag/trunk/src/lovely/tag/README.txt
===================================================================
--- lovely.tag/trunk/src/lovely/tag/README.txt 2007-03-03 13:41:26 UTC (rev 72965)
+++ lovely.tag/trunk/src/lovely/tag/README.txt 2007-03-03 14:47:07 UTC (rev 72966)
@@ -451,6 +451,45 @@
[u'Austria', u'USA', u'dornbirn', u'lovely', u'personal',
u'vacation', u'work']
+
+Related Items
+-------------
+
+Another advanced feature is to provide related items.
+
+We set up a new engine for this test. Items are related if they have at least
+one tag in common.
+
+ >>> relatedEngine = tag.TaggingEngine()
+ >>> relatedEngine.update(1, u'srichter', [u'USA', u'personal', u'zope'])
+ >>> relatedEngine.update(2, u'srichter', [u'austria', u'lovely'])
+ >>> relatedEngine.update(3, u'jodok', [u'Austria', u'personal'])
+ >>> relatedEngine.update(2, u'jodok', [u'austria', u'lovely', u'work'])
+ >>> relatedEngine.update(4, u'jukart', [u'austria', u'Austria', u'lovely', u'work'])
+ >>> relatedEngine.update(5, u'jim', [u'USA', u'zope'])
+
+We get tuples with the related item and the number of tags in common.
+
+ >>> relatedEngine.getRelatedItems(1)
+ [(5, 2), (3, 1)]
+ >>> relatedEngine.getRelatedItems(5)
+ [(1, 2)]
+ >>> relatedEngine.getRelatedItems(2)
+ [(4, 3)]
+
+
+Related Users
+-------------
+
+We can also get related users. Users are related if they have at least one tag
+in common.
+
+ >>> relatedEngine.getRelatedUsers(u'jim')
+ [(u'srichter', 2)]
+ >>> relatedEngine.getRelatedUsers(u'jodok')
+ [(u'jukart', 4), (u'srichter', 3)]
+
+
Frequency Of Tags
-----------------
Modified: lovely.tag/trunk/src/lovely/tag/engine.py
===================================================================
--- lovely.tag/trunk/src/lovely/tag/engine.py 2007-03-03 13:41:26 UTC (rev 72965)
+++ lovely.tag/trunk/src/lovely/tag/engine.py 2007-03-03 14:47:07 UTC (rev 72966)
@@ -33,7 +33,7 @@
class TaggingEngine(persistent.Persistent, contained.Contained):
zope.interface.implements(interfaces.ITaggingEngine,
interfaces.ITaggingStatistics)
-
+
def __init__(self):
super(TaggingEngine, self).__init__()
self._reset()
@@ -109,15 +109,15 @@
id = self._tag_ids.getId(tagObj)
self._tag_ids.unregister(tagObj)
self._tags.remove(tagObj)
-
+
self._user_to_tagids[tagObj.user].remove(id)
if not len(self._user_to_tagids[tagObj.user]):
del self._user_to_tagids[tagObj.user]
-
+
self._item_to_tagids[tagObj.item].remove(id)
if not len(self._item_to_tagids[tagObj.item]):
del self._item_to_tagids[tagObj.item]
-
+
self._name_to_tagids[tagObj.name].remove(id)
if not len(self._name_to_tagids[tagObj.name]):
del self._name_to_tagids[tagObj.name]
@@ -141,7 +141,6 @@
# make objects
tags = map(self._tag_ids.getObject, tags)
self._delTags(tags)
-
def getTags(self, items=None, users=None):
"""See interfaces.ITaggingEngine"""
@@ -158,17 +157,17 @@
users_result = set()
for v in self._item_to_tagids.values():
users_result.update(v)
-
+
if items is not None:
items_result = set()
for item in items:
items_result.update(self._item_to_tagids.get(item, set()))
-
+
if users is not None:
users_result = set()
for user in users:
users_result.update(self._user_to_tagids.get(user, set()))
-
+
if items is None:
result = users_result
elif users is None:
@@ -177,7 +176,6 @@
result = items_result.intersection(users_result)
return set([self._tag_ids.getObject(id) for id in result])
-
def getItems(self, tags=None, users=None):
"""See interfaces.ITaggingEngine"""
if tags is None and users is None:
@@ -256,6 +254,28 @@
result.remove(tag)
return result
+ def getRelatedItems(self, item):
+ tags = self.getTags([item])
+ items = self.getItems(tags)
+ if item in items:
+ items.remove(item)
+ result = []
+ for otherItem in items:
+ otherTags = self.getTags([otherItem])
+ result.append((otherItem, len(tags.intersection(otherTags))))
+ return sorted(result, key=lambda i: i[1], reverse=True)
+
+ def getRelatedUsers(self, user):
+ tags = self.getTags(users=[user])
+ users = self.getUsers(tags)
+ if user in users:
+ users.remove(user)
+ result = []
+ for otherUser in users:
+ otherTags = self.getTags(users=[otherUser])
+ result.append((otherUser, len(tags.intersection(otherTags))))
+ return sorted(result, key=lambda i: i[1], reverse=True)
+
def getCloud(self, items=None, users=None):
"""See interfaces.ITaggingEngine"""
if type(items) == types.IntType:
Modified: lovely.tag/trunk/src/lovely/tag/interfaces.py
===================================================================
--- lovely.tag/trunk/src/lovely/tag/interfaces.py 2007-03-03 13:41:26 UTC (rev 72965)
+++ lovely.tag/trunk/src/lovely/tag/interfaces.py 2007-03-03 14:47:07 UTC (rev 72966)
@@ -60,7 +60,7 @@
This method always overwrites the old tag settings. However, existing
tags will not be readded and are just skipped.
"""
-
+
def getTags(items=None, users=None):
"""Get all tags matching the specified items and users.
@@ -72,7 +72,6 @@
def getTagObjects(self, items, users):
"""same as getTags but returns tag objects implementing
ITag"""
-
def getCloud(items=None, users=None):
"""Get a set of tuples in the form of ('tag',
@@ -97,6 +96,24 @@
def getRelatedTags(tag, degree=1):
"""Get a set of all related tags."""
+ def getRelatedItems(item):
+ """Get a list of items related to item
+
+ Items are related if they have a least one tag in common with `item`.
+ The result contains a list of tuples in the form (item, numTags).
+ numTags is the number of tags in common. The result is reverse sorted
+ by the number of tags in common.
+ """
+
+ def getRelatedUsers(user):
+ """Get a list of users related a user
+
+ Users are related if they have a least one tag in common with `user`.
+ The result contains a list of tuples in the form (user, numTags).
+ numTags is the number of tags in common. The result is reverse sorted
+ by the number of tags in common.
+ """
+
def getFrequency(tags):
"""Get the frequency of all tags
@@ -107,7 +124,7 @@
"""clean out stale items which have no associated object.
A list of the cleaned out uids is returned"""
-
+
def delete(item=None, user=None, tag=None):
"""Globall delete all tag entries filtered by the given
@@ -127,8 +144,8 @@
The function provided should return a new name for an existing
name."""
-
-
+
+
class ITaggingStatistics(zope.interface.Interface):
"""A tagging engine that provides statistical information about itself"""
More information about the Checkins
mailing list