コード例 #1
0
 def __init__(self):
     self._context = ParseContext()
     self._detector = DefaultDetector()
     self._parser = AutoDetectParser(self._detector)
     self._context.set(Parser, self._parser)
     self._outputstream = ByteArrayOutputStream()
     self._metadata = Metadata()
コード例 #2
0
class TextExtractorFromOdtDocPdf(object):
    """ 
    Извлекает и очищает текст из файла формата *.pdf, *.doc, *.docx, *.odt
    
    
    TODO(zaqwes): Сделать фильтры
        - в предложении только пробелы или только цифры
    """
    _outputstream = None
    _context = None
    _detector = None
    _parser = None
    _metadata = None
    _extractedText = None
    
    def __init__(self):
        self._context = ParseContext()
        self._detector = DefaultDetector()
        self._parser = AutoDetectParser(self._detector)
        self._context.set(Parser, self._parser)
        self._outputstream = ByteArrayOutputStream()
        self._metadata = Metadata()
        
    _enabled_extentons = ['doc', 'docx', 'pdf', 'odt']
        
    def process(self, input_fname, path_to_node):
        def get_fname_for_save(fname):
            fname = fname.replace('\\','/')
            only_fname = fname.split('/')[-1]
            output_fname = path_to_node+'/'+only_fname+'.ptxt'
            return output_fname
        
        def get_fname_for_save_meta(fname):
            fname = fname.replace('\\','/')
            only_fname = fname.split('/')[-1]
            output_fname = path_to_node+'/'+only_fname+'.meta'
            return output_fname
        
        
        def file_is_enabled(fname):
            extention = fname.split('.')[-1]
            if extention in self._enabled_extentons:
                return True
            return False
        
        def purge_line(one_line):
            if not is_content_letter(one_line):
                return None
            result = one_line.replace('\t','')
            return result
        """ 
        Присутствует фильта входных файлов, что упрощает обработку папок с разнородными
        файлами.
        
        TODO(zaqwes): Используется детектор языков от Tika, хотя детектирует правильно, 
            но выдает, что недостаточно. Возможно можно заменить на другую библитеку
        
        Postcond.:
            Текстовой файл с полностью снятым форматированием. Язык не определен.
            
        Trouble:
            - Если программа содержит код
        """

        print 'Processing file : ', input_fname
        if not file_is_enabled(input_fname):
            return None, (1, 'File must *.doc, *.docx, *.pdf, *.odt. File skipped.')
        
        
        input_var = None
        
        output_fname = get_fname_for_save(input_fname)  # Файл временный, он же выходной
        print output_fname
        out_file = File(output_fname)  # Врядли выкенет исключение
        ofile_stream = FileOutputStream(out_file)
        lang = None
        try:
            # TODO(zaqwes): не очень понятно, что здесь происходит
            url = URL
            file_obj = File(input_fname);
            if file_obj.isFile():
                url = file_obj.toURI().toURL();
            else:
                url = URL(input_fname);
            # TODO(zaqwes): не очень понятно, что здесь происходит
              
            # Начинаем обработку
            metadata = {'url':input_fname}
            
            result_utf8 = []#['metadata','']  # формат строгий!!
              
            # На данный момент сохраняем в промежуточный файл на диске, но можно и ускорить
            # например, через отображение на память
            input_var = TikaInputStream.get(url, self._metadata);
            handler = BodyContentHandler(ofile_stream)
            self._parser.parse(input_var, handler, self._metadata, self._context);
            
            if ofile_stream:
                ofile_stream.close()
                
            return 'TEST', (1, 'TEST')
            # Преобразуем в unicode
            java_in = BufferedReader(FileReader(output_fname))
            writer = ProfilingWriter();
            while True:
                s = String()
                s = java_in.readLine()
                print s
                if s == None:
                    break
                
                # Строку нужно подчистить
                one_line = unicode(str(s), 'utf-8')
                one_line = purge_line(one_line)
                if one_line:
                    result_utf8.append(one_line)
                    writer.append(one_line);
                
            identifier = writer.getLanguage();
            lang = identifier.getLanguage()
            metadata['lang'] = lang
            #print identifier.isReasonablyCertain()  # Всегда False
            #System.out.println(identifier.getLanguage());
            
            meta_fname = get_fname_for_save_meta(input_fname)
            # Сохраняем результат 
            dal.write_result_file(result_utf8, output_fname)
            dal.write_result_file([json.dumps(metadata, sort_keys=True, indent=2)], meta_fname)
        
        except IOException as e:
            err_code = 1
            err_msg = 'Error: io.'
            e.printStackTrace()
            return output_fname, err_code, err_msg
        except TikaException as e:
            # Отключит обработку? Нет не отключит, т.к. исключение поймано
            e.printStackTrace()
        except SAXException as e:
            e.printStackTrace()
        finally:
            if input_var:
                try:
                    input_var.close()
                except IOException as e:
                    e.printStackTrace();
                    
        # Подводим итоги
        return ((output_fname, lang), (0, ''))
        
        
    # TODO(zaqwes): русский язык определить не может    
    def parse_with_lang_detection(self, filename):
        """url = URL  # Отрывок не работает
        file = File(filename);
        if file.isFile():
          url = file.toURI().toURL();
        else:
          url = URL(filename);
          
        input = TikaInputStream.get(url, self._metadata);
        handler = BodyContentHandler(self._outputstream);
        
        profiler = ProfilingHandler(self._outputstream);
        #tee = TeeContentHandler(handler, profiler);
        #tee = TeeContentHandler(handler);
        
        self._parser.parse(input, profiler, self._metadata, self._context);
        identifier = profiler.getLanguage();
        if identifier.isReasonablyCertain():
           # metadata.set(Metadata.LANGUAGE, 
            print identifier.getLanguage()#);
            """
            
        pass
        
        # Детектирует неправильно
        profile = LanguageProfile(
            "несложно догадаться, реально угнетающих  ");
        identifier = LanguageIdentifier(profile);
        System.out.println(identifier.getLanguage());
        
        writer = ProfilingWriter();
        writer.append("несложно догадаться, реально угнетающих ситуаций встречается ");
        writer.append("несложно встречается ");
        writer.append("несложно догадаться,  ");
        writer.append("несложно догадаться, реально угнетающих ситуаций встречается ");
        identifier = writer.getLanguage();
        System.out.println(identifier.getLanguage());

        
    def print_string(self):
        extractedText = self._outputstream.toString();
        print extractedText