OpenNLP - Pengakuan Entitas Bernama
Proses menemukan nama, orang, tempat, dan entitas lain, dari teks tertentu disebut Named Entity Recognition (NER). Pada bab ini, kita akan membahas bagaimana menjalankan NER melalui program Java dengan menggunakan library OpenNLP.
Pengakuan Entitas Bernama menggunakan NLP terbuka
Untuk melakukan berbagai tugas NER, OpenNLP menggunakan model standar yang berbeda yaitu, en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin, dan en-ner-time. tempat sampah. Semua file ini adalah model yang telah ditentukan sebelumnya yang dilatih untuk mendeteksi entitas masing-masing dalam teks mentah tertentu.
Itu opennlp.tools.namefindpaket berisi kelas dan antarmuka yang digunakan untuk melakukan tugas NER. Untuk melakukan tugas NER menggunakan pustaka OpenNLP, Anda perlu -
Muat model masing-masing menggunakan TokenNameFinderModel kelas.
Instantiate NameFinder kelas.
Temukan nama dan cetaklah.
Berikut adalah langkah-langkah yang harus diikuti untuk menulis program yang mendeteksi entitas nama dari teks mentah yang diberikan.
Langkah 1: Memuat model
Model untuk pendeteksian kalimat diwakili oleh kelas bernama TokenNameFinderModel, yang termasuk dalam paket opennlp.tools.namefind.
Untuk memuat model NER -
Buat InputStream objek model (Membuat instance FileInputStream dan meneruskan jalur model NER yang sesuai dalam format String ke konstruktornya).
Instantiate TokenNameFinderModel kelas dan lulus InputStream (objek) model sebagai parameter untuk konstruktornya, seperti yang ditunjukkan pada blok kode berikut.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
Langkah 2: Membuat instance kelas NameFinderME
Itu NameFinderME kelas paket opennlp.tools.namefindberisi metode untuk melakukan tugas NER. Kelas ini menggunakan model Entropi Maksimum untuk menemukan entitas bernama dalam teks mentah yang diberikan.
Buat instance kelas ini dan teruskan objek model yang dibuat pada langkah sebelumnya seperti yang ditunjukkan di bawah ini -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
Langkah 3: Menemukan nama-nama dalam kalimat
Itu find() metode dari NameFinderMEkelas digunakan untuk mendeteksi nama-nama dalam teks mentah yang diteruskan padanya. Metode ini menerima variabel String sebagai parameter.
Panggil metode ini dengan meneruskan format String dari kalimat ke metode ini.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Langkah 4: Mencetak rentang nama dalam kalimat
Itu find() metode dari NameFinderMEclass mengembalikan larik objek dengan tipe Span. Kelas bernama Span of theopennlp.tools.util paket digunakan untuk menyimpan file start dan end bilangan bulat himpunan.
Anda dapat menyimpan durasi yang dikembalikan oleh find() metode dalam array Span dan mencetaknya, seperti yang ditunjukkan pada blok kode berikut.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
Berikut adalah program yang membaca kalimat yang diberikan dan mengenali span dari nama-nama orang di dalamnya. Simpan program ini dalam sebuah file dengan namaNameFinderME_Example.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.util.Span;
public class NameFinderME_Example {
public static void main(String args[]) throws Exception{
/Loading the NER - Person model InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStream);
//Instantiating the NameFinder class
NameFinderME nameFinder = new NameFinderME(model);
//Getting the sentence in the form of String array
String [] sentence = new String[]{
"Mike",
"and",
"Smith",
"are",
"good",
"friends"
};
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
//Printing the spans of the names in the sentence
for(Span s: nameSpans)
System.out.println(s.toString());
}
}
Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -
javac NameFinderME_Example.java
java NameFinderME_Example
Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi mereka (span), seperti yang ditunjukkan di bawah ini.
[0..1) person
[2..3) person
Nama beserta Posisinya
Itu substring() metode kelas String menerima begin dan end offsetsdan mengembalikan string masing-masing. Kita dapat menggunakan metode ini untuk mencetak nama dan bentang (posisi) mereka bersama-sama, seperti yang ditunjukkan pada blok kode berikut.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
Berikut adalah program untuk mendeteksi nama-nama dari teks mentah yang diberikan dan menampilkannya beserta posisinya. Simpan program ini dalam sebuah file dengan namaNameFinderSentences.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class NameFinderSentences {
public static void main(String args[]) throws Exception{
//Loading the tokenizer model
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
//Tokenizing the sentence in to a string array
String sentence = "Mike is senior programming
manager and Rama is a clerk both are working at
Tutorialspoint";
String tokens[] = tokenizer.tokenize(sentence);
//Loading the NER-person model
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/enner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(tokens);
//Printing the names and their spans in a sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -
javac NameFinderSentences.java
java NameFinderSentences
Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi (span) mereka seperti yang ditunjukkan di bawah ini.
[0..1) person Mike
Menemukan Nama Lokasi
Dengan memuat berbagai model, Anda dapat mendeteksi berbagai entitas bernama. Berikut ini adalah program Java yang memuat fileen-ner-location.binmodel dan mendeteksi nama lokasi dalam kalimat yang diberikan. Simpan program ini dalam sebuah file dengan namaLocationFinder.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class LocationFinder {
public static void main(String args[]) throws Exception{
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//String paragraph = "Mike and Smith are classmates";
String paragraph = "Tutorialspoint is located in Hyderabad";
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
String tokens[] = tokenizer.tokenize(paragraph);
//Loading the NER-location moodel
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/en- ner-location.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names of a location
Span nameSpans[] = nameFinder.find(tokens);
//Printing the spans of the locations in the sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -
javac LocationFinder.java
java LocationFinder
Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi mereka (span), seperti yang ditunjukkan di bawah ini.
[4..5) location Hyderabad
Kemungkinan Pencari Nama
Itu probs()metode dari NameFinderME kelas digunakan untuk mendapatkan probabilitas dari urutan yang terakhir didekodekan.
double[] probs = nameFinder.probs();
Berikut adalah program untuk mencetak probabilitas. Simpan program ini dalam sebuah file dengan namaTokenizerMEProbs.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class TokenizerMEProbs {
public static void main(String args[]) throws Exception{
String sent = "Hello John how are you welcome to Tutorialspoint";
//Loading the Tokenizer model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-token.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStream);
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
//Retrieving the positions of the tokens
Span tokens[] = tokenizer.tokenizePos(sent);
//Getting the probabilities of the recent calls to tokenizePos() method
double[] probs = tokenizer.getTokenProbabilities();
//Printing the spans of tokens
for( Span token : tokens)
System.out.println(token +"
"+sent.substring(token.getStart(), token.getEnd()));
System.out.println(" ");
for(int i = 0; i<probs.length; i++)
System.out.println(probs[i]);
}
}
Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -
javac TokenizerMEProbs.java
java TokenizerMEProbs
Saat mengeksekusi, program di atas membaca String yang diberikan, memberi token pada kalimat, dan mencetaknya. Selain itu, ini juga mengembalikan probabilitas urutan yang terakhir didekodekan, seperti yang ditunjukkan di bawah ini.
[0..5) Hello
[6..10) John
[11..14) how
[15..18) are
[19..22) you
[23..30) welcome
[31..33) to
[34..48) Tutorialspoint
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0