2016-03-16 2 views
4

Я пытаюсь создать реализацию java для максимального классификатора. Мне нужно классифицировать предложения в n разных классах.Создание данных обучения для Maxent classfier в Java

Я взглянул на ColumnDataClassifier in stanford maxent classifier. Но я не могу понять, как создавать учебные данные. Мне нужны данные обучения в форме, в которой данные обучения включают в себя теги POS для слов для предложения, так что функции, используемые для классификатора, будут выглядеть как предыдущее слово, следующее слово и т. Д.

Я ищу данные для обучения, в которых есть предложения с POS TAGGING и указанным классом предложений. Пример:

My/(POS) название/(POS) является/(POS) XYZ/(POS) КЛАСС

Любая помощь будет оценена.

+0

Можете ли вы дать пример обучающих данных, вы ищете для? – vcp

+0

Я ищу учебные данные, в которых есть предложения с POS TAGGING и указанным классом предложений. пример: My/(POS) имя/(POS) есть/(POS) XYZ/(POS) CLASS –

+0

Эти 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

ответ

2

Если я правильно понимаю, вы пытаетесь обрабатывать предложения как набор тегов 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)

Некоторые дополнительные образцы будут:

  1. «К 1978 году Radio City утратил свое очарование, и владельцы Центра Рокфеллера решили снести стареющий зал.»
  2. «Со временем он был полностью забыт, многие из его зданий были снесены, другие были неуверенно изменены».
  3. «Как только она вышла, мобильный дом был снесен, костюм сказал».
  4. ...

Это даст образцы:

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 
======================================= 
+0

Спасибо за ответ. Но я ищу обучение, подобное этому My_PRP name_NN is_VBZ XYZ_NNP CLASS Значение предложения также присутствует в обучающем наборе вместе с тегами POS. И затем используйте maxent как классификатор, который использует функции, которые включают функции, основанные на словах предложений, а также теги POS, –

+0

Я только что отредактировал свой ответ - добавлен полностью рабочий пример в данных java + sample. –

+0

Большое спасибо. Можете ли вы сказать мне еще одну вещь. Каковы все функции, которыми сейчас пользуется классификатор. ? Также используется ли POS-теги для классификации или рассматривает POS-теги как другие английские слова. –