OpenNLP - การรับรู้เอนทิตีที่มีชื่อ
กระบวนการค้นหาชื่อบุคคลสถานที่และหน่วยงานอื่น ๆ จากข้อความที่กำหนดเรียกว่า Nเอเมด Entity Rการรับรู้ (NER) ในบทนี้เราจะพูดถึงวิธีดำเนินการ NER ผ่านโปรแกรม Java โดยใช้ไลบรารี OpenNLP
ชื่อการรับรู้เอนทิตีโดยใช้ NLP แบบเปิด
ในการดำเนินงาน NER ต่างๆ OpenNLP ใช้โมเดลที่กำหนดไว้ล่วงหน้าที่แตกต่างกัน ได้แก่ en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin และ en-ner-time ถังขยะ ไฟล์ทั้งหมดเหล่านี้เป็นแบบจำลองที่กำหนดไว้ล่วงหน้าซึ่งได้รับการฝึกฝนให้ตรวจจับเอนทิตีตามลำดับในข้อความดิบที่กำหนด
opennlp.tools.namefindแพ็กเกจประกอบด้วยคลาสและอินเทอร์เฟซที่ใช้เพื่อดำเนินงาน NER ในการดำเนินงาน NER โดยใช้ไลบรารี OpenNLP คุณต้อง -
โหลดโมเดลตามลำดับโดยใช้ไฟล์ TokenNameFinderModel ชั้นเรียน
เริ่มต้นไฟล์ NameFinder ชั้นเรียน
ค้นหาชื่อและพิมพ์
ต่อไปนี้เป็นขั้นตอนที่ต้องปฏิบัติตามเพื่อเขียนโปรแกรมซึ่งตรวจพบเอนทิตีชื่อจากข้อความดิบที่กำหนด
ขั้นตอนที่ 1: กำลังโหลดโมเดล
โมเดลสำหรับการตรวจจับประโยคแสดงโดยคลาสที่มีชื่อว่า TokenNameFinderModelซึ่งเป็นของแพ็คเกจ opennlp.tools.namefind.
ในการโหลดโมเดล NER -
สร้างไฟล์ InputStream อ็อบเจ็กต์ของโมเดล (สร้างอินสแตนซ์ FileInputStream และส่งเส้นทางของโมเดล NER ที่เหมาะสมในรูปแบบ String ไปยังคอนสตรัคเตอร์)
เริ่มต้นไฟล์ TokenNameFinderModel ชั้นเรียนและผ่าน InputStream (วัตถุ) ของโมเดลเป็นพารามิเตอร์ของตัวสร้างดังที่แสดงในบล็อกโค้ดต่อไปนี้
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
ขั้นตอนที่ 2: สร้างอินสแตนซ์คลาส NameFinderME
NameFinderME คลาสของแพ็คเกจ opennlp.tools.namefindมีวิธีการในการดำเนินงาน NER คลาสนี้ใช้แบบจำลองเอนโทรปีสูงสุดเพื่อค้นหาเอนทิตีที่มีชื่อในข้อความดิบที่กำหนด
สร้างอินสแตนซ์คลาสนี้และส่งผ่านโมเดลอ็อบเจ็กต์ที่สร้างในขั้นตอนก่อนหน้าดังที่แสดงด้านล่าง -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
ขั้นตอนที่ 3: ค้นหาชื่อในประโยค
find() วิธีการของ NameFinderMEคลาสถูกใช้เพื่อตรวจหาชื่อในข้อความดิบที่ส่งผ่านไป วิธีนี้ยอมรับตัวแปร String เป็นพารามิเตอร์
เรียกใช้วิธีนี้โดยส่งรูปแบบ String ของประโยคไปยังวิธีนี้
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
ขั้นตอนที่ 4: พิมพ์ช่วงของชื่อในประโยค
find() วิธีการของ NameFinderMEคลาสส่งคืนอาร์เรย์ของอ็อบเจ็กต์ประเภท Span คลาสที่มีชื่อว่า Span of theopennlp.tools.util แพคเกจใช้ในการจัดเก็บไฟล์ start และ end จำนวนเต็มของชุด
คุณสามารถจัดเก็บช่วงเวลาที่ส่งคืนโดยไฟล์ find() วิธีการในอาร์เรย์ Span และพิมพ์ดังที่แสดงในบล็อกรหัสต่อไปนี้
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
ต่อไปนี้เป็นโปรแกรมที่อ่านประโยคที่กำหนดและจดจำช่วงของชื่อบุคคลที่อยู่ในนั้น บันทึกโปรแกรมนี้ในไฟล์ที่มีชื่อNameFinderME_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());
}
}
คอมไพล์และเรียกใช้ไฟล์ Java ที่บันทึกไว้จากพรอมต์คำสั่งโดยใช้คำสั่งต่อไปนี้ -
javac NameFinderME_Example.java
java NameFinderME_Example
ในการดำเนินการโปรแกรมด้านบนจะอ่านสตริงที่กำหนด (ข้อความดิบ) ตรวจจับชื่อของบุคคลที่อยู่ในนั้นและแสดงตำแหน่ง (ช่วง) ดังที่แสดงด้านล่าง
[0..1) person
[2..3) person
ชื่อพร้อมตำแหน่ง
substring() วิธีการของคลาส String ยอมรับไฟล์ begin และ end offsetsและส่งคืนสตริงที่เกี่ยวข้อง เราสามารถใช้วิธีนี้เพื่อพิมพ์ชื่อและช่วง (ตำแหน่ง) ร่วมกันดังแสดงในบล็อกโค้ดต่อไปนี้
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
ต่อไปนี้เป็นโปรแกรมตรวจจับชื่อจากข้อความดิบที่กำหนดและแสดงพร้อมกับตำแหน่ง บันทึกโปรแกรมนี้ในไฟล์ที่มีชื่อNameFinderSentences.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()]);
}
}
คอมไพล์และเรียกใช้ไฟล์ Java ที่บันทึกไว้จากพรอมต์คำสั่งโดยใช้คำสั่งต่อไปนี้ -
javac NameFinderSentences.java
java NameFinderSentences
ในการดำเนินการโปรแกรมข้างต้นจะอ่านสตริงที่กำหนด (ข้อความดิบ) ตรวจจับชื่อของบุคคลที่อยู่ในนั้นและแสดงตำแหน่ง (ช่วง) ดังที่แสดงด้านล่าง
[0..1) person Mike
การค้นหาชื่อสถานที่
โดยการโหลดโมเดลต่างๆคุณสามารถตรวจจับเอนทิตีที่มีชื่อต่างๆได้ ต่อไปนี้เป็นโปรแกรม Java ที่โหลดไฟล์en-ner-location.binจำลองและตรวจพบชื่อสถานที่ในประโยคที่กำหนด บันทึกโปรแกรมนี้ในไฟล์ที่มีชื่อLocationFinder.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()]);
}
}
คอมไพล์และเรียกใช้ไฟล์ Java ที่บันทึกไว้จากพรอมต์คำสั่งโดยใช้คำสั่งต่อไปนี้ -
javac LocationFinder.java
java LocationFinder
ในการดำเนินการโปรแกรมด้านบนจะอ่านสตริงที่กำหนด (ข้อความดิบ) ตรวจจับชื่อของบุคคลที่อยู่ในนั้นและแสดงตำแหน่ง (ช่วง) ดังที่แสดงด้านล่าง
[4..5) location Hyderabad
ความน่าจะเป็นของ NameFinder
probs()วิธีการของ NameFinderME คลาสใช้เพื่อรับความน่าจะเป็นของลำดับที่ถอดรหัสล่าสุด
double[] probs = nameFinder.probs();
ต่อไปนี้เป็นโปรแกรมพิมพ์ความน่าจะเป็น บันทึกโปรแกรมนี้ในไฟล์ที่มีชื่อTokenizerMEProbs.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]);
}
}
คอมไพล์และเรียกใช้ไฟล์ Java ที่บันทึกไว้จากพรอมต์คำสั่งโดยใช้คำสั่งต่อไปนี้ -
javac TokenizerMEProbs.java
java TokenizerMEProbs
ในการดำเนินการโปรแกรมด้านบนจะอ่านสตริงที่กำหนดโทเค็นประโยคและพิมพ์ออกมา นอกจากนี้ยังส่งกลับค่าความน่าจะเป็นของลำดับที่ถอดรหัสล่าสุดดังที่แสดงด้านล่าง
[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