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