Если я правильно понимаю, вы пытаетесь обрабатывать предложения как набор тегов POS.
В вашем примере предложение «Мое имя XYZ» будет представлено как набор (PRP $, NN, VBZ, NNP). Это означало бы, каждое предложение на самом деле является двоичного вектора длины 37 (потому что есть 36 possible POS tags according to this page + функция исхода класса для всего предложения)
Это может быть закодировано для OpenNLP MaxEnt следующим образом:
PRP$=1 NN=1 VBZ=1 NNP=1 CLASS=SomeClassOfYours1
или просто:
PRP$ NN VBZ NNP CLASS=SomeClassOfYours1
(Для работы с кодовым сниппет увидеть мой ответ здесь: Training models using openNLP maxent)
Некоторые дополнительные образцы будут:
- «К 1978 году Radio City утратил свое очарование, и владельцы Центра Рокфеллера решили снести стареющий зал.»
- «Со временем он был полностью забыт, многие из его зданий были снесены, другие были неуверенно изменены».
- «Как только она вышла, мобильный дом был снесен, костюм сказал».
- ...
Это даст образцы:
IN CD NNP VBD VBN PRP$ NN CC DT NNS IN TO VB VBG CLASS=SomeClassOfYours2
IN NN PRP VBD RB VBN JJ IN PRP$ NNS CLASS=SomeClassOfYours3
IN RB PRP VBD RP DT JJ NN VBN NN CLASS=SomeClassOfYours2
...
Однако, я не ожидал, что такая классификация дает хорошие результаты. Было бы лучше использовать другие структурные особенности предложения, такие как дерево синтаксического анализа или дерево зависимостей, которое может быть получено с использованием, например, Stanford parser.
Отредактировано 28.3.2016: Вы также можете использовать все предложение в качестве образца для обучения.Тем не менее, следует помнить, что: - два предложения могут содержать одни и те же слова, но имеют разный смысл - есть довольно высокая вероятность переобучения - вы должны использовать короткие предложения - вам нужен огромный учебный набор
Согласно вашим Например, я бы кодировал обучающие образцы следующим образом:
class=CLASS My_PRP name_NN is_VBZ XYZ_NNP
...
Обратите внимание, что переменная результата поступает как первый элемент в каждой строке.
Вот полный рабочий пример с использованием opennlp-maxent-3.0.3.jar
.
package my.maxent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;
import opennlp.maxent.GIS;
import opennlp.maxent.io.GISModelReader;
import opennlp.maxent.io.SuffixSensitiveGISModelWriter;
import opennlp.model.AbstractModel;
import opennlp.model.AbstractModelWriter;
import opennlp.model.DataIndexer;
import opennlp.model.DataReader;
import opennlp.model.FileEventStream;
import opennlp.model.MaxentModel;
import opennlp.model.OnePassDataIndexer;
import opennlp.model.PlainTextFileDataReader;
public class MaxentTest {
public static void main(String[] args) throws IOException {
String trainingFileName = "training-file.txt";
String modelFileName = "trained-model.maxent.gz";
// Training a model from data stored in a file.
// The training file contains one training sample per line.
DataIndexer indexer = new OnePassDataIndexer(new FileEventStream(trainingFileName));
MaxentModel trainedMaxentModel = GIS.trainModel(100, indexer); // 100 iterations
// Storing the trained model into a file for later use (gzipped)
File outFile = new File(modelFileName);
AbstractModelWriter writer = new SuffixSensitiveGISModelWriter((AbstractModel) trainedMaxentModel, outFile);
writer.persist();
// Loading the gzipped model from a file
FileInputStream inputStream = new FileInputStream(modelFileName);
InputStream decodedInputStream = new GZIPInputStream(inputStream);
DataReader modelReader = new PlainTextFileDataReader(decodedInputStream);
MaxentModel loadedMaxentModel = new GISModelReader(modelReader).getModel();
// Now predicting the outcome using the loaded model
String[] context = {"is_VBZ", "Gaby_NNP"};
double[] outcomeProbs = loadedMaxentModel.eval(context);
String outcome = loadedMaxentModel.getBestOutcome(outcomeProbs);
System.out.println("=======================================");
System.out.println(outcome);
System.out.println("=======================================");
}
}
И некоторые данные фиктивные обучения (хранятся в training-file.txt
):
class=Male My_PRP name_NN is_VBZ John_NNP
class=Male My_PRP name_NN is_VBZ Peter_NNP
class=Female My_PRP name_NN is_VBZ Anna_NNP
class=Female My_PRP name_NN is_VBZ Gaby_NNP
Это дает следующий результат:
Indexing events using cutoff of 0
Computing event counts... done. 4 events
Indexing... done.
Sorting and merging events... done. Reduced 4 events to 4.
Done indexing.
Incorporating indexed data for training...
done.
Number of Event Tokens: 4
Number of Outcomes: 2
Number of Predicates: 7
...done.
Computing model parameters ...
Performing 100 iterations.
1: ... loglikelihood=-2.772588722239781 0.5
2: ... loglikelihood=-2.4410105407571203 1.0
...
99: ... loglikelihood=-0.16111520541752372 1.0
100: ... loglikelihood=-0.15953272940719138 1.0
=======================================
class=Female
=======================================
Можете ли вы дать пример обучающих данных, вы ищете для? – vcp
Я ищу учебные данные, в которых есть предложения с POS TAGGING и указанным классом предложений. пример: My/(POS) имя/(POS) есть/(POS) XYZ/(POS) CLASS –
Эти Q & A полезны? http://stackoverflow.com/questions/28601653/how-do-we-get-run-stanford-classifier-on-an-array-of-strings и http://stackoverflow.com/questions/31091082/how- в-использовании-pos-tag-as-a-feature-for-training-data-by-naive-bayes-classifier – vcp