Я новичок в НЛП, и я использовал инструмент Stanford NER для классификации некоторого случайного текста для извлечения специальных ключевых слов, используемых в программировании.

Проблема в том, что я не знаю, как вносить изменения в классификаторы и текстовые аннотаторы в Stanford NER для распознавания ключевых слов программирования. Например:

today Java used in different operating systems (Windows, Linux, ..)

Результаты классификации должны быть такими, как:

Java "Programming_Language"
Windows "Operating_System"
Linux "Operating_system"

Не могли бы вы помочь в настройке классификаторов StanfordNER в соответствии с моими потребностями?

1
Tech 9 Апр 2014 в 05:00

2 ответа

Лучший ответ

Я думаю, что это довольно хорошо задокументировано в разделе часто задаваемых вопросов Stanford NER http: // nlp. stanford.edu/software/crf-faq.shtml#a.

Вот шаги:

  • В вашем файле свойств измените карту, чтобы указать, как ваши обучающие данные аннотируются (или структурируются).

Map = word = 0, myfeature = 1, answer = 2

  • Через src\edu\stanford\nlp\sequences\SeqClassifierFlags.java

    Добавьте флаг о том, что вы хотите использовать свою новую функцию, назовем его useMyFeature Ниже public boolean useLabelSource = false добавьте общедоступное логическое значение useMyFeature = true;

    В том же файле в методе setProperties(Properties props, boolean printProps) после else if (key.equalsIgnoreCase("useTrainLexicon")) { ..} сообщить инструменту, включен ли для вас этот флаг

    else if (key.equalsIgnoreCase("useMyFeature")) {
          useMyFeature= Boolean.parseBoolean(val);
    }
    
  • В src/edu/stanford/nlp/ling/CoreAnnotations.java добавьте следующее раздел

    public static class myfeature implements CoreAnnotation<String> {
      public Class<String> getType() {
        return String.class;
      }
    }
    
  • В src/edu/stanford/nlp/ling/AnnotationLookup.java в public enumKeyLookup{..} внизу добавить

    MY_TAG (CoreAnnotations.myfeature.class, «myfeature»)

  • В src\edu\stanford\nlp\ie\NERFeatureFactory.java, в зависимости от "тип" особенности, добавьте

    protected Collection<String> featuresC(PaddedList<IN> cInfo, int loc)
    
    if(flags.useRahulPOSTAGS){
        featuresC.add(c.get(CoreAnnotations.myfeature.class)+"-my_tag");
    }
    

Отладка: в дополнение к этому, есть методы, которые выгружают функции в файл, используя их, чтобы увидеть, как все делается под капотом. Кроме того, я думаю, вам также придется потратить некоторое время на отладчик: P

6
John Wiseman 9 Июн 2017 в 10:08

Кажется, вы хотите обучить свою собственную модель NER.

Вот подробное руководство с полным кодом:

https://dataturks.com/blog/stanford-core-nlp-ner-training-java-example.php?s=so

Формат данных обучения

Данные обучения передаются в виде текстового файла, где каждая строка представляет собой одну пару слово-метка. Каждое слово в строке должно быть помечено в формате, подобном «word \ tLABEL», слово и название метки разделяются табуляцией '\ t'. Текстовое предложение следует разбить на слова и добавить по одной строке для каждого слова в обучающем файле. Чтобы отметить начало следующей строки, мы добавляем пустую строку в обучающий файл.

Вот образец входного обучающего файла:

hp  Brand
spectre ModelName
x360    ModelName

home    Category
theater Category
system  0

horizon ModelName
zero    ModelName
dawn    ModelName
ps4 0

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

Модель поезда

public void trainAndWrite(String modelOutPath, String prop, String trainingFilepath) {
   Properties props = StringUtils.propFileToProperties(prop);
   props.setProperty("serializeTo", modelOutPath);

   //if input use that, else use from properties file.
   if (trainingFilepath != null) {
       props.setProperty("trainFile", trainingFilepath);
   }

   SeqClassifierFlags flags = new SeqClassifierFlags(props);
   CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
   crf.train();

   crf.serializeClassifier(modelOutPath);
}

Используйте модель для создания тегов:

public void doTagging(CRFClassifier model, String input) {
    input = input.trim();
    System.out.println(input + "=>"  +  model.classifyToString(input));
}  

Надеюсь это поможет.

0
user439521 23 Мар 2018 в 07:27