work in progress: loops.classifier: interfaces, basic utility and adapter classes
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1794 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
331e1894b1
commit
20b2bf4e5d
6 changed files with 135 additions and 12 deletions
|
@ -27,7 +27,7 @@ configuration):
|
||||||
>>> concepts, resources, views = t.setup()
|
>>> concepts, resources, views = t.setup()
|
||||||
|
|
||||||
>>> len(concepts) + len(resources)
|
>>> len(concepts) + len(resources)
|
||||||
16
|
18
|
||||||
|
|
||||||
|
|
||||||
Fin de partie
|
Fin de partie
|
||||||
|
|
|
@ -29,7 +29,8 @@ from zope.event import notify
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
from zope.traversing.api import getName, getParent
|
from zope.traversing.api import getName, getParent
|
||||||
|
|
||||||
from loops.classifier.interfaces import IClassifier
|
from loops.classifier.interfaces import IClassifier, IExtractor, IAnalyzer
|
||||||
|
from loops.classifier.interfaces import IInformationSet, IStatement
|
||||||
from loops.common import AdapterBase, adapted
|
from loops.common import AdapterBase, adapted
|
||||||
from loops.interfaces import IResource, IConcept
|
from loops.interfaces import IResource, IConcept
|
||||||
from loops.resource import Resource
|
from loops.resource import Resource
|
||||||
|
@ -47,6 +48,45 @@ class Classifier(AdapterBase):
|
||||||
implements(IClassifier)
|
implements(IClassifier)
|
||||||
adapts(IConcept)
|
adapts(IConcept)
|
||||||
|
|
||||||
_adapterAttributes = ('context', '__parent__',)
|
|
||||||
_contextAttributes = list(IClassifier) + list(IConcept)
|
_contextAttributes = list(IClassifier) + list(IConcept)
|
||||||
|
|
||||||
|
def process(self, resource):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def assignConcept(self, statement):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Extractor(object):
|
||||||
|
|
||||||
|
implements(IExtractor)
|
||||||
|
adapts(IResource)
|
||||||
|
|
||||||
|
def __init__(self, context):
|
||||||
|
self.context = context
|
||||||
|
|
||||||
|
def extractInformationSet(self):
|
||||||
|
return InformationSet()
|
||||||
|
|
||||||
|
|
||||||
|
class Analyzer(object):
|
||||||
|
|
||||||
|
implements(IAnalyzer)
|
||||||
|
|
||||||
|
def extractStatements(self,informationSet):
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
class InformationSet(dict):
|
||||||
|
|
||||||
|
implements(IInformationSet)
|
||||||
|
|
||||||
|
|
||||||
|
class Statement(object):
|
||||||
|
|
||||||
|
implements(IStatement)
|
||||||
|
|
||||||
|
subject = None
|
||||||
|
predicate = None
|
||||||
|
object = None
|
||||||
|
relevance = 100
|
||||||
|
|
|
@ -16,4 +16,16 @@
|
||||||
set_schema="loops.classifier.interfaces.IClassifier" />
|
set_schema="loops.classifier.interfaces.IClassifier" />
|
||||||
</zope:class>
|
</zope:class>
|
||||||
|
|
||||||
|
<zope:adapter factory="loops.classifier.base.Extractor"
|
||||||
|
trusted="True" />
|
||||||
|
|
||||||
|
<zope:class class="loops.classifier.base.Extractor">
|
||||||
|
<require permission="zope.View"
|
||||||
|
interface="loops.classifier.interfaces.IExtractor" />
|
||||||
|
<require permission="zope.ManageContent"
|
||||||
|
set_schema="loops.classifier.interfaces.IExtractor" />
|
||||||
|
</zope:class>
|
||||||
|
|
||||||
|
<zope:utility factory="loops.classifier.base.Analyzer" />
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -29,13 +29,72 @@ from loops.util import _
|
||||||
|
|
||||||
|
|
||||||
class IClassifier(Interface):
|
class IClassifier(Interface):
|
||||||
"""
|
""" An object that is able to analyze a resource and identify the
|
||||||
|
concepts to assign.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
providerName = schema.TextLine(
|
analyzer = schema.TextLine(
|
||||||
title=_(u'Provider name'),
|
title=_(u'Analyzer'),
|
||||||
description=_(u'The name of a utility that provides the '
|
description=_(u'Name of a utility that is able to analyze '
|
||||||
'external objects; default is a directory '
|
'the resources assigned to this classifier.'),
|
||||||
'collection provider'),
|
default=u'',
|
||||||
required=False)
|
required=False)
|
||||||
|
|
||||||
|
options = schema.List(
|
||||||
|
title=_(u'Options'),
|
||||||
|
description=_(u'Additional settings...'),
|
||||||
|
value_type=schema.TextLine(),
|
||||||
|
default=[],
|
||||||
|
required=False)
|
||||||
|
|
||||||
|
def process(resource):
|
||||||
|
""" Do all that is needed to classify the resource given.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def assignConcept(statement):
|
||||||
|
""" Assign a concept representing the object of the statement
|
||||||
|
given to the statement's subject, using the statement's
|
||||||
|
predicate.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class IExtractor(Interface):
|
||||||
|
""" Adapter for extracting an information set from a resource.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def extractInformationSet():
|
||||||
|
""" Return an information set based on the resource given.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class IAnalyzer(Interface):
|
||||||
|
""" Utility that is able to analyze an information set and
|
||||||
|
provide a collection of statements about it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def extractStatements(informationSet):
|
||||||
|
""" Return a collection of statements derived from the
|
||||||
|
information set given.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class IInformationSet(Interface):
|
||||||
|
""" A mapping or collection of key/value pairs; the keys are usually the
|
||||||
|
names of information elements, the values may be simple strings,
|
||||||
|
structured resources (e.g. XML documents), files providing such strings
|
||||||
|
or documents, or another kind of objects. The analyzer that is
|
||||||
|
fed with this information set must know what to do with it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class IStatement(Interface):
|
||||||
|
""" Represents a subject-predicate-object triple. These attributes
|
||||||
|
may be strings denoting the real
|
||||||
|
"""
|
||||||
|
|
||||||
|
subject = Attribute('Subject of the Statement')
|
||||||
|
predicate = Attribute('Predicate of the Statement')
|
||||||
|
object = Attribute('Object of the Statement')
|
||||||
|
relevance = Attribute('A number denoting the relevance or correctness '
|
||||||
|
'of the statement')
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,8 @@ import os
|
||||||
from zope import component
|
from zope import component
|
||||||
|
|
||||||
from loops import util
|
from loops import util
|
||||||
from loops.interfaces import IFile, IExternalFile
|
from loops.classifier.base import Classifier, Extractor, Analyzer
|
||||||
|
from loops.classifier.interfaces import IClassifier, IAnalyzer
|
||||||
from loops.concept import Concept
|
from loops.concept import Concept
|
||||||
from loops.resource import Resource
|
from loops.resource import Resource
|
||||||
from loops.knowledge.setup import SetupManager as KnowledgeSetupManager
|
from loops.knowledge.setup import SetupManager as KnowledgeSetupManager
|
||||||
|
@ -28,6 +29,17 @@ class TestSite(BaseTestSite):
|
||||||
concepts, resources, views = self.baseSetup()
|
concepts, resources, views = self.baseSetup()
|
||||||
|
|
||||||
tType = concepts.getTypeConcept()
|
tType = concepts.getTypeConcept()
|
||||||
|
tClassifier = addAndConfigureObject(concepts, Concept, 'classifier',
|
||||||
|
title=u'Classifier', conceptType=tType,
|
||||||
|
typeInterface=IClassifier)
|
||||||
|
|
||||||
|
component.provideAdapter(Classifier)
|
||||||
|
fileClassifier = addAndConfigureObject(concepts, Concept,
|
||||||
|
'fileclassifier', title=u'File Classifier',
|
||||||
|
conceptType=tClassifier)
|
||||||
|
|
||||||
|
component.provideAdapter(Extractor)
|
||||||
|
component.provideUtility(Analyzer, IAnalyzer)
|
||||||
|
|
||||||
self.indexAll(concepts, resources)
|
self.indexAll(concepts, resources)
|
||||||
return concepts, resources, views
|
return concepts, resources, views
|
||||||
|
|
Loading…
Add table
Reference in a new issue