Стэнфордское ядро НЛП на сегодняшний день является самой проверенной библиотекой НЛП. В некотором смысле, сегодня это золотой стандарт производительности НЛП. Помимо различных других функций, в библиотеке поддерживается распознавание именованных объектов (NER), что позволяет пометить важные объекты в фрагменте текста, такие как имя человека, место и т. Д.
Основной тег NLP NER реализует алгоритм CRF (условное случайное поле), который является одним из лучших способов решения проблемы NER в NLP. Алгоритм обучается на помеченном наборе данных, и на выходе получается изученная модель.
По сути, модель изучает информацию и структуру обучающих данных и может использовать их для маркировки невидимого текста. CoreNLP поставляется с несколькими предварительно обученными моделями, такими как английские модели, обученные структурированному английскому тексту для определения имен, мест и т. Д.
Но если текст в вашем домене или варианте использования не перекрывает домен, для которого были созданы предварительно обученные модели, тогда предварительно обученная модель может вам не подойти. В таких случаях вы можете создать свои собственные обучающие данные и обучить пользовательскую модель специально для вашего случая использования.
Мы покажем, как мы можем использовать теггер NER для изучения сущностей в запросах из поиска электронной коммерции.
Получите набор данных, используемый ниже здесь.
Данные обучения передаются в виде текстового файла, где каждая строка представляет собой одну пару слово-метка. Каждое слово в строке должно быть помечено в формате «word \ tLABEL», слово и название метки разделяются табуляцией «\ t». Текстовое предложение следует разбить на слова и добавить по одной строке для каждого слова в обучающем файле. Чтобы отметить начало следующей строки, мы добавляем пустую строку в обучающий файл.
Вот образец входного обучающего файла:
hp Brand spectre ModelName x360 ModelName home Category theater Category system 0 horizon ModelName zero ModelName dawn ModelName ps4 0 hoverboard Category
Примечание: каждое слово требует метки / тега. Здесь для слов, которые нам не важны, мы используем нулевой ярлык «0».
В зависимости от вашего домена вы можете создать такой набор данных автоматически или вручную. Создание такого набора данных вручную может быть очень болезненным, такие инструменты, как Dataturks NER tagger, могут помочь значительно упростить этот процесс.
Важным классом здесь является CRFClassifier
, который содержит фактическую модель. Ниже приведен код для построения модели из файла обучающих данных и вывода модели в файл.
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); }
CoreNLP использует файл свойств, в котором мы можем определить параметры построения пользовательской модели. Например, мы можем определить, как создавать функции для обучения и т. Д. Ниже приведен пример файла свойств:
# location of the training file trainFile = ./standford_train.txt # location where you would like to save (serialize) your # classifier; adding .gz at the end automatically gzips the file, # making it smaller, and faster to load serializeTo = ner-model.ser.gz
# structure of your training file; this tells the classifier that # the word is in column 0 and the correct answer is in column 1 map = word=0,answer=1
# This specifies the order of the CRF: order 1 means that features # apply at most to a class pair of previous class and current class # or current class and next class. maxLeft=1
# these are the features we'd like to train with # some are discussed below, the rest can be # understood by looking at NERFeatureFactory useClassFeature=true useWord=true # word character ngrams will be included up to length 6 as prefixes # and suffixes only useNGrams=true noMidNGrams=true maxNGramLeng=6 usePrev=true useNext=true useDisjunctive=true useSequences=true usePrevSequences=true # the last 4 properties deal with word shape features useTypeSeqs=true useTypeSeqs2=true useTypeySequences=true #wordShape=chris2useLC wordShape=none #useBoundarySequences=true #useNeighborNGrams=true #useTaggySequences=true #printFeatures=true #saveFeatureIndexToDisk = true #useObservedSequencesOnly = true #useWordPairs = true
Поскольку мы сохранили модель в файл, теперь мы можем загрузить эту модель (или распространить ее для использования другими):
public CRFClassifier getModel(String modelPath) {
return CRFClassifier.getClassifierNoExceptions(modelPath);
}
Наконец, мы можем увидеть, как эту модель можно использовать для маркировки невидимых запросов:
public void doTagging(CRFClassifier model, String input) {
input = input.trim();
System.out.println(input + "=>" + model.classifyToString(input));
}
Вот пример вывода с использованием нашей модели
String[] tests = new String[] {"apple watch", "samsung mobile phones", " lcd 52 inch tv"};
for (String item : tests) {
doTagging(model, item);
}
Вывод
apple watch=>apple/Brand watch/Category
samsung mobile phones=>samsung/Brand mobile/Category phones/Category
lcd 52 inch tv=>lcd/ModelName 52/ModelName inch/0 tv/Category
Плагин Shameless: мы являемся платформой для аннотации данных, которая упрощает создание наборов данных машинного обучения. Просто загрузите данные, пригласите свою команду и очень быстро создавайте наборы данных. "Проверить нас."