因为项目的原因,需要使用到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) |