OpenNLP-Document Categorizer-如何根据状态对文档进行分类;文档的语言不是英语,还有默认功能吗?

Posted

技术标签:

【中文标题】OpenNLP-Document Categorizer-如何根据状态对文档进行分类;文档的语言不是英语,还有默认功能吗?【英文标题】:OpenNLP-Document Categorizer- how to classify documents based on status; language of docs not English, also default features? 【发布时间】:2019-05-23 15:18:42 【问题描述】:

我想使用 OpenNLP 的 Document Categorizer 对我的文档进行分类,根据它们的状态:预打开、打开、锁定、关闭等。

我有 5 个类,我正在使用朴素贝叶斯算法,我的训练集中有 60 个文档,并使用 1 个截止参数对我的集进行了 1000 次迭代训练。

但是没有成功,当我测试它们时,我没有得到好的结果。我在想可能是因为文件的语言(不是英语),或者我应该以某种方式将状态添加为功能。我已经在分类器中设置了默认功能,而且我对它们不是很熟悉。

结果应该被锁定,但它被归类为打开。

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");

有人可以建议我如何对我的文档进行分类,比如我应该先添加语言检测器,还是添加新功能?

提前致谢

【问题讨论】:

【参考方案1】:

默认情况下,文档分类器获取文档文本并形成一个词袋。袋子里的每个单词都变成了一个特征。只要该语言可以由英语标记器(同样默认为空格标记器)标记,我猜该语言不是您的问题。我会检查您用于训练数据的数据格式。它的格式应该是这样的:

category<tab>document text

文本应该是一行。文档分类器的 opennlp 文档可以在http://opennlp.apache.org/docs/1.9.0/manual/opennlp.html#tools.doccat.training.tool找到。

如果您能提供一两行训练数据来帮助检查格式,将会很有帮助。

编辑:另一个潜在问题。 60 个文档可能不足以训练一个好的分类器,特别是如果您有大量词汇表。另外,即使这不是英语,请告诉我它不是多种语言。最后,文档文本是对文档进行分类的最佳方式吗?文档本身的元数据会产生更好的功能吗?

希望对你有帮助。

【讨论】:

以上是关于OpenNLP-Document Categorizer-如何根据状态对文档进行分类;文档的语言不是英语,还有默认功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

nmap教程(下)

产品和评论系统的维度建模

损失函数LossTensorFlow2入门手册

CakePHP 我将如何获取类别明智的产品?

在reactjs中设置嵌套元素的状态,多级数组[重复]

MySQL选择相关表中有多个匹配记录的记录