yandex / tomita-parser

Other
495 stars 113 forks source link

Error in CSentenceRusProcessor::FindMultiWords() & Error in "CSimpleProcessor::ProcessString" #138

Open 515 opened 3 years ago

515 commented 3 years ago

Если оставить только PersonName1 - все работает и выбирает фамилию. Если на выбор то пишет ошибку

Error in CSentenceRusProcessor::FindMultiWords(): FactExtract/Parser/afdocparser/rusie/commongrammarinterpretation.cpp:243: Can't get fio value for Person.Name in sentence: Касир ФИО1 отгрузил едениц товара на сумму ... Продавец Маркова Виолета Михайловна отгрузил едениц товара на сумму ... Error in "CSimpleProcessor::ProcessString": FactExtract/Parser/afdocparser/rusie/commongrammarinterpretation.cpp:243: Can't get fio value for Person.Name [01:12:20 19:09:39] - End. (Processing files.)

PersonName2 -> Word<wff=/ФИО[0-9]/>;
PersonName1 -> Word<kwtype="имя"> ( Word<wff="^.$"> );
PersonName -> PersonName2 | PersonName1;
PersonEnumItem -> PersonName interp(Person.Name);
515 commented 3 years ago

При этом в другом файлике вот так работает

fio1->Word<kwtype="имя">;
fio2->Word<wff=/ФИО[0-9]/>;
fio0->fio1 | fio2;
fio->fio0 interp(Article.Name);
victorbocharov commented 3 years ago

Про второй пример странно, т.к. у меня он тоже не работает.

Ошибка происходит при попытке сформировать поле факта с типом NFactType.TFio. Там ожидается, что сработал встроенный алгоритм ФИО, который уже разделил цепочку на поля (фамилия, имя, отчество). В случае с ФИО1 сработало обычное правило с регуляркой, которое не может создать структуру, пригодную для полей типа NFactType.TFio. Отсюда ошибка.

Если нужно, чтобы нечто разбиралось как встроенным алгоритмом ФИО, так и другими правилами, можно сделать два поля с типами string и NFactType.TFio. В первое вы сохраняете в любом случае, во второе - только из тех правил, где вы точно знаете, что сработать может только встроенный алгоритм ФИО.