OpenNLP-Document Categoryorizer - как классифицировать документы по статусу;язык документов не английский, также функции по умолчанию? - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу классифицировать свои документы, используя классификатор документов OpenNLP, основываясь на их статусе: предварительно открыт, открыт, заблокирован, закрыт и т. Д.

У меня есть 5 классов, и я использую алгоритм Наивного Байеса,60 документов в моем обучающем комплекте и обучили мой набор на 1000 итераций с 1 отрезанным параметром.

Но безуспешно, когда я проверяю их, я не получаю хороших результатов.Я подумал, может быть, это из-за языка документов (не на английском языке) или, может быть, я должен как-то добавить статусы как функции.Я установил функции по умолчанию в классификаторе, а также я не очень знаком с ними.

Результат должен быть заблокирован, но он классифицирован как открытый.

InputStreamFactory in=null;
try {
in= new MarkableFileInputStreamFactory(new 
File("D:\\JavaNlp\\doccategorizer\\doccategorizer.txt"));
}
catch (FileNotFoundException e2) {
System.out.println("Creating new input stream");
e2.printStackTrace();
}

ObjectStream lineStream=null;
ObjectStream sampleStream=null;

try {
lineStream = new PlainTextByLineStream(in, "UTF-8");
sampleStream = new DocumentSampleStream(lineStream);            
}
catch (IOException e1) {
System.out.println("Document Sample Stream");
e1.printStackTrace();
}


TrainingParameters params = new TrainingParameters();
params.put(TrainingParameters.ITERATIONS_PARAM, 1000+"");
params.put(TrainingParameters.CUTOFF_PARAM, 1+"");
params.put(AbstractTrainer.ALGORITHM_PARAM, 
NaiveBayesTrainer.NAIVE_BAYES_VALUE);


DoccatModel model=null;
try {
model = DocumentCategorizerME.train("en", sampleStream, params, new 
DoccatFactory());
} 
catch (IOException e) 
{
System.out.println("Training...");
e.printStackTrace();
}


System.out.println("\nModel is successfully trained.");


BufferedOutputStream modelOut=null;

try {
modelOut = new BufferedOutputStream(new 
FileOutputStream("D:\\JavaNlp\\doccategorizer\\classifier-maxent.bin"));
} 
catch (FileNotFoundException e) {

System.out.println("Creating output stream");
e.printStackTrace();
}
try {
model.serialize(modelOut);
}
catch (IOException e) {

System.out.println("Serialize...");
e.printStackTrace();
}
System.out.println("\nTrained model is kept in: 
"+"model"+File.separator+"en-cases-classifier-maxent.bin");

DocumentCategorizer doccat = new DocumentCategorizerME(model);
String[] docWords = "Some text here...".replaceAll("[^A-Za-z]", " ").split(" ");
double[] aProbs = doccat.categorize(docWords);


System.out.println("\n---------------------------------\nCategory : 
Probability\n---------------------------------");
for(int i=0;i<doccat.getNumberOfCategories();i++){
System.out.println(doccat.getCategory(i)+" : "+aProbs[i]);
}
System.out.println("---------------------------------");

System.out.println("\n"+doccat.getBestCategory(aProbs)+" : is the category 
for the given sentence");

results results2

Может ли кто-нибудь подсказать мне, как правильно классифицировать мои документы, например, стоит ли сначала добавить детектор языка или добавить новые функции?

Заранее спасибо

1 Ответ

0 голосов
/ 24 декабря 2018

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

category<tab>document text

Текст должен занимать одну строку.Документацию opennlp для классификатора документов можно найти по адресу http://opennlp.apache.org/docs/1.9.0/manual/opennlp.html#tools.doccat.training.tool

. Было бы полезно, если бы вы могли предоставить одну или две строки обучающих данных, чтобы помочь изучить формат.

Редактировать : еще одна потенциальная проблема.60 документов могут быть недостаточными для подготовки хорошего классификатора, особенно если у вас большой словарный запас.Кроме того, хотя это не английский, скажите, пожалуйста, что это не несколько языков.Наконец, является ли текст документа лучшим способом классификации документа?Будет ли метаданные из самого документа производить лучшие функции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...