Как программно удалить Lookup из DefaultGazetteer

Мне нужно научить Gazetteer, добавляя/удаляя слова.

Я знаю как добавить новый поиск, но когда я пытался его удалить, Lookup не удалился.

gazetter.remove("string to be found"); // returns false

Любая помощь, пожалуйста!


person Valijon    schedule 02.06.2015    source источник


Ответы (2)


Внутри справочника (по умолчанию) есть две отдельные вещи:

  1. Конечный автомат, используемый для поиска исходного текста.

  2. Линейное определение географического справочника, в котором представлены все списки слов в словаре. Он не используется непосредственно для поиска текста.

При запуске они используются следующим образом:

  1. Линейное определение считывается из входных файлов.
  2. Конечный автомат построен из определения.

Такие методы, как gazetter.add() или gazetter.remove(), вызываемые непосредственно в экземпляре географического справочника, изменяют только конечный автомат. Изменения будут видны в поведении географического справочника, но не в его линейном определении.

Методы из линейного определения изменяют только линейное определение. Вы должны использовать store() и reInit() для обновления конечного автомата внутри географического справочника в соответствии с линейным определением. После этого они будут синхронизированы, и справочник будет искать новые фразы. Это также означает, что изменения, сделанные только на машине состояний, будут потеряны после повторной инициализации.

Чтобы ответить на ваш вопрос:

Если ваш код вернул false, то фраза не присутствовала в конечном автомате, и географический справочник все равно не нашел бы такую ​​фразу в тексте.

Если вы хотите удалить фразу из линейного определения, вы должны использовать соответствующие методы (кратко описанные в моем предыдущем ответе).

person dedek    schedule 03.06.2015

Вероятно, вы могли бы использовать подход, описанный в ответе на ваш предыдущий вопрос Вопрос о географическом справочнике update, но с удалением узлов. Угадайте, что дополнительную информацию вы можете найти в javadoc.

Другой вариант (грубая сила и обновление с редкими ключевыми словами): а) удалить Gazetteer из вашего конвейера (и из области действия с помощью Factory.deleteResource) б) прочитать файл .lst как файл с простым текстом в строке в) удалить записи г) сохранить данные обратно в предыдущий файл e) повторно запустите географический справочник и добавьте новый PR в то же место в вашем конвейере.

Я думаю, что первый вариант больше подходит для обновления справочника.

person ashingel    schedule 03.06.2015
comment
Спасибо. Удалите узел или переустановите справочник, это очень дорого для онлайн-модификации. Временное решение: хранить исключенные коды в карте и после кодификации исключать их вручную. - person Valijon; 03.06.2015
comment
Если географический справочник большой, вы можете создать механизм, который будет запускать географический справочник одновременно с основным потоком приложения. Затем замените его в конвейере. Для обновления ресурсов GATE можно использовать несколько вариантов. - person ashingel; 04.06.2015