因爲項目的原因,需要使用到NLP的相關技術。當時是先使用過nltk,但是因爲nltk主要是外國的語種支持的比較豐富,而且又是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的語料文件了,以後就在程序裏用上就好了。