Стэнфордское ядро ​​НЛП на сегодняшний день является самой проверенной библиотекой НЛП. В некотором смысле, сегодня это золотой стандарт производительности НЛП. Помимо различных других функций, в библиотеке поддерживается распознавание именованных объектов (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: мы являемся платформой для аннотации данных, которая упрощает создание наборов данных машинного обучения. Просто загрузите данные, пригласите свою команду и очень быстро создавайте наборы данных. "Проверить нас."