2

Я пытаюсь подготовить пользовательскую модель NER для нескольких объектов. Вот данные обучающая выборка:OpenNLP: Обучение пользовательской модели NER для нескольких объектов

count all <START:item_type> operating tables <END> on the <START:location_id> third <END> <START:location_type> floor <END> 
count all <START:item_type> items <END> on the <START:location_id> third <END> <START:location_type> floor <END> 
how many <START:item_type> beds <END> are in <START:location_type> room <END> <START:location_id> 2 <END> 

Метод NameFinderME.train(.) принимает строковый параметр type. Каково использование этого параметра? И, как я могу обучить модель для нескольких объектов (например item_type, location_type, location_id в моем случае)

public static void main(String[] args) { 
    String trainingDataFile = "/home/OpenNLPTest/lib/training_data.txt"; 
    String outputModelFile = "/tmp/model.bin"; 
    String sentence = "how many beds are in the hospital"; 

    train(trainingDataFile, outputModelFile, "location_type"); 
    predict(sentence, outputModelFile); 
} 

private static void train(String trainingDataFile, String outputModelFile, String tagToFind) { 
    File inFile = new File(trainingDataFile); 
    NameSampleDataStream nss = null; 
    try { 
     nss = new NameSampleDataStream(new PlainTextByLineStream(new java.io.FileReader(inFile))); 
    } catch (Exception e) {} 

    TokenNameFinderModel model = null; 
    int iterations = 100; 
    int cutoff = 5; 
    try { 
     // Does the 'type' parameter mean the entity type that I am trying to train the model for? 
     // What if I need to train for multiple entities? 
     model = NameFinderME.train("en", tagToFind, nss, (AdaptiveFeatureGenerator) null, Collections.<String,Object>emptyMap(), iterations, cutoff); 
    } catch(Exception e) {} 

    try { 
     File outFile = new File(outputModelFile);   
     FileOutputStream outFileStream = new FileOutputStream(outFile); 
     model.serialize(outFileStream); 
    } 
    catch (Exception ex) {} 
} 

private static void predict(String sentence, String modelFile) throws Exception { 
    FileInputStream modelInToken = new FileInputStream("/tmp/en-token.bin"); 
    TokenizerModel modelToken = new TokenizerModel(modelInToken); 
    Tokenizer tokenizer = new TokenizerME(modelToken); 
    String tokens[] = tokenizer.tokenize(sentence); 

    FileInputStream modelIn = new FileInputStream(modelFile); 

    TokenNameFinderModel model = new TokenNameFinderModel(modelIn); 
    NameFinderME nameFinder = new NameFinderME(model); 
    Span nameSpans[] = nameFinder.find(tokens); 

    double[] spanProbs = nameFinder.probs(nameSpans); 

    for(int i = 0; i<nameSpans.length; i++) { 
     System.out.println(nameSpans[i]); 
    } 

}

ответ

3

type аргумент NameFinderME.train используется как тип по умолчанию для обучающих данных, что делает не включать параметр типа. Это относится только если у вас есть образец, который выглядит следующим образом:

<START> operating tables <END> 

Вместо того, как это:

<START:item_type> operating tables <END> 

Для подготовки нескольких типов сущностей, документация разработчика говорит

Учебный файл может содержать несколько типов. Если файл обучения содержит несколько типов, созданная модель также сможет обнаруживать эти несколько типов. На данный момент его рекомендуется только обучать одиночные модели , так как поддержка нескольких типов все еще экспериментальна.

Итак, вы можете попробовать тренироваться по образцу из своего вопроса, который включает в себя несколько типов и посмотреть, как хорошо он работает. В this mailing list message, кто-то просит о статусе подготовки различных типов и получает этот ответ:

Самого путь кода является стабильным, поэтому мы его туда то, что он не имеет хорошие показатели по Английские данные.

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

Если вы не получаете хорошую производительность с моделью, которая обрабатывает несколько типов, альтернативой было бы создание нескольких копий ваших данных обучения, где каждая копия была изменена, чтобы включать только один тип. Затем вы должны подготовить отдельную модель для каждого набора данных обучения. В этот момент у вас должна быть (например) модель item_type, модель location_type и модель location_id. Затем вы можете запустить свой вход через каждую модель, чтобы обнаружить разные типы.

Смежные вопросы