• 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)

  • 相关阅读:
    航班查询http://www.variflight.com/
    打印串口日志
    驱动天使 360驱动大师好用2020
    mysqldMY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. 2020-12
    拖拽刻录
    traceroute排查网络故障 www.qq.com排查网络故障网络不通 先ping自己
    tigervnc报错
    java axis调用带有soap头(soapheader)的.net webservice
    java 调用WebService【转】
    List<String>转换为实体类的属性【转】
  • 原文地址:https://www.cnblogs.com/abc8023/p/13993342.html
Copyright © 2020-2023  润新知