[NLP]OpenNLP語言檢測器的使用

just-do-it 449141932發表於2020-12-15

目錄

Language Detector

模型訓練

語言型別預測


Language Detector

語言檢測器,屬於分類範疇。即OpenNLP語言檢測器根據模型的能力用ISO-639-3(國際語種代號標準)語言對文件進行分類。模型可以用最大熵模型(Maxent)、感知器(Perceptron)或樸素貝葉斯演算法(Naive Bayes algorithms)訓練。通過用n-gram演算法在規範化文字的上下文中提取詞彙,預設情況下,大小為1、2或3個字。通過擴充套件LanguageDetectorFactory可以定製n-gram的大小、規範化和上下文生成器。

預設的標準化器:

標準化器名稱

描述

EmojiCharSequenceNormalizer

表情符號用空格替換

UrlCharSequenceNormalizer

URLs 和 E-Mails 用空格替換.

TwitterCharSequenceNormalizer

用空格替換標籤和推特的使用者名稱

NumberCharSequenceNormalizer

用空格替換數字序列

ShrinkCharSequenceNormalizer

將重複三次或更多次的字元縮小為只重複兩次。

模型訓練

輸入:languageDetector.txt

spa     A la fecha tres calles bonaerenses recuerdan su nombre (en Ituzaingó, Merlo y Campana). A la fecha, unas 50 naves y 20 aviones se han perdido en esa área particular del océano Atlántico.

deu     Alle Jahre wieder: Millionen Spanier haben am Dienstag die Auslosung in der größten Lotterie der Welt verfolgt.Alle Jahre wieder: So gelingt der stressfreie Geschenke-Umtausch Artikel per E-Mail empfehlen So gelingt der stressfre ie Geschenke-Umtausch Nicht immer liegt am Ende das unter dem Weihnachtsbaum, was man sich gewünscht hat.

srp     Већина становника боравила је кућама од блата или шаторима, како би радили на својим удаљеним пољима у долини Јордана и напасали своје стадо оваца и коза. Већина становника говори оба језика.

lav     Egija Tri-Active procedūru īpaši iesaka izmantot siltākajos gadalaikos, jo ziemā aukstums var šķist arī nepatīkams. Valdība vienojās, ka izmaiņas nodokļu politikā tiek konceptuāli atbalstītas, tomēr deva nedēļu laika Ekonomikas ministrijai, Finanšu ministrijai un Labklājības ministrijai, lai ar vienotu pozīciju atgrieztos pie jautājuma izskatīšanas.

spa     A la fecha tres calles bonaerenses recuerdan su nombre (en Ituzaingó, Merlo y Campana). A la fecha, unas 50 naves y 20 aviones se han perdido en esa área particular del océano Atlántico.

deu     Alle Jahre wieder: Millionen Spanier haben am Dienstag die Auslosung in der größten Lotterie der Welt verfolgt.Alle Jahre wieder: So gelingt der stressfreie Geschenke-Umtausch Artikel per E-Mail empfehlen So gelingt der stressfre ie Geschenke-Umtausch Nicht immer liegt am Ende das unter dem Weihnachtsbaum, was man sich gewünscht hat.

srp     Већина становника боравила је кућама од блата или шаторима, како би радили на својим удаљеним пољима у долини Јордана и напасали своје стадо оваца и коза. Већина становника говори оба језика.

lav

import java.io.File;

import java.io.IOException;

import java.nio.charset.StandardCharsets;

import opennlp.tools.langdetect.LanguageDetectorModel;

import opennlp.tools.langdetect.LanguageDetectorSampleStream;

import opennlp.tools.langdetect.LanguageSample;

import opennlp.tools.ml.perceptron.PerceptronTrainer;

import opennlp.tools.util.InputStreamFactory;

import opennlp.tools.util.MarkableFileInputStreamFactory;

import opennlp.tools.util.ObjectStream;

import opennlp.tools.util.PlainTextByLineStream;

import opennlp.tools.util.TrainingParameters;

import opennlp.tools.util.model.ModelUtil;

import opennlp.tools.langdetect.LanguageDetectorFactory;

import opennlp.tools.langdetect.LanguageDetectorME;



public class LangdetectTrain {



    public static void main(String[] args) throws IOException {

       // TODO Auto-generated method stub

       String rootDir = System.getProperty("user.dir") + File.separator;

      

       String fileResourcesDir = rootDir + "resources" + File.separator;

       String modelResourcesDir = rootDir + "opennlpmodel" + File.separator;

      

       String filePath = fileResourcesDir + "languageDetector.txt";

       System.out.println(filePath);

     

        //建立一個可標註的輸入資料流

       InputStreamFactory inputStreamFactory = new MarkableFileInputStreamFactory(new File(filePath));

        //按行輸入文件,一行代表一個文件

       ObjectStream<String> lineStream = new PlainTextByLineStream(inputStreamFactory, StandardCharsets.UTF_8);

        

       System.out.println(lineStream.read());

       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(modelResourcesDir+"langdetect.bin"));



    }

}

語言型別預測

import java.io.File;

import java.io.IOException;

import opennlp.tools.langdetect.LanguageDetectorModel;

import opennlp.tools.langdetect.Language;

import opennlp.tools.langdetect.LanguageDetectorME;



public class LangdetectPredit {



    public static void main(String[] args) throws IOException {

       // TODO Auto-generated method stub

       String rootDir=System.getProperty("user.dir")+File.separator;

       String fileResourcesDir=rootDir+"resources"+File.separator;

       String modelResourcesDir=rootDir+"opennlpmodel"+File.separator;

       String filePath=fileResourcesDir+"languageDetector.txt";

       String inputTest_en="A la fecha tres calles bonaerenses recuerdan";

       //模型檔案儲存目錄

       String LDMFile =modelResourcesDir+ "langdetect.bin";

       File modelFile = new File("");

       //載入模型

       LanguageDetectorModel LDM = new LanguageDetectorModel(modelFile);

       LanguageDetectorME myCategorizer = new LanguageDetectorME(LDM);

       //預測語言型別

       Language bestLanguage = myCategorizer.predictLanguage(inputTest_en);

       System.out.println("語言型別為: " + bestLanguage.getLang());

       System.out.println("置信度: " + bestLanguage.getConfidence());

       //預測語言型別列表

       Language[] languages = myCategorizer.predictLanguages(inputTest_en);

    }

}

 

相關文章