Я сериализовал модель CRF с использованием CRFClassifier на основе пользовательского набора данных. Я могу получить доступ к модели, используя приведенный ниже код.
CRFClassifier<CoreLabel> crfClassifier = CRFClassifier.getClassifierNoExceptions("crf_ner_model.ser.gz");
У меня также есть набор сопоставлений регулярных выражений (Java Регулярные выражения и соответствующие метки ), с помощью которых я создаю экземпляр из RegexNERSequenceClassifier
RegexNERSequenceClassifier regexNERSequenceClassifier = new RegexNERSequenceClassifier(mappingPath, true, true, null);
Я могу по отдельности вызвать classify()
для обоих этих классификаторов, и они успешно аннотируют набор тестовых данных. Пример:
List<CoreLabel> testData = new ArrayList<CoreLabel>();
// assume testData is initialized with values.
List<CoreLabel> crfOutput = crfClassifier.classify(testData);
List<CoreLabel> regexOutput = regexNERSequenceClassifier.classify(testData);
Пример вывода с использованием приведенного выше кода:
Входные данные испытаний : деревянная кровать 72 x 60
crfOutput : 72" (label: O)
, x (label: O)
, 60" (label: O)
, wooden (label: material)
, bed (label: category)
(label: O)
- символ фона
regexOutput : 72" (label: UNIT_OF_LENGTH)
, x
, 60" (label: UNIT_OF_LENGTH)
, wooden
, bed
Однако, когда я пытаюсь объединить их, так что тестовый документ сначала классифицируется по CRF, а затем по RegexNER, он не работает ( RegexNER ничего не помечает, даже если есть токены, соответствующие регулярному выражению, видны только теги CRF ). Пример:
List<CoreLabel> crfOutput = crfClassifier.classify(testData);
// send crfOutput as input to RegexNER
List<CoreLabel> regexOutput = regexNERSequenceClassifier.classify(crfOutput);
Как объединить два классификатора. Я попытался использовать NERClassifierCombiner. java (как описано здесь: Stanford NER: Могу ли я использовать два классификатора одновременно в моем коде? ), но это тоже не работает.