OpenNLP - Adlandırılmış Varlık Tanıma
Belirli bir metinden isimleri, kişileri, yerleri ve diğer varlıkları bulma süreci, Named Entity Rtanıma (NER). Bu bölümde, OpenNLP kitaplığını kullanarak Java programı aracılığıyla NER'in nasıl gerçekleştirileceğini tartışacağız.
Açık NLP kullanarak Adlandırılmış Varlık Tanıma
OpenNLP, çeşitli NER görevlerini gerçekleştirmek için önceden tanımlanmış farklı modeller kullanır: en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin ve en-ner-time. çöp Kutusu. Tüm bu dosyalar, belirli bir ham metindeki ilgili varlıkları tespit etmek için eğitilmiş önceden tanımlanmış modellerdir.
opennlp.tools.namefindpaketi, NER görevini gerçekleştirmek için kullanılan sınıfları ve arabirimleri içerir. OpenNLP kitaplığını kullanarak NER görevini gerçekleştirmek için yapmanız gerekenler -
Kullanarak ilgili modeli yükleyin TokenNameFinderModel sınıf.
Örnekleyin NameFinder sınıf.
İsimleri bulun ve yazdırın.
Belirli bir ham metinden isim varlıklarını algılayan bir program yazmak için izlenecek adımlar aşağıdadır.
Adım 1: Modeli yükleme
Cümle algılama modeli, adlı sınıf tarafından temsil edilir. TokenNameFinderModelpakete ait olan opennlp.tools.namefind.
Bir NER modeli yüklemek için -
Oluşturduğunuz bir InputStream modelin nesnesi (FileInputStream'i somutlaştırın ve uygun NER modelinin yolunu String biçiminde yapıcısına iletin).
Örnekleyin TokenNameFinderModel sınıf ve geç InputStream (nesne) modelinin yapıcısına bir parametre olarak aşağıdaki kod bloğunda gösterildiği gibi.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
2. Adım: NameFinderME sınıfının örneğini oluşturma
NameFinderME paketin sınıfı opennlp.tools.namefindNER görevlerini gerçekleştirmek için yöntemler içerir. Bu sınıf, verilen ham metinde adlandırılmış varlıkları bulmak için Maksimum Entropy modelini kullanır.
Bu sınıfı örnekleyin ve önceki adımda oluşturulan model nesnesini aşağıda gösterildiği gibi iletin -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
3. Adım: Cümledeki isimleri bulmak
find() yöntemi NameFinderMEsınıfı, kendisine aktarılan ham metindeki isimleri tespit etmek için kullanılır. Bu yöntem, bir String değişkenini parametre olarak kabul eder.
Cümlenin String biçimini bu yönteme ileterek bu yöntemi çağırın.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Adım 4: Cümledeki adların aralıklarını yazdırma
find() yöntemi NameFinderMEclass, Span türünde bir dizi nesne döndürür. Span adlı sınıfopennlp.tools.util paketi saklamak için kullanılır start ve end kümelerin tamsayısı.
Tarafından döndürülen aralıkları saklayabilirsiniz. find() yöntemini Span dizisine ekleyin ve aşağıdaki kod bloğunda gösterildiği gibi yazdırın.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
Aşağıda verilen cümleyi okuyan ve içindeki kişilerin isimlerinin açıklıklarını tanıyan programdır. Bu programı adıyla bir dosyaya kaydedinNameFinderME_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());
}
}
Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -
javac NameFinderME_Example.java
java NameFinderME_Example
Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıkları) görüntüler.
[0..1) person
[2..3) person
İsimler ve Pozisyonları
substring() String sınıfının yöntemi, begin ve end offsetsve ilgili dizeyi döndürür. Bu yöntemi, aşağıdaki kod bloğunda gösterildiği gibi adları ve açıklıklarını (konumlarını) birlikte yazdırmak için kullanabiliriz.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
Aşağıda verilen ham metinden isimleri tespit etmek ve konumlarıyla birlikte görüntülemek için program yer almaktadır. Bu programı adıyla bir dosyaya kaydedinNameFinderSentences.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()]);
}
}
Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -
javac NameFinderSentences.java
java NameFinderSentences
Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıklarını) görüntüler.
[0..1) person Mike
Konumun Adlarını Bulmak
Çeşitli modeller yükleyerek, çeşitli adlandırılmış varlıkları tespit edebilirsiniz. Aşağıdakileri yükleyen bir Java programıen-ner-location.binverilen cümlede yer adlarını modelleyip algılar. Bu programı adıyla bir dosyaya kaydedinLocationFinder.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()]);
}
}
Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -
javac LocationFinder.java
java LocationFinder
Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıkları) görüntüler.
[4..5) location Hyderabad
Ad Bulucu Olasılığı
probs()yöntemi NameFinderME sınıfı, son kodu çözülen dizinin olasılıklarını elde etmek için kullanılır.
double[] probs = nameFinder.probs();
Olasılıkları yazdırmak için program aşağıdadır. Bu programı adıyla bir dosyaya kaydedinTokenizerMEProbs.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]);
}
}
Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -
javac TokenizerMEProbs.java
java TokenizerMEProbs
Yürütüldüğünde, yukarıdaki program verilen String'i okur, cümleleri belirteçler ve yazdırır. Ek olarak, aşağıda gösterildiği gibi, son kodu çözülen dizinin olasılıklarını da döndürür.
[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