OpenNLP中语言检测模型训练和模型的使用

因为项目的原因,需要使用到NLP的相关技术。语言检测模型cld3是python要与项目集成也不太方便,后来找到OpenNLP,发现它相对来说,对于亚洲的语言有一些支持。

下面是OpenNLP的训练相关的东西,在项目里如果检测对象过短,对于检测结果也容易出现偏差的情况。所以语料要充足。

一 、文档准备

我们先从文档入手,在官网上的文档是很规范的,先找到Language Detector这个title,然后往下看到training,我们根据文档提示,发现其实我们的语料按照如下规范就可以

注意几点
1.文本文件中的一行就是一条语料,第一列是语种对应的ISO-639-3码,第二列是tab缩进,第三列就是语料文本
2.对于长文本,不要人为的去加换行
3.训练语料必须要有多个不同的语料信息,否则在训练时会报错

二 、模型训练

有了以上的语料文件,就可以通过几行简单的代码就能将其训练成我们需要的语言检测了

InputStreamFactory inputStreamFactory = new MarkableFileInputStreamFactory(new File("corpus.txt"));

ObjectStream<String> lineStream =  new PlainTextByLineStream(inputStreamFactory, StandardCharsets.UTF_8);
ObjectStream<LanguageSample> sampleStream = new LanguageDetectorSampleStream(lineStream);

TrainingParameters params = ModelUtil.createDefaultTrainingParameters();
params.put(TrainingParameters.ALGORITHM_PARAM,  PerceptronTrainer.PERCEPTRON_VALUE);
params.put(TrainingParameters.CUTOFF_PARAM, 0);

LanguageDetectorFactory factory = new LanguageDetectorFactory();

LanguageDetectorModel model = LanguageDetectorME.train(sampleStream, params, factory);
model.serialize(new File("langdetect.bin"));
}

 

最后运行一下,就能在你的本地生成一个langdetect.bin的语料文件了,以后就在程序里用上就好了。

三、模型使用


public void langdetect() {
try (InputStream modelIn = new FileInputStream("/resources/langdetect.bin")) {
LanguageDetectorModel m = new LanguageDetectorModel(modelIn);
LanguageDetector languageDetectorME = new LanguageDetectorME(m);
Language bestLanguage = languageDetectorME.predictLanguage("测试语言嗅探器");
System.out.println("Best language: " + bestLanguage.getLang()); // 预测语言
System.out.println("Best language confidence: " + bestLanguage.getConfidence()); // 语言置信度
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
 

 

四、实验结果

 对多国语言进行训练后的结果:

 

 

原始句子识别情况

长度限制后识别情况

opennlp重新训练模型(括号为去掉对应语料内明显是英文的句子)

 

opennlp(java)

cld3(python)

opennlp(java)

cld3(python)

opennlp(custom)

ar

71%

64%

100%

85%

100%

de

24%

35%

46%(修正83%)

33%

46%(修正91%)

en

63%

60%

80%

69%

93%

es

66%

66%

95%

94%

100%

fr

9%

12%

28%(修正58%)

28%

44%(修正85%)

it

44%

49%

54%

54%

85%

ja

100%

100%

100%

100%

100%

ms

65%

81%

77%

94%

0%

pl

78%

76%

83%

82%

84%

pt

88%

91%

90%

90%

94%

ru

17%

36%

31%

50%

100%

th

96%

100%

99%

100%

100%

tr

55%

17%

60%

44%

66%

zh

100%

100%

100%

100%

100%

整体

62%

57%

80%

76%

90.4%(未统计ms)

 

posted @ 2020-11-17 11:30  藤露  阅读(1265)  评论(0编辑  收藏  举报