Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 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
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)