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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM