Diff for /cdli/cdliSplitter.py between versions 1.1 and 1.7.2.1

version 1.1, 2006/11/14 17:02:59 version 1.7.2.1, 2007/10/06 13:44:46
Line 2 Line 2
 Author splitter  Author splitter
 """  """
   
   import Zope2
   import transaction
   
 from Products.ZCTextIndex.ISplitter import ISplitter  from Products.ZCTextIndex.ISplitter import ISplitter
 from Products.ZCTextIndex.PipelineFactory import element_factory  from Products.ZCTextIndex.PipelineFactory import element_factory
   
 import re  import re
 from types import StringType  from types import StringType
   import logging
   try:
       import PyLucene
   except:
       print "no Lucene support"
   
 def getSupportedEncoding(encodings):  def getSupportedEncoding(encodings):
     for encoding in encodings:      for encoding in encodings:
Line 22  def getSupportedEncoding(encodings): Line 30  def getSupportedEncoding(encodings):
 """beta of a fulltext splitter for cdli  """beta of a fulltext splitter for cdli
   
 """  """
 ignoreLines=['$','@','#','&']  ignoreLines=['$','@','#','&','>']
 separators=['']  separators=['']
 delete="{|}|<|>|\(|\)|-|_|\#|,|\~|\||\]|\["  komma_exception="([^sStThH])," # komma relevant for graphemes will not be deleted
   deleteGraphems="\{|\}|<|>|\(|\)|-|_|\#|,|\||\]|\[|\!|\?" # for graphems
 class graphemeSplitter:  deleteWords="<|>|\(|\)|_|\#|,|\||\]|\[|\!|\?"# for words
   
   class IndexLine(object):
       """index a line with lucene"""
   
       def __init__(self, storeDir, analyzer,name,line,content):
           logging.error("i am here %s %s %s %s %s"%((storeDir, analyzer,name,line,content)))
           if not os.path.exists(storeDir):
               os.mkdir(storeDir)
           store = PyLucene.FSDirectory.getDirectory(storeDir, True)
           writer = PyLucene.IndexWriter(store, analyzer, True)
           writer.setMaxFieldLength(1048576)
           self.indexDocs(writer,name,line,content)  
           writer.optimize()
           writer.close()
         
       def indexDocs(self, writer,name,line,content):
          
           doc = PyLucene.Document()
           doc.add(PyLucene.Field("name", pn,
                                  PyLucene.Field.Store.YES,
                                  PyLucene.Field.Index.UN_TOKENIZED))
         
           doc.add(PyLucene.Field("line", str(i),
                                  PyLucene.Field.Store.YES,
                                  PyLucene.Field.Index.UN_TOKENIZED))
         
                   
           doc.add(PyLucene.Field("contents", line,
                                  PyLucene.Field.Store.YES,
                                  PyLucene.Field.Index.TOKENIZED))
           
           writer.addDocument(doc)
              
   class cdliSplitter:
       """basis class for splitter, 
       der Unterschied zwischen Word und Graphemesplitter 
       ist lediglich die unterschiedliche Auschliengsliste"""
   
     default_encoding = "utf-8"      default_encoding = "utf-8"
       delete=deleteGraphems
       indexName="cdliSplitter"
       
   
     def process(self, lst):      def process(self, lst):
           logging.debug("cdliSplitter") 
         result = []          result = []
           pNum=None
           lineNum=None
                 
         for t in lst:          for t in lst:
   
Line 41  class graphemeSplitter: Line 92  class graphemeSplitter:
             if type(s) is StringType: # not unicode              if type(s) is StringType: # not unicode
                 s = unicode(s, self.default_encoding, 'replace')                  s = unicode(s, self.default_encoding, 'replace')
                           
             #ignore lines              if (s!="") and (s[0]=="&"): # store pNum
                               pNum=s[1:8]
             if (s!="") and (not (s[0] in ignoreLines)):                  logging.debug("cdliSplitter processing: %s"%pNum)
                               
                 #ignore everthing bevor "."              elif (s!="") and (not (s[0] in ignoreLines)):
                 splitted=s.split(".")                  splitted=s.split(".")
                                   
                 if len(splitted)==1: #kein punkt                  if len(splitted)==1: #kein punkt
                     txt=splitted[0]                      txt=splitted[0]
                 else:                  else:
                     txt=splitted[1]                      txt=splitted[1]
                       lineNum=splitted[0] #store line number
                                   
                 analyse=txt                  analyse=txt
                   analyse=re.sub(komma_exception,r"\1",analyse) # delete kommata except kommata relevant in graphems
                   analyse=re.sub(self.delete,' ',analyse) # deletions
           
                 analyse=re.sub(delete,' ',analyse) # deletions                  if self.indexName=="luceneSplitter":
                       if pNum:
                           analyser=PyLucene.StandardAnalyzer()
                           logging.error("calling lucene")
                                   
                           IndexLine("/tmp/index",analyser,pNum,lineNum,analyse)
                   else:
                 splitted = analyse.split(" ")                  splitted = analyse.split(" ")
                  
                 for w in splitted:                  for w in splitted:
                     w=w.lstrip().rstrip()                      w=w.lstrip().rstrip()
       
                     if not (w==''):                      if not (w==''):
                         print repr(w)                              #if pNum: #only whe pnum is found (first call of the splitter, is always called twice in the pipeline
                         result.append(w.lstrip().rstrip())                              #    Zope2.app().cdliRoot.storeInLineIndex(self.indexName,w.lstrip().strip(),(pNum,lineNum))
                               #    transaction.get().commit()
       
                               result.append(w)
         return result          return result
   
   
   class graphemeSplitter(cdliSplitter):
       delete=deleteGraphems
       indexName="graphemeSplitter"
       
   class wordSplitter(cdliSplitter):
       delete=deleteWords
       indexName="wordSplitter"
   
   class luceneSplitter(cdliSplitter):
       delete=deleteWords
       indexName="luceneSplitter"
       
         
   try:
 element_factory.registerFactory('Word Splitter',  element_factory.registerFactory('Word Splitter',
           'CDLI grapheme splitter', graphemeSplitter)            'CDLI grapheme splitter', graphemeSplitter)
   except:
       # in case the splitter is already registered, ValueError is raised
       pass
     
 try:  try:
     element_factory.registerFactory('graphemeSplitter',      element_factory.registerFactory('Word Splitter',
           'CDLI grapheme splitter', graphemeSplitter)            'CDLI word splitter', wordSplitter)
 except:  except:
     # in case the splitter is already registered, ValueError is raised      # in case the splitter is already registered, ValueError is raised
     pass      pass
   
   try:
       element_factory.registerFactory('Word Splitter',
             'CDLI lucene splitter', luceneSplitter)
   except:
       # in case the splitter is already registered, ValueError is raised
       pass
 if __name__ == '__main__':  if __name__ == '__main__':
    a = 'abc def我们的很 好。'     a = 'abc def我们的很 好。'
    u = unicode(a, 'gbk')     u = unicode(a, 'gbk')

Removed from v.1.1  
changed lines
  Added in v.1.7.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>