[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