def __createRes(self, kit: 'AnalysisKit', ar: 'AnalysisResult', ext_ontology: 'ExtOntology', no_log: bool) -> None: sw = Stopwatch() onto_attached = 0 for k in range(2): for c in self.analyzers: if (k == 0): if (not c.is_specific): continue elif (c.is_specific): continue dat = kit.getAnalyzerData(c) if (dat is not None and len(dat.referents) > 0): if (ext_ontology is not None): for r in dat.referents: if (r.ontology_items is None): r.ontology_items = ext_ontology.attachReferent( r) if ((r.ontology_items) is not None): onto_attached += 1 ar.entities.extend(dat.referents) sw.stop() if (ext_ontology is not None and not no_log): msg = "Привязано {0} объектов к внешней отнологии ({1} элементов) за {2}".format( onto_attached, len(ext_ontology.items), Processor.__outSecs(sw.elapsedMilliseconds)) self.__onMessage(msg) ar.log0_.append(msg)
def main(args: typing.List[str]) -> None: sw = Stopwatch() # инициализация - необходимо проводить один раз до обработки текстов print("Initializing ... ", end="", flush=True) # инициализируются движок и все имеющиеся анализаторы Sdk.initialize((MorphLang.RU) | MorphLang.EN) sw.stop() print("OK (by {0} ms), version {1}".format( sw.elapsedMilliseconds, ProcessorService.getVersion()), flush=True) # анализируемый текст txt = "Единственным конкурентом «Трансмаша» на этом сомнительном тендере было ООО «Плассер Алека Рейл Сервис», основным владельцем которого является австрийская компания «СТЦ-Холдинг ГМБХ». До конца 2011 г. эта же фирма была совладельцем «Трансмаша» вместе с «Тако» Краснова. Зато совладельцем «Плассера», также до конца 2011 г., был тот самый Карл Контрус, который имеет четверть акций «Трансмаша». " print("Text: {0}".format(txt), flush=True) # запускаем обработку на пустом процессоре (без анализаторов NER) are = ProcessorService.getEmptyProcessor().process( SourceOfAnalysis(txt), None, None) print("Noun groups: ", end="", flush=True) t = are.first_token # перебираем токены first_pass2703 = True while True: if first_pass2703: first_pass2703 = False else: t = t.next0_ if (not (t is not None)): break # выделяем именную группу с текущего токена npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) # не получилось if (npt is None): continue # получилось, выводим в нормализованном виде print("[{0}=>{1}] ".format( npt.getSourceText(), npt.getNormalCaseText(None, True, MorphGender.UNDEFINED, False)), end="", flush=True) # указатель на последний токен именной группы t = npt.end_token with ProcessorService.createProcessor() as proc: # анализируем текст ar = proc.process(SourceOfAnalysis(txt), None, None) # результирующие сущности print( "\r\n==========================================\r\nEntities: ", flush=True) for e0_ in ar.entities: print("{0}: {1}".format(e0_.type_name, str(e0_)), flush=True) for s in e0_.slots: print(" {0}: {1}".format(s.type_name, s.value), flush=True) # пример выделения именных групп print( "\r\n==========================================\r\nNoun groups: ", flush=True) t = ar.first_token first_pass2704 = True while True: if first_pass2704: first_pass2704 = False else: t = t.next0_ if (not (t is not None)): break # токены с сущностями игнорируем if (t.getReferent() is not None): continue # пробуем создать именную группу npt = NounPhraseHelper.tryParse( t, NounPhraseParseAttr.ADJECTIVECANBELAST, 0) # не получилось if (npt is None): continue print(npt, flush=True) # указатель перемещаем на последний токен группы t = npt.end_token with ProcessorService.createSpecificProcessor( KeywordAnalyzer.ANALYZER_NAME) as proc: ar = proc.process(SourceOfAnalysis(txt), None, None) print( "\r\n==========================================\r\nKeywords1: ", flush=True) for e0_ in ar.entities: if (isinstance(e0_, KeywordReferent)): print(e0_, flush=True) print( "\r\n==========================================\r\nKeywords2: ", flush=True) t = ar.first_token first_pass2705 = True while True: if first_pass2705: first_pass2705 = False else: t = t.next0_ if (not (t is not None)): break if (isinstance(t, ReferentToken)): kw = Utils.asObjectOrNull(t.getReferent(), KeywordReferent) if (kw is None): continue kwstr = MiscHelper.getTextValueOfMetaToken( Utils.asObjectOrNull(t, ReferentToken), Utils.valToEnum( (GetTextAttr.FIRSTNOUNGROUPTONOMINATIVESINGLE) | (GetTextAttr.KEEPREGISTER), GetTextAttr)) print("{0} = {1}".format(kwstr, kw), flush=True) print("Over!", flush=True)
def _process(self, text: 'SourceOfAnalysis', no_entities_regine: bool, no_log: bool, ext_ontology: 'ExtOntology' = None, lang: 'MorphLang' = None) -> 'AnalysisResult': self.__m_breaked = False self.__prepareProgress() sw0 = Stopwatch() self.manageReferentLinks() if (not no_log): self._onProgressHandler( self, ProgressEventArgs(0, "Морфологический анализ")) kit = AnalysisKit._new2669( text, False, lang, self.__progress_changed_event_handler_on_progress_handler, ext_ontology, self) ar = AnalysisResult() sw0.stop() self._onProgressHandler( self, ProgressEventArgs(100, "Морфологический анализ завершён")) k = 0 t = kit.first_token while t is not None: k += 1 t = t.next0_ if (not no_log): msg = "Из {0} символов текста выделено {1} термов за {2} ms".format( len(text.text), k, sw0.elapsedMilliseconds) if (not kit.base_language.is_undefined): msg += ", базовый язык {0}".format(str(kit.base_language)) self.__onMessage(msg) ar.log0_.append(msg) if (text.crlf_corrected_count > 0): ar.log0_.append( "{0} переходов на новую строку заменены на пробел".format( text.crlf_corrected_count)) if (kit.first_token is None): ar.log0_.append("Пустой текст") sw0.start() if (kit.first_token is not None): self.__process2(kit, ar, no_log) if (not no_entities_regine): self.__createRes(kit, ar, ext_ontology, no_log) sw0.stop() if (not no_log): if (sw0.elapsedMilliseconds > (5000)): f = len(text.text) f /= (sw0.elapsedMilliseconds) msg = "Обработка {0} знаков выполнена за {1} ({2} Kb/sec)".format( len(text.text), Processor.__outSecs(sw0.elapsedMilliseconds), f) else: msg = "Обработка {0} знаков выполнена за {1}".format( len(text.text), Processor.__outSecs(sw0.elapsedMilliseconds)) self.__onMessage(msg) ar.log0_.append(msg) if (self.timeout_seconds > 0): if (int( (datetime.datetime.now() - kit._start_date).total_seconds()) > self.timeout_seconds): ar.is_timeout_breaked = True ar.sofas.append(text) if (not no_entities_regine): ar.entities.extend(kit.entities) ar.first_token = kit.first_token ar.ontology = ext_ontology ar.base_language = kit.base_language return ar
def __process2(self, kit: 'AnalysisKit', ar: 'AnalysisResult', no_log: bool) -> None: sw = Stopwatch() stop_by_timeout = False anals = list(self.__m_analyzers) ii = 0 first_pass3164 = True while True: if first_pass3164: first_pass3164 = False else: ii += 1 if (not (ii < len(anals))): break c = anals[ii] if (c.ignore_this_analyzer): continue if (self.__m_breaked): if (not no_log): msg = "Процесс прерван пользователем" self.__onMessage(msg) ar.log0_.append(msg) break if (self.timeout_seconds > 0 and not stop_by_timeout): if (int( (datetime.datetime.now() - kit._start_date).total_seconds()) > self.timeout_seconds): self.__m_breaked = True if (not no_log): msg = "Процесс прерван по таймауту" self.__onMessage(msg) ar.log0_.append(msg) stop_by_timeout = True if (stop_by_timeout): if (c.name == "INSTRUMENT"): pass else: continue if (not no_log): self._onProgressHandler( c, ProgressEventArgs(0, "Работа \"{0}\"".format(c.caption))) sw.reset() sw.start() c.process(kit) sw.stop() dat = kit.getAnalyzerData(c) if (not no_log): msg = "Анализатор \"{0}\" выделил {1} объект(ов) за {2}".format( c.caption, (0 if dat is None else len(dat.referents)), Processor.__outSecs(sw.elapsedMilliseconds)) self.__onMessage(msg) ar.log0_.append(msg) if (not no_log): self._onProgressHandler( None, ProgressEventArgs(0, "Пересчёт отношений обобщения")) try: sw.reset() sw.start() GeneralRelationHelper.refreshGenerals(self, kit) sw.stop() if (not no_log): msg = "Отношение обобщение пересчитано за {0}".format( Processor.__outSecs(sw.elapsedMilliseconds)) self.__onMessage(msg) ar.log0_.append(msg) except Exception as ex: if (not no_log): ex = Utils.newException("Ошибка пересчёта отношения обобщения", ex) self.__onMessage(ex) ar._addException(ex)
def main(args: typing.List[str]) -> None: sw = Stopwatch() # инициализация - необходимо проводить один раз до обработки текстов print("Initializing SDK Pullenti ver {0} ({1}) ... ".format( Sdk.get_version(), Sdk.get_version_date()), end="", flush=True) # инициализируются движок и все имеющиеся анализаторы Sdk.initialize_all() sw.stop() print("OK (by {0} ms), version {1}".format( sw.elapsedMilliseconds, ProcessorService.get_version()), flush=True) # посмотрим, какие анализаторы доступны for a in ProcessorService.get_analyzers(): print(" {0} {1} \"{2}\"".format( ("Specific analyzer" if a.is_specific else "Common analyzer"), a.name, a.caption), flush=True) # анализируемый текст txt = "Система разрабатывается с 2011 года российским программистом Михаилом Жуковым, проживающим в Москве на Красной площади в доме номер один на втором этаже. Конкурентов у него много: Abbyy, Yandex, ООО \"Russian Context Optimizer\" (RCO) и другие компании. Он планирует продать SDK за 1.120.000.001,99 (миллиард сто двадцать миллионов один рубль 99 копеек) рублей, без НДС." print("Text: {0}".format(txt), flush=True) # запускаем обработку на пустом процессоре (без анализаторов NER) are = ProcessorService.get_empty_processor().process( SourceOfAnalysis(txt), None, None) print("Noun groups: ", end="", flush=True) t = are.first_token # перебираем токены first_pass2974 = True while True: if first_pass2974: first_pass2974 = False else: t = t.next0_ if (not (t is not None)): break # выделяем именную группу с текущего токена npt = NounPhraseHelper.try_parse(t, NounPhraseParseAttr.NO, 0, None) # не получилось if (npt is None): continue # получилось, выводим в нормализованном виде print("[{0}=>{1}] ".format( npt.get_source_text(), npt.get_normal_case_text(None, MorphNumber.SINGULAR, MorphGender.UNDEFINED, False)), end="", flush=True) # указатель на последний токен именной группы t = npt.end_token with ProcessorService.create_processor() as proc: # анализируем текст ar = proc.process(SourceOfAnalysis(txt), None, None) # результирующие сущности print( "\r\n==========================================\r\nEntities: ", flush=True) for e0_ in ar.entities: print("{0}: {1}".format(e0_.type_name, str(e0_)), flush=True) for s in e0_.slots: print(" {0}: {1}".format(s.type_name, s.value), flush=True) # пример выделения именных групп print( "\r\n==========================================\r\nNoun groups: ", flush=True) t = ar.first_token first_pass2975 = True while True: if first_pass2975: first_pass2975 = False else: t = t.next0_ if (not (t is not None)): break # токены с сущностями игнорируем if (t.get_referent() is not None): continue # пробуем создать именную группу npt = NounPhraseHelper.try_parse( t, NounPhraseParseAttr.ADJECTIVECANBELAST, 0, None) # не получилось if (npt is None): continue print(npt, flush=True) # указатель перемещаем на последний токен группы t = npt.end_token with ProcessorService.create_specific_processor( KeywordAnalyzer.ANALYZER_NAME) as proc: ar = proc.process(SourceOfAnalysis(txt), None, None) print( "\r\n==========================================\r\nKeywords1: ", flush=True) for e0_ in ar.entities: if (isinstance(e0_, KeywordReferent)): print(e0_, flush=True) print( "\r\n==========================================\r\nKeywords2: ", flush=True) t = ar.first_token first_pass2976 = True while True: if first_pass2976: first_pass2976 = False else: t = t.next0_ if (not (t is not None)): break if (isinstance(t, ReferentToken)): kw = Utils.asObjectOrNull(t.get_referent(), KeywordReferent) if (kw is None): continue kwstr = MiscHelper.get_text_value_of_meta_token( Utils.asObjectOrNull(t, ReferentToken), Utils.valToEnum( (GetTextAttr.FIRSTNOUNGROUPTONOMINATIVESINGLE) | (GetTextAttr.KEEPREGISTER), GetTextAttr)) print("{0} = {1}".format(kwstr, kw), flush=True) print("Over!", flush=True)