zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    RDLC报表中浮点型设置精度设置小数位位数
    C# 设置DateTime类型的变量值等于Null
    我的2011就这样混掉了
    RDLC报表改动的注意事项之增加字段和参数
    (分享)C# 绘制统计图(柱状图, 折线图, 扇形图)
    C#实现Winform自定义半透明遮罩层
    C#中判断网络连接的状态
    su 和 sudo、su root和su root 区别
    嵌入式系统软件优化方法
    ARM开发步步深入之定时加速
  • 原文地址:https://www.cnblogs.com/abc8023/p/13993342.html
Copyright © 2011-2022 走看看