OpenNLP - Hướng dẫn nhanh

NLP là một bộ công cụ được sử dụng để lấy thông tin có ý nghĩa và hữu ích từ các nguồn ngôn ngữ tự nhiên như các trang web và tài liệu văn bản.

Open NLP là gì?

Apache OpenNLPlà một thư viện Java mã nguồn mở được sử dụng để xử lý văn bản ngôn ngữ tự nhiên. Bạn có thể xây dựng một dịch vụ xử lý văn bản hiệu quả bằng cách sử dụng thư viện này.

OpenNLP cung cấp các dịch vụ như mã hóa, phân đoạn câu, gắn thẻ một phần giọng nói, trích xuất thực thể được đặt tên, phân đoạn, phân tích cú pháp và phân giải đồng tham chiếu, v.v.

Các tính năng của OpenNLP

Sau đây là các tính năng đáng chú ý của OpenNLP:

  • Named Entity Recognition (NER) - Open NLP hỗ trợ NER, sử dụng nó bạn có thể trích xuất tên của vị trí, người và mọi thứ ngay cả khi đang xử lý các truy vấn.

  • Summarize - Sử dụng summarize , bạn có thể tóm tắt Đoạn văn, bài báo, tài liệu hoặc bộ sưu tập của chúng trong NLP.

  • Searching - Trong OpenNLP, một chuỗi tìm kiếm nhất định hoặc các từ đồng nghĩa của nó có thể được xác định trong văn bản nhất định, ngay cả khi từ đã cho bị thay đổi hoặc sai chính tả.

  • Tagging (POS) - Gắn thẻ trong NLP được sử dụng để chia văn bản thành các yếu tố ngữ pháp khác nhau để phân tích thêm.

  • Translation - Trong NLP, Dịch thuật giúp dịch ngôn ngữ này sang ngôn ngữ khác.

  • Information grouping - Tùy chọn này trong NLP nhóm thông tin dạng văn bản trong nội dung của tài liệu, giống như Các phần của bài phát biểu.

  • Natural Language Generation - Nó được sử dụng để tạo thông tin từ cơ sở dữ liệu và tự động hóa các báo cáo thông tin như phân tích thời tiết hoặc báo cáo y tế.

  • Feedback Analysis - Như tên của nó, NLP sẽ thu thập nhiều loại phản hồi từ mọi người, về sản phẩm, để phân tích mức độ thành công của sản phẩm trong việc chiếm được cảm tình của họ.

  • Speech recognition - Mặc dù khó phân tích giọng nói của con người, NLP có một số tính năng tích hợp cho yêu cầu này.

Mở API NLP

Thư viện Apache OpenNLP cung cấp các lớp và giao diện để thực hiện các tác vụ khác nhau của xử lý ngôn ngữ tự nhiên như phát hiện câu, mã hóa, tìm tên, gắn thẻ các phần của giọng nói, phân đoạn một câu, phân tích cú pháp, phân giải đồng tham chiếu và phân loại tài liệu.

Ngoài các nhiệm vụ này, chúng tôi cũng có thể đào tạo và đánh giá các mô hình của riêng mình cho bất kỳ nhiệm vụ nào trong số này.

OpenNLP CLI

Ngoài thư viện, OpenNLP cũng cung cấp Giao diện dòng lệnh (CLI), nơi chúng ta có thể đào tạo và đánh giá các mô hình. Chúng ta sẽ thảo luận chi tiết về chủ đề này trong chương cuối của hướng dẫn này.

Mở mô hình NLP

Để thực hiện các tác vụ NLP khác nhau, OpenNLP cung cấp một tập hợp các mô hình được xác định trước. Bộ này bao gồm các mô hình cho các ngôn ngữ khác nhau.

Tải xuống các mô hình

Bạn có thể làm theo các bước dưới đây để tải xuống các mô hình được xác định trước do OpenNLP cung cấp.

Step 1 - Mở trang chỉ mục của các mô hình OpenNLP bằng cách nhấp vào liên kết sau - http://opennlp.sourceforge.net/models-1.5/.

Step 2- Khi truy cập vào liên kết đã cho, bạn sẽ thấy danh sách các thành phần của nhiều ngôn ngữ khác nhau và các liên kết để tải chúng xuống. Tại đây, bạn có thể nhận danh sách tất cả các mô hình được xác định trước do OpenNLP cung cấp.

Tải xuống tất cả các mô hình này vào thư mục C:/OpenNLP_models/>, bằng cách nhấp vào các liên kết tương ứng của họ. Tất cả các mô hình này đều phụ thuộc vào ngôn ngữ và trong khi sử dụng chúng, bạn phải đảm bảo rằng ngôn ngữ mô hình khớp với ngôn ngữ của văn bản đầu vào.

Lịch sử của OpenNLP

  • Năm 2010, OpenNLP tham gia vào quá trình ấp Apache.

  • Năm 2011, Apache OpenNLP 1.5.2 Incubating được phát hành và cùng năm đó, nó trở thành một dự án Apache cấp cao nhất.

  • Vào năm 2015, OpenNLP đã được phát hành 1.6.0.

Trong chương này, chúng ta sẽ thảo luận về cách bạn có thể thiết lập môi trường OpenNLP trong hệ thống của mình. Hãy bắt đầu với quá trình cài đặt.

Cài đặt OpenNLP

Sau đây là các bước để tải xuống Apache OpenNLP library trong hệ thống của bạn.

Step 1 - Mở trang chủ của Apache OpenNLP bằng cách nhấp vào liên kết sau - https://opennlp.apache.org/.

Step 2 - Bây giờ, hãy nhấp vào Downloadsliên kết. Khi nhấp vào, bạn sẽ được dẫn đến một trang nơi bạn có thể tìm thấy nhiều bản sao khác nhau sẽ chuyển hướng bạn đến thư mục Phân phối Tổ chức Phần mềm Apache.

Step 3- Trong trang này, bạn có thể tìm thấy các liên kết để tải xuống các bản phân phối Apache khác nhau. Duyệt qua chúng và tìm bản phân phối OpenNLP và nhấp vào nó.

Step 4 - Khi nhấp vào, bạn sẽ được chuyển đến thư mục nơi bạn có thể xem chỉ mục của bản phân phối OpenNLP, như hình dưới đây.

Nhấp vào phiên bản mới nhất từ ​​các bản phân phối có sẵn.

Step 5- Mỗi bản phân phối cung cấp các tệp Nguồn và Nhị phân của thư viện OpenNLP ở nhiều định dạng khác nhau. Tải xuống tệp nguồn và tệp nhị phân,apache-opennlp-1.6.0-bin.zipapache-opennlp1.6.0-src.zip (cho cửa sổ).

Đặt Classpath

Sau khi tải xuống thư viện OpenNLP, bạn cần đặt đường dẫn của nó đến bindanh mục. Giả sử rằng bạn đã tải thư viện OpenNLP xuống ổ đĩa E của hệ thống.

Bây giờ, hãy làm theo các bước được đưa ra bên dưới -

Step 1 - Nhấp chuột phải vào 'My Computer' và chọn 'Properties'.

Step 2 - Nhấp vào nút 'Biến Môi trường' trong tab 'Nâng cao'.

Step 3 - Chọn path và nhấp vào Edit , như được hiển thị trong ảnh chụp màn hình sau.

Step 4 - Trong cửa sổ Chỉnh sửa Biến Môi trường, nhấp vào New và thêm đường dẫn cho thư mục OpenNLP E:\apache-opennlp-1.6.0\bin và nhấp vào OK , như được hiển thị trong ảnh chụp màn hình sau.

Cài đặt Eclipse

Bạn có thể đặt môi trường Eclipse cho thư viện OpenNLP, bằng cách đặt Build path vào các tệp JAR hoặc bằng cách sử dụng pom.xml.

Đặt đường dẫn xây dựng đến tệp JAR

Làm theo các bước dưới đây để cài đặt OpenNLP trong Eclipse -

Step 1 - Đảm bảo rằng bạn đã cài đặt môi trường Eclipse trong hệ thống của mình.

Step 2- Mở Eclipse. Nhấp vào Tệp → Mới → Mở một dự án mới, như hình dưới đây.

Step 3 - Bạn sẽ nhận được New ProjectThuật sĩ. Trong trình hướng dẫn này, hãy chọn dự án Java và tiếp tục bằng cách nhấp vàoNext cái nút.

Step 4 - Tiếp theo, bạn sẽ nhận được New Java Project wizard. Tại đây, bạn cần tạo một dự án mới và nhấp vàoNext như hình dưới đây.

Step 5 - Sau khi tạo dự án mới, nhấp chuột phải vào dự án đó, chọn Build Path và bấm vào Configure Build Path.

Step 6 - Tiếp theo, bạn sẽ nhận được Java Build PathThuật sĩ. Tại đây, nhấp vàoAdd External JARs như hình dưới đây.

Step 7 - Chọn các tệp jar opennlp-tools-1.6.0.jaropennlp-uima-1.6.0.jar nằm ở lib thư mục của apache-opennlp-1.6.0 folder.

Khi nhấp vào Open trong màn hình trên, các tệp đã chọn sẽ được thêm vào thư viện của bạn.

Khi nhấp vào OK, bạn sẽ thêm thành công các tệp JAR cần thiết vào dự án hiện tại và bạn có thể xác minh các thư viện đã thêm này bằng cách mở rộng Thư viện được tham chiếu, như được hiển thị bên dưới.

Sử dụng pom.xml

Chuyển đổi dự án thành dự án Maven và thêm mã sau vào pom.xml.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
   <modelVersion>4.0.0</modelVersion> 
   <groupId>myproject</groupId> 
   <artifactId>myproject</artifactId> 
   <version>0.0.1-SNAPSHOT</version> 
   <build> 
      <sourceDirectory>src</sourceDirectory> 
      <plugins> 
         <plugin> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <version>3.5.1</version> 
            <configuration> 
               <source>1.8</source> 
               <target>1.8</target> 
            </configuration> 
         </plugin> 
      </plugins> 
   </build> 
   <dependencies>  
      <dependency> 
         <groupId>org.apache.opennlp</groupId> 
         <artifactId>opennlp-tools</artifactId> 
         <version>1.6.0</version> 
     </dependency> 
     <dependency> 
         <groupId>org.apache.opennlp</groupId> 
         <artifactId>opennlp-uima</artifactId> 
         <version>1.6.0</version> 
      </dependency>      
  </dependencies>  
</project>

Trong chương này, chúng ta sẽ thảo luận về các lớp và phương thức mà chúng ta sẽ sử dụng trong các chương tiếp theo của hướng dẫn này.

Phát hiện câu

Lớp CâuMô hình

Lớp này đại diện cho mô hình được xác định trước được sử dụng để phát hiện các câu trong văn bản thô đã cho. Lớp này thuộc về góiopennlp.tools.sentdetect.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của tệp mô hình dò ​​câu (en-sent.bin).

Lớp QuestionDetectorME

Lớp này thuộc về gói opennlp.tools.sentdetectvà nó chứa các phương thức để tách văn bản thô thành các câu. Lớp này sử dụng mô hình entropy tối đa để đánh giá các ký tự end-ofsentence trong một chuỗi để xác định xem chúng có biểu thị sự kết thúc của một câu hay không.

Sau đây là các phương thức quan trọng của lớp này.

S. không Phương pháp và Mô tả
1

sentDetect()

Phương pháp này được sử dụng để phát hiện các câu trong văn bản thô được chuyển đến nó. Nó chấp nhận một biến Chuỗi làm tham số và trả về một mảng Chuỗi chứa các câu từ văn bản thô đã cho.

2

sentPosDetect()

Phương pháp này được sử dụng để phát hiện vị trí của các câu trong văn bản đã cho. Phương thức này chấp nhận một biến chuỗi, đại diện cho câu và trả về một mảng các đối tượng thuộc kiểuSpan.

Lớp có tên Span sau đó opennlp.tools.util gói được sử dụng để lưu trữ số nguyên bắt đầu và kết thúc của bộ.

3

getSentenceProbabilities()

Phương thức này trả về các xác suất được liên kết với các lệnh gọi gần đây nhất đến sentDetect() phương pháp.

Mã hóa

Lớp TokenizerModel

Lớp này đại diện cho mô hình được xác định trước được sử dụng để mã hóa câu đã cho. Lớp này thuộc về góiopennlp.tools.tokenizer.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của tệp mô hình tokenizer (entoken.bin).

Các lớp học

Để thực hiện mã hóa, thư viện OpenNLP cung cấp ba lớp chính. Tất cả ba lớp đều triển khai giao diện được gọi làTokenizer.

S. không Lớp và Mô tả
1

SimpleTokenizer

Lớp này mã hóa văn bản thô đã cho bằng cách sử dụng các lớp ký tự.

2

WhitespaceTokenizer

Lớp này sử dụng khoảng trắng để mã hóa văn bản đã cho.

3

TokenizerME

Lớp này chuyển đổi văn bản thô thành các mã thông báo riêng biệt. Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

Các lớp này chứa các phương thức sau.

S. không Phương pháp và Mô tả
1

tokenize()

Phương pháp này được sử dụng để mã hóa văn bản thô. Phương thức này chấp nhận một biến Chuỗi làm tham số và trả về một mảng Chuỗi (mã thông báo).

2

sentPosDetect()

Phương pháp này được sử dụng để lấy vị trí hoặc khoảng cách của mã thông báo. Nó chấp nhận câu (hoặc) văn bản thô ở dạng chuỗi và trả về một mảng đối tượng kiểuSpan.

Ngoài hai phương pháp trên, TokenizerME lớp học có getTokenProbabilities() phương pháp.

S. không Phương pháp và Mô tả
1

getTokenProbabilities()

Phương pháp này được sử dụng để nhận xác suất liên quan đến các lệnh gọi gần đây nhất đến tokenizePos() phương pháp.

NameEntityRecognition

Lớp TokenNameFinderModel

Lớp này đại diện cho mô hình được xác định trước được sử dụng để tìm các thực thể được đặt tên trong câu đã cho. Lớp này thuộc về góiopennlp.tools.namefind.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của tệp mô hình công cụ tìm tên (enner-person.bin).

Lớp NameFinderME

Lớp thuộc về gói opennlp.tools.namefindvà nó chứa các phương thức để thực hiện các tác vụ NER. Lớp này sử dụng mô hình entropy tối đa để tìm các thực thể được đặt tên trong văn bản thô đã cho.

S. không Phương pháp và Mô tả
1

find()

Phương pháp này được sử dụng để phát hiện tên trong văn bản thô. Nó chấp nhận một biến Chuỗi đại diện cho văn bản thô như một tham số và trả về một mảng đối tượng kiểu Span.

2

probs()

Phương pháp này được sử dụng để lấy xác suất của chuỗi được giải mã cuối cùng.

Tìm các phần của bài phát biểu

Lớp POSModel

Lớp này đại diện cho mô hình được xác định trước được sử dụng để gắn thẻ các phần lời nói của câu đã cho. Lớp này thuộc về góiopennlp.tools.postag.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của tệp mô hình pos-tagger (enpos-maxent.bin).

Lớp POSTaggerME

Lớp này thuộc về gói opennlp.tools.postagvà nó được sử dụng để dự đoán các phần của bài phát biểu của văn bản thô nhất định. Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

S. không Phương pháp và Mô tả
1

tag()

Phương thức này được sử dụng để gán câu của thẻ POS. Phương thức này chấp nhận một mảng mã thông báo (Chuỗi) làm tham số và trả về một thẻ (mảng).

2

getSentenceProbabilities()

Phương pháp này được sử dụng để lấy xác suất cho mỗi thẻ của câu được gắn thẻ gần đây.

Phân tích cú pháp câu

Lớp ParserModel

Lớp này đại diện cho mô hình được xác định trước được sử dụng để phân tích cú pháp câu đã cho. Lớp này thuộc về góiopennlp.tools.parser.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của tệp mô hình phân tích cú pháp (en-parserchunking.bin).

Lớp nhà máy phân tích cú pháp

Lớp này thuộc về gói opennlp.tools.parser và nó được sử dụng để tạo trình phân tích cú pháp.

S. không Phương pháp và Mô tả
1

create()

Đây là một phương thức tĩnh và nó được sử dụng để tạo một đối tượng phân tích cú pháp. Phương thức này chấp nhận đối tượng Filestream của tệp mô hình phân tích cú pháp.

Lớp ParserTool

Lớp này thuộc về opennlp.tools.cmdline.parser gói và, nó được sử dụng để phân tích nội dung.

S. không Phương pháp và Mô tả
1

parseLine()

Phương pháp này của ParserToollớp được sử dụng để phân tích cú pháp văn bản thô trong OpenNLP. Phương thức này chấp nhận -

  • Một biến Chuỗi đại diện cho văn bản được phân tích cú pháp.
  • Một đối tượng phân tích cú pháp.
  • Một số nguyên đại diện cho phân tích cú pháp no.of sẽ được thực hiện.

Chunking

ChunkerModel class

Lớp này đại diện cho mô hình được xác định trước được sử dụng để chia một câu thành các phần nhỏ hơn. Lớp này thuộc về góiopennlp.tools.chunker.

Hàm tạo của lớp này chấp nhận một InputStream đối tượng của chunker tệp mô hình (enchunker.bin).

Lớp ChunkerME

Lớp này thuộc về gói có tên opennlp.tools.chunker và nó được sử dụng để chia câu đã cho thành nhiều phần nhỏ hơn.

S. không Phương pháp và Mô tả
1

chunk()

Phương pháp này được sử dụng để chia câu đã cho thành nhiều phần nhỏ hơn. Nó chấp nhận mã thông báo của một câu vàPnghệ thuật Of Sthẻ peech làm thông số.

2

probs()

Phương thức này trả về xác suất của dãy được giải mã cuối cùng.

Trong khi xử lý một ngôn ngữ tự nhiên, việc quyết định phần đầu và phần cuối của câu là một trong những vấn đề cần giải quyết. Quá trình này được gọi làSsự dụ dỗ Boundary Disambiguation (SBD) hoặc đơn giản là ngắt câu.

Các kỹ thuật chúng tôi sử dụng để phát hiện các câu trong văn bản đã cho, phụ thuộc vào ngôn ngữ của văn bản.

Phát hiện câu bằng Java

Chúng ta có thể phát hiện các câu trong văn bản đã cho bằng Java bằng cách sử dụng Biểu thức chính quy và một tập hợp các quy tắc đơn giản.

Ví dụ: giả sử một dấu chấm, dấu chấm hỏi hoặc dấu chấm than kết thúc một câu trong văn bản đã cho, sau đó chúng ta có thể tách câu bằng cách sử dụng split() phương pháp của Stringlớp học. Ở đây, chúng ta phải chuyển một biểu thức chính quy ở định dạng Chuỗi.

Sau đây là chương trình xác định các câu trong một văn bản nhất định bằng cách sử dụng các biểu thức chính quy Java (split method). Lưu chương trình này trong một tệp có tênSentenceDetection_RE.java.

public class SentenceDetection_RE {  
   public static void main(String args[]){ 
     
      String sentence = " Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
     
      String simple = "[.?!]";      
      String[] splitString = (sentence.split(simple));     
      for (String string : splitString)   
         System.out.println(string);      
   } 
}

Biên dịch và thực thi tệp java đã lưu từ dấu nhắc lệnh bằng các lệnh sau.

javac SentenceDetection_RE.java 
java SentenceDetection_RE

Khi thực thi, chương trình trên sẽ tạo một tài liệu PDF hiển thị thông báo sau.

Hi 
How are you 
Welcome to Tutorialspoint 
We provide free tutorials on various technologies

Phát hiện câu bằng OpenNLP

Để phát hiện các câu, OpenNLP sử dụng một mô hình được xác định trước, một tệp có tên en-sent.bin. Mô hình xác định trước này được đào tạo để phát hiện các câu trong một văn bản thô nhất định.

Các opennlp.tools.sentdetect gói chứa các lớp và giao diện được sử dụng để thực hiện nhiệm vụ phát hiện câu.

Để phát hiện một câu bằng thư viện OpenNLP, bạn cần phải -

  • Tải en-sent.bin mô hình sử dụng SentenceModel lớp học

  • Khởi tạo SentenceDetectorME lớp học.

  • Phát hiện các câu bằng cách sử dụng sentDetect() phương thức của lớp này.

Sau đây là các bước cần làm để viết một chương trình phát hiện các câu từ văn bản thô đã cho.

Bước 1: Tải mô hình

Mô hình phát hiện câu được đại diện bởi lớp có tên SentenceModel, thuộc về gói opennlp.tools.sentdetect.

Để tải một mô hình phát hiện câu -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo SentenceModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó như được hiển thị trong khối mã sau:

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Bước 2: Khởi tạo lớp QuestionDetectorME

Các SentenceDetectorME lớp của gói opennlp.tools.sentdetectchứa các phương thức để tách văn bản thô thành các câu. Lớp này sử dụng mô hình Maximum Entropy để đánh giá các ký tự cuối câu trong một chuỗi để xác định xem chúng có biểu thị sự kết thúc của một câu hay không.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước, như hình dưới đây.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Bước 3: Phát hiện câu

Các sentDetect() phương pháp của SentenceDetectorMElớp được sử dụng để phát hiện các câu trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này.

//Detecting the sentence 
String sentences[] = detector.sentDetect(sentence);

Example

Sau đây là chương trình phát hiện các câu trong một văn bản thô nhất định. Lưu chương trình này trong một tệp có tênSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionME { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
    
      //Detecting the sentence
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);  
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SentenceDetectorME.java 
java SentenceDetectorME

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu trong đó và hiển thị kết quả sau.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Phát hiện vị trí của câu

Chúng tôi cũng có thể phát hiện vị trí của các câu bằng cách sử dụng phương thức sentPosDetect () của SentenceDetectorME class.

Sau đây là các bước cần làm để viết một chương trình phát hiện vị trí của các câu từ văn bản thô đã cho.

Bước 1: Tải mô hình

Mô hình phát hiện câu được đại diện bởi lớp có tên SentenceModel, thuộc về gói opennlp.tools.sentdetect.

Để tải một mô hình phát hiện câu -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo SentenceModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau.

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Bước 2: Khởi tạo lớp QuestionDetectorME

Các SentenceDetectorME lớp của gói opennlp.tools.sentdetectchứa các phương thức để tách văn bản thô thành các câu. Lớp này sử dụng mô hình Maximum Entropy để đánh giá các ký tự cuối câu trong một chuỗi để xác định xem chúng có biểu thị sự kết thúc của một câu hay không.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Bước 3: Phát hiện vị trí của câu

Các sentPosDetect() phương pháp của SentenceDetectorMElớp được sử dụng để phát hiện vị trí của các câu trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu làm tham số cho phương thức này.

//Detecting the position of the sentences in the paragraph  
Span[] spans = detector.sentPosDetect(sentence);

Bước 4: In các nhịp của câu

Các sentPosDetect() phương pháp của SentenceDetectorME lớp trả về một mảng các đối tượng kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ số nguyên bắt đầu và kết thúc của bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi sentPosDetect() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

Example

Sau đây là chương trình phát hiện các câu trong văn bản thô nhất định. Lưu chương trình này trong một tệp có tênSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
  
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span;

public class SentencePosDetection { 
  
   public static void main(String args[]) throws Exception { 
   
      String paragraph = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the raw text 
      Span spans[] = detector.sentPosDetect(paragraph); 
       
      //Printing the spans of the sentences in the paragraph 
      for (Span span : spans)         
         System.out.println(span);  
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SentencePosDetection.java 
java SentencePosDetection

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu trong đó và hiển thị kết quả sau.

[0..16) 
[17..43) 
[44..93)

Câu cùng với vị trí của họ

Các substring() phương thức của lớp String chấp nhận beginend offsetsvà trả về chuỗi tương ứng. Chúng ta có thể sử dụng phương pháp này để in các câu và khoảng cách (vị trí) của chúng với nhau, như được hiển thị trong khối mã sau.

for (Span span : spans)         
   System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);

Sau đây là chương trình để phát hiện các câu từ văn bản thô đã cho và hiển thị chúng cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênSentencesAndPosDetection.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span; 
   
public class SentencesAndPosDetection { 
  
   public static void main(String args[]) throws Exception { 
     
      String sen = "Hi. How are you? Welcome to Tutorialspoint." 
         + " We provide free tutorials on various technologies"; 
      //Loading a sentence model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the paragraph  
      Span[] spans = detector.sentPosDetect(sen);  
      
      //Printing the sentences and their spans of a paragraph 
      for (Span span : spans)         
         System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);  
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu cùng với vị trí của chúng và hiển thị kết quả sau.

Hi. How are you? [0..16) 
Welcome to Tutorialspoint. [17..43)  
We provide free tutorials on various technologies [44..93)

Phát hiện xác suất câu

Các getSentenceProbabilities() phương pháp của SentenceDetectorME lớp trả về các xác suất được liên kết với các cuộc gọi gần đây nhất đến phương thức sentDetect ().

//Getting the probabilities of the last decoded sequence       
double[] probs = detector.getSentenceProbabilities();

Sau đây là chương trình để in các xác suất được liên kết với các cuộc gọi đến phương thức sentDetect (). Lưu chương trình này trong một tệp có tênSentenceDetectionMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionMEProbs { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class
      SentenceDetectorME detector = new SentenceDetectorME(model);  
      
      //Detecting the sentence 
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);   
         
      //Getting the probabilities of the last decoded sequence       
      double[] probs = detector.getSentenceProbabilities(); 
       
      System.out.println("  "); 
       
      for(int i = 0; i<probs.length; i++) 
         System.out.println(probs[i]); 
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu và in ra. Ngoài ra, nó cũng trả về các xác suất được liên kết với các cuộc gọi gần đây nhất đến phương thức sentDetect (), như được hiển thị bên dưới.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies 
   
0.9240246995179983 
0.9957680129995953 
1.0

Quá trình cắt câu đã cho thành các phần nhỏ hơn (mã thông báo) được gọi là tokenization. Nói chung, văn bản thô nhất định được mã hóa dựa trên một tập hợp các dấu phân cách (chủ yếu là khoảng trắng).

Tokenization được sử dụng trong các tác vụ như kiểm tra chính tả, xử lý tìm kiếm, xác định các phần của giọng nói, phát hiện câu, phân loại tài liệu của tài liệu, v.v.

Mã hóa bằng OpenNLP

Các opennlp.tools.tokenize gói chứa các lớp và giao diện được sử dụng để thực hiện mã hóa.

Để mã hóa các câu đã cho thành các đoạn đơn giản hơn, thư viện OpenNLP cung cấp ba lớp khác nhau:

  • SimpleTokenizer - Lớp này mã hóa văn bản thô đã cho bằng cách sử dụng các lớp ký tự.

  • WhitespaceTokenizer - Lớp này sử dụng khoảng trắng để mã hóa văn bản đã cho.

  • TokenizerME- Lớp này chuyển đổi văn bản thô thành các mã thông báo riêng biệt. Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

SimpleTokenizer

Để mã hóa một câu bằng cách sử dụng SimpleTokenizer lớp học, bạn cần phải -

  • Tạo một đối tượng của lớp tương ứng.

  • Mã hóa câu bằng cách sử dụng tokenize() phương pháp.

  • In mã thông báo.

Sau đây là các bước cần thực hiện để viết một chương trình mã hóa văn bản thô đã cho.

Step 1 - Khởi tạo lớp tương ứng

Trong cả hai lớp, không có hàm tạo nào có sẵn để khởi tạo chúng. Do đó, chúng ta cần tạo các đối tượng của các lớp này bằng cách sử dụng biến tĩnhINSTANCE.

SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;

Step 2 - Mã hóa các câu

Cả hai lớp này đều chứa một phương thức được gọi là tokenize(). Phương thức này chấp nhận một văn bản thô ở định dạng Chuỗi. Khi gọi, nó mã hóa Chuỗi đã cho và trả về một mảng Chuỗi (mã thông báo).

Mã hóa câu bằng cách sử dụng tokenizer() như hình dưới đây.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - In mã thông báo

Sau khi mã hóa câu, bạn có thể in mã thông báo bằng cách sử dụng for loop, như hình dưới đây.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

Sau đây là chương trình mã hóa câu đã cho bằng cách sử dụng lớp SimpleTokenizer. Lưu chương trình này trong một tệp có tênSimpleTokenizerExample.java.

import opennlp.tools.tokenize.SimpleTokenizer;  
public class SimpleTokenizerExample { 
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Tokenizing the given sentence 
      String tokens[] = simpleTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens) {         
         System.out.println(token);  
      }       
   }  
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SimpleTokenizerExample.java 
java SimpleTokenizerExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologies

WhitespaceTokenizer

Để mã hóa một câu bằng cách sử dụng WhitespaceTokenizer lớp học, bạn cần phải -

  • Tạo một đối tượng của lớp tương ứng.

  • Mã hóa câu bằng cách sử dụng tokenize() phương pháp.

  • In mã thông báo.

Sau đây là các bước cần thực hiện để viết một chương trình mã hóa văn bản thô đã cho.

Step 1 - Khởi tạo lớp tương ứng

Trong cả hai lớp, không có hàm tạo nào có sẵn để khởi tạo chúng. Do đó, chúng ta cần tạo các đối tượng của các lớp này bằng cách sử dụng biến tĩnhINSTANCE.

WhitespaceTokenizer tokenizer = WhitespaceTokenizer.INSTANCE;

Step 2 - Mã hóa các câu

Cả hai lớp này đều chứa một phương thức được gọi là tokenize(). Phương thức này chấp nhận một văn bản thô ở định dạng Chuỗi. Khi gọi, nó mã hóa Chuỗi đã cho và trả về một mảng Chuỗi (mã thông báo).

Mã hóa câu bằng cách sử dụng tokenizer() như hình dưới đây.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - In mã thông báo

Sau khi mã hóa câu, bạn có thể in mã thông báo bằng cách sử dụng for loop, như hình dưới đây.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

Sau đây là chương trình mã hóa câu đã cho bằng cách sử dụng WhitespaceTokenizerlớp học. Lưu chương trình này trong một tệp có tênWhitespaceTokenizerExample.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class WhitespaceTokenizerExample {  
   
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating whitespaceTokenizer class 
       WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Tokenizing the given paragraph 
      String tokens[] = whitespaceTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens)     
         System.out.println(token);        
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac WhitespaceTokenizerExample.java 
java WhitespaceTokenizerExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị kết quả sau.

Hi. 
How 
are 
you? 
Welcome 
to 
Tutorialspoint. 
We 
provide 
free 
tutorials 
on 
various 
technologies

Lớp TokenizerME

OpenNLP cũng sử dụng một mô hình được xác định trước, một tệp có tên de-token.bin, để mã hóa các câu. Nó được đào tạo để mã hóa các câu trong một văn bản thô nhất định.

Các TokenizerME lớp của opennlp.tools.tokenizergói được sử dụng để tải mô hình này và mã hóa văn bản thô đã cho bằng thư viện OpenNLP. Để làm như vậy, bạn cần phải -

  • Tải en-token.bin mô hình sử dụng TokenizerModel lớp học.

  • Khởi tạo TokenizerME lớp học.

  • Mã hóa các câu bằng cách sử dụng tokenize() phương thức của lớp này.

Sau đây là các bước cần thực hiện để viết một chương trình mã hóa các câu từ văn bản thô đã cho bằng cách sử dụng TokenizerME lớp học.

Step 1 - Đang tải mô hình

Mô hình mã hóa được đại diện bởi lớp có tên TokenizerModel, thuộc về gói opennlp.tools.tokenize.

Để tải một mô hình tokenizer -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo TokenizerModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau.

//Loading the Tokenizer model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
TokenizerModel tokenModel = new TokenizerModel(inputStream);

Step 2 - Khởi tạo lớp TokenizerME

Các TokenizerME lớp của gói opennlp.tools.tokenizechứa các phương thức để cắt văn bản thô thành các phần nhỏ hơn (mã thông báo). Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước như hình dưới đây.

//Instantiating the TokenizerME class 
TokenizerME tokenizer = new TokenizerME(tokenModel);

Step 3 - Mã hóa câu

Các tokenize() phương pháp của TokenizerMElớp được sử dụng để mã hóa văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số và trả về một mảng Chuỗi (mã thông báo).

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này, như sau.

//Tokenizing the given raw text 
String tokens[] = tokenizer.tokenize(paragraph);

Example

Sau đây là chương trình mã hóa văn bản thô đã cho. Lưu chương trình này trong một tệp có tênTokenizerMEExample.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel;  

public class TokenizerMEExample { 
  
   public static void main(String args[]) throws Exception{     
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
            + "We provide free tutorials on various technologies"; 
       
      //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); 
       
      //Tokenizing the given raw text 
      String tokens[] = tokenizer.tokenize(sentence);       
          
      //Printing the tokens  
      for (String a : tokens) 
         System.out.println(a); 
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMEExample.java 
java TokenizerMEExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu trong đó và hiển thị kết quả sau:

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologie

Lấy vị trí của các mã thông báo

Chúng tôi cũng có thể nhận được các vị trí hoặc spans của các mã thông báo bằng cách sử dụng tokenizePos()phương pháp. Đây là phương thức của giao diện Tokenizer của góiopennlp.tools.tokenize. Vì tất cả (ba) lớp Tokenizer đều triển khai giao diện này, bạn có thể tìm thấy phương thức này trong tất cả chúng.

Phương thức này chấp nhận câu hoặc văn bản thô ở dạng một chuỗi và trả về một mảng đối tượng kiểu Span.

Bạn có thể nhận vị trí của các mã thông báo bằng cách sử dụng tokenizePos() phương pháp, như sau:

//Retrieving the tokens 
tokenizer.tokenizePos(sentence);

In các vị trí (nhịp)

Lớp có tên Span sau đó opennlp.tools.util gói được sử dụng để lưu trữ số nguyên bắt đầu và kết thúc của bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi tokenizePos() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

//Retrieving the tokens 
Span[] tokens = tokenizer.tokenizePos(sentence);
//Printing the spans of tokens 
for( Span token : tokens)        
   System.out.println(token);

In mã thông báo và vị trí của chúng cùng nhau

Các substring() phương thức của lớp String chấp nhận beginendbù trừ và trả về chuỗi tương ứng. Chúng ta có thể sử dụng phương pháp này để in các mã thông báo và khoảng cách (vị trí) của chúng với nhau, như được hiển thị trong khối mã sau.

//Printing the spans of tokens 
for(Span token : tokens)  
   System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));

Example(SimpleTokenizer)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng SimpleTokenizerlớp học. Nó cũng in các mã thông báo cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênSimpleTokenizerSpans.java.

import opennlp.tools.tokenize.SimpleTokenizer; 
import opennlp.tools.util.Span;  

public class SimpleTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Retrieving the boundaries of the tokens 
      Span[] tokens = simpleTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens)
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));          
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac SimpleTokenizerSpans.java 
java SimpleTokenizerSpans

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

[0..2) Hi 
[2..3) . 
[4..7) How 
[8..11) are 
[12..15) you 
[15..16) ? 
[17..24) Welcome 
[25..27) to 
[28..42) Tutorialspoint 
[42..43) . 
[44..46) We 
[47..54) provide 
[55..59) free 
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (WhitespaceTokenizer)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng WhitespaceTokenizerlớp học. Nó cũng in các mã thông báo cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênWhitespaceTokenizerSpans.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span; 
public class WhitespaceTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Retrieving the tokens 
      Span[] tokens = whitespaceTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens) 
         System.out.println(token +" 
            "+sent.substring(token.getStart(), token.getEnd()));        
   } 
}

Biên dịch và thực thi tệp java đã lưu từ dấu nhắc lệnh bằng các lệnh sau

javac WhitespaceTokenizerSpans.java 
java WhitespaceTokenizerSpans

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị kết quả sau.

[0..3) Hi. 
[4..7) How 
[8..11) are 
[12..16) you? 
[17..24) Welcome 
[25..27) to 
[28..43) Tutorialspoint. 
[44..46) We 
[47..54) provide 
[55..59) free
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (TokenizerME)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng TokenizerMElớp học. Nó cũng in các mã thông báo cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênTokenizerMESpans.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 TokenizerMESpans { 
   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); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMESpans.java 
java TokenizerMESpans

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint

Xác suất Tokenizer

Phương thức getTokenProbabilities () của lớp TokenizerME được sử dụng để lấy các xác suất liên quan đến các cuộc gọi gần đây nhất đến phương thức tokenizePos ().

//Getting the probabilities of the recent calls to tokenizePos() method 
double[] probs = detector.getSentenceProbabilities();

Sau đây là chương trình để in các xác suất liên quan đến các lệnh gọi đến phương thức tokenizePos (). Lưu chương trình này trong một tệp có tênTokenizerMEProbs.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]);          
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho và mã hóa các câu và in ra. Ngoài ra, nó cũng trả về các xác suất được liên kết với các cuộc gọi gần đây nhất đến phương thức tokenizerPos ().

[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

Quá trình tìm kiếm tên, người, địa điểm và các thực thể khác từ một văn bản nhất định được gọi là Named Entity Rđánh giá sinh thái (NER). Trong chương này, chúng ta sẽ thảo luận về cách thực hiện NER thông qua chương trình Java sử dụng thư viện OpenNLP.

Nhận dạng đối tượng được đặt tên bằng NLP mở

Để thực hiện các tác vụ NER khác nhau, OpenNLP sử dụng các mô hình được xác định trước khác nhau như en-nerdate.bn, en-ner-location.bin, en-ner-Organization.bin, en-ner-person.bin và en-ner-time. thùng rác. Tất cả các tệp này là các mô hình được xác định trước được đào tạo để phát hiện các thực thể tương ứng trong một văn bản thô nhất định.

Các opennlp.tools.namefindgói chứa các lớp và giao diện được sử dụng để thực hiện tác vụ NER. Để thực hiện tác vụ NER bằng thư viện OpenNLP, bạn cần -

  • Tải mô hình tương ứng bằng cách sử dụng TokenNameFinderModel lớp học.

  • Khởi tạo NameFinder lớp học.

  • Tìm tên và in chúng.

Sau đây là các bước cần làm để viết một chương trình phát hiện các thực thể tên từ một văn bản thô nhất định.

Bước 1: Tải mô hình

Mô hình phát hiện câu được đại diện bởi lớp có tên TokenNameFinderModel, thuộc về gói opennlp.tools.namefind.

Để tải một mô hình NER -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình NER thích hợp ở định dạng Chuỗi tới phương thức khởi tạo của nó).

  • Khởi tạo TokenNameFinderModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau.

//Loading the NER-person model 
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");       
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);

Bước 2: Khởi tạo lớp NameFinderME

Các NameFinderME lớp của gói opennlp.tools.namefindchứa các phương thức để thực hiện các tác vụ NER. Lớp này sử dụng mô hình Maximum Entropy để tìm các thực thể được đặt tên trong văn bản thô đã cho.

Khởi tạo lớp này và chuyển đối tượng mô hình được tạo ở bước trước như hình dưới đây:

//Instantiating the NameFinderME class 
NameFinderME nameFinder = new NameFinderME(model);

Bước 3: Tìm tên trong câu

Các find() phương pháp của NameFinderMElớp được sử dụng để phát hiện tên trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này.

//Finding the names in the sentence 
Span nameSpans[] = nameFinder.find(sentence);

Bước 4: In các nhịp của tên trong câu

Các find() phương pháp của NameFinderMElớp trả về một mảng các đối tượng kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ startend số nguyên của các bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi find() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

NER Example

Sau đây là chương trình đọc câu đã cho và nhận ra các khoảng tên của những người trong đó. Lưu chương trình này trong một tệp có tênNameFinderME_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());    
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac NameFinderME_Example.java 
java NameFinderME_Example

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các khoảng), như được hiển thị bên dưới.

[0..1) person 
[2..3) person

Tên cùng với vị trí của họ

Các substring() phương thức của lớp String chấp nhận beginend offsetsvà trả về chuỗi tương ứng. Chúng ta có thể sử dụng phương pháp này để in tên và khoảng cách (vị trí) của chúng với nhau, như được hiển thị trong khối mã sau.

for(Span s: nameSpans)        
   System.out.println(s.toString()+"  "+tokens[s.getStart()]);

Sau đây là chương trình để phát hiện các tên từ văn bản thô đã cho và hiển thị chúng cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênNameFinderSentences.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()]);      
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac NameFinderSentences.java 
java NameFinderSentences

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các nhịp) như hình dưới đây.

[0..1) person  Mike

Tìm tên của vị trí

Bằng cách tải các mô hình khác nhau, bạn có thể phát hiện các thực thể được đặt tên khác nhau. Sau đây là một chương trình Java tảien-ner-location.binmô hình và phát hiện tên vị trí trong câu đã cho. Lưu chương trình này trong một tệp có tênLocationFinder.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()]); 
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac LocationFinder.java 
java LocationFinder

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các khoảng), như được hiển thị bên dưới.

[4..5) location  Hyderabad

Xác suất công cụ tìm tên

Các probs()phương pháp của NameFinderME lớp được sử dụng để lấy xác suất của chuỗi được giải mã cuối cùng.

double[] probs = nameFinder.probs();

Sau đây là chương trình để in các xác suất. Lưu chương trình này trong một tệp có tênTokenizerMEProbs.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]);          
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho, mã hóa các câu và in ra. Ngoài ra, nó cũng trả về xác suất của chuỗi được giải mã cuối cùng, như được hiển thị bên dưới.

[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

Sử dụng OpenNLP, bạn cũng có thể phát hiện các Phần của Bài phát biểu của một câu nhất định và in chúng. Thay vì tên đầy đủ của các phần của bài phát biểu, OpenNLP sử dụng các dạng ngắn của từng phần của bài phát biểu. Bảng sau đây chỉ ra các phần khác nhau của bài phát biểu được OpenNLP phát hiện và ý nghĩa của chúng.

Các phần của bài phát biểu Ý nghĩa của các phần của bài phát biểu
NN Danh từ, số ít hoặc số lượng
DT Người xác định
VB Động từ, dạng cơ sở
VBD Động từ, thì quá khứ
VBZ Động từ, ngôi thứ ba thì hiện tại số ít
TRONG Chuẩn bị hoặc kết hợp phụ
NNP Danh từ riêng, số ít
ĐẾN đến
JJ Tính từ

Gắn thẻ các phần của bài phát biểu

Để gắn thẻ các phần lời nói của một câu, OpenNLP sử dụng một mô hình, một tệp có tên en-posmaxent.bin. Đây là một mô hình được xác định trước được đào tạo để gắn thẻ các phần lời nói của văn bản thô nhất định.

Các POSTaggerME lớp của opennlp.tools.postaggói được sử dụng để tải mô hình này và gắn thẻ các phần lời nói của văn bản thô đã cho bằng thư viện OpenNLP. Để làm như vậy, bạn cần phải -

  • Tải en-pos-maxent.bin mô hình sử dụng POSModel lớp học.

  • Khởi tạo POSTaggerME lớp học.

  • Mã hóa câu.

  • Tạo các thẻ bằng cách sử dụng tag() phương pháp.

  • In mã thông báo và thẻ bằng cách sử dụng POSSample lớp học.

Sau đây là các bước cần thực hiện để viết một chương trình gắn thẻ các phần của bài phát biểu trong văn bản thô đã cho bằng cách sử dụng POSTaggerME lớp học.

Bước 1: Tải mô hình

Mô hình gắn thẻ POS được đại diện bởi lớp có tên POSModel, thuộc về gói opennlp.tools.postag.

Để tải một mô hình tokenizer -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo POSModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau:

//Loading Parts of speech-maxent model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
POSModel model = new POSModel(inputStream);

Bước 2: Khởi tạo lớp POSTaggerME

Các POSTaggerME lớp của gói opennlp.tools.postagđược sử dụng để dự đoán các phần của bài phát biểu của văn bản thô đã cho. Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước, như được hiển thị bên dưới:

//Instantiating POSTaggerME class 
POSTaggerME tagger = new POSTaggerME(model);

Bước 3: Mã hóa câu

Các tokenize() phương pháp của whitespaceTokenizerlớp được sử dụng để mã hóa văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số và trả về một mảng Chuỗi (mã thông báo).

Khởi tạo whitespaceTokenizer lớp và gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này.

//Tokenizing the sentence using WhitespaceTokenizer class  
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

Bước 4: Tạo thẻ

Các tag() phương pháp của whitespaceTokenizerlớp gán thẻ POS cho câu mã thông báo. Phương thức này nhận một mảng mã thông báo (Chuỗi) làm tham số và trả về thẻ (mảng).

Gọi tag() bằng cách chuyển các mã thông báo được tạo ở bước trước cho nó.

//Generating tags 
String[] tags = tagger.tag(tokens);

Bước 5: In mã thông báo và thẻ

Các POSSamplelớp đại diện cho câu được gắn thẻ POS. Để khởi tạo lớp này, chúng tôi sẽ yêu cầu một mảng mã thông báo (của văn bản) và một mảng thẻ.

Các toString()phương thức của lớp này trả về câu được gắn thẻ. Khởi tạo lớp này bằng cách chuyển mã thông báo và các mảng thẻ được tạo ở các bước trước đó và gọitoString() , như được hiển thị trong khối mã sau đây.

//Instantiating the POSSample class 
POSSample sample = new POSSample(tokens, tags); 
System.out.println(sample.toString());

Example

Sau đây là chương trình gắn thẻ các phần của bài phát biểu trong một văn bản thô nhất định. Lưu chương trình này trong một tệp có tênPosTaggerExample.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTaggerExample { 
  
   public static void main(String args[]) throws Exception{ 
    
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
       
      String sentence = "Hi welcome to Tutorialspoint"; 
       
      //Tokenizing the sentence using WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags 
      String[] tags = tagger.tag(tokens);
      
      //Instantiating the POSSample class 
      POSSample sample = new POSSample(tokens, tags); 
      System.out.println(sample.toString()); 
   
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac PosTaggerExample.java 
java PosTaggerExample

Khi thực thi, chương trình trên đọc văn bản đã cho và phát hiện các phần lời nói của những câu này và hiển thị chúng, như được hiển thị bên dưới.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB

Hiệu suất trình gắn thẻ POS

Sau đây là chương trình gắn thẻ các phần của bài phát biểu của một văn bản thô nhất định. Nó cũng theo dõi hiệu suất và hiển thị hiệu suất của trình gắn thẻ. Lưu chương trình này trong một tệp có tênPosTagger_Performance.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.cmdline.PerformanceMonitor; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTagger_Performance { 
   public static void main(String args[]) throws Exception{ 
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Creating an object of WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint"; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
       
      //Generating tags 
      String[] tags = tagger.tag(tokens); 
       
      //Instantiating POSSample class       
      POSSample sample = new POSSample(tokens, tags); 
      System.out.println(sample.toString()); 
       
      //Monitoring the performance of POS tagger 
      PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent"); 
      perfMon.start(); 
      perfMon.incrementCounter(); 
      perfMon.stopAndPrintFinalResult();      
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac PosTaggerExample.java 
java PosTaggerExample

Khi thực thi, chương trình trên đọc văn bản đã cho và gắn thẻ các phần lời nói của những câu này và hiển thị chúng. Ngoài ra, nó cũng theo dõi hiệu suất của máy gắn thẻ POS và hiển thị nó.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB  
Average: 0.0 sent/s  
Total: 1 sent 
Runtime: 0.0s

Xác suất người gắn thẻ POS

Các probs() phương pháp của POSTaggerME lớp được sử dụng để tìm xác suất cho mỗi thẻ của câu được gắn thẻ gần đây.

//Getting the probabilities of the recent calls to tokenizePos() method 
double[] probs = detector.getSentenceProbabilities();

Sau đây là chương trình hiển thị xác suất cho mỗi thẻ của câu được gắn thẻ cuối cùng. Lưu chương trình này trong một tệp có tênPosTaggerProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTaggerProbs { 
   
   public static void main(String args[]) throws Exception{ 
      
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new FileInputStream("C:/OpenNLP_mdl/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Creating an object of WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
       
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint"; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
             
      //Generating tags 
      String[] tags = tagger.tag(tokens);       
      
      //Instantiating the POSSample class 
      POSSample sample = new POSSample(tokens, tags);  
      System.out.println(sample.toString());
      
      //Probabilities for each tag of the last tagged sentence. 
      double [] probs = tagger.probs();       
      System.out.println("  ");       
      
      //Printing the probabilities  
      for(int i = 0; i<probs.length; i++) 
         System.out.println(probs[i]); 
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Khi thực thi, chương trình trên đọc văn bản thô đã cho, gắn thẻ các phần của bài phát biểu của mỗi mã thông báo trong đó và hiển thị chúng. Ngoài ra, nó cũng hiển thị xác suất cho từng phần của bài phát biểu trong câu đã cho, như hình dưới đây.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB    
0.6416834779738033 
0.42983612874819177 
0.8584513635863117 
0.4394784478206072

Sử dụng API OpenNLP, bạn có thể phân tích cú pháp các câu đã cho. Trong chương này, chúng ta sẽ thảo luận về cách phân tích cú pháp văn bản thô bằng API OpenNLP.

Phân tích cú pháp Văn bản thô bằng Thư viện OpenNLP

Để phát hiện các câu, OpenNLP sử dụng một mô hình được xác định trước, một tệp có tên en-parserchunking.bin. Đây là một mô hình được xác định trước được đào tạo để phân tích cú pháp văn bản thô đã cho.

Các Parser lớp của opennlp.tools.Parser gói được sử dụng để chứa các thành phần phân tích cú pháp và ParserTool lớp của opennlp.tools.cmdline.parser gói được sử dụng để phân tích nội dung.

Sau đây là các bước cần làm để viết một chương trình phân tích cú pháp văn bản thô đã cho bằng cách sử dụng ParserTool lớp học.

Bước 1: Tải mô hình

Mô hình phân tích cú pháp văn bản được đại diện bởi lớp có tên ParserModel, thuộc về gói opennlp.tools.parser.

Để tải một mô hình tokenizer -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo ParserModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau.

//Loading parser model 
InputStream inputStream = new FileInputStream(".../en-parserchunking.bin"); 
ParserModel model = new ParserModel(inputStream);

Bước 2: Tạo một đối tượng của lớp Parser

Các Parser lớp của gói opennlp.tools.parserđại diện cho một cấu trúc dữ liệu để chứa các thành phần phân tích cú pháp. Bạn có thể tạo một đối tượng của lớp này bằng cách sử dụng tĩnhcreate() phương pháp của ParserFactory lớp học.

Gọi create() phương pháp của ParserFactory bằng cách chuyển đối tượng mô hình được tạo ở bước trước, như hình dưới đây -

//Creating a parser Parser parser = ParserFactory.create(model);

Bước 3: Phân tích cú pháp câu

Các parseLine() phương pháp của ParserToollớp được sử dụng để phân tích cú pháp văn bản thô trong OpenNLP. Phương thức này chấp nhận -

  • một biến chuỗi đại diện cho văn bản được phân tích cú pháp.

  • một đối tượng phân tích cú pháp.

  • một số nguyên đại diện cho số lượng phân tích cú pháp được thực hiện.

Gọi phương thức này bằng cách chuyển cho câu các tham số sau: đối tượng phân tích cú pháp được tạo ở các bước trước đó và một số nguyên đại diện cho số lượng phân tích cú pháp cần thiết được thực hiện.

//Parsing the sentence 
String sentence = "Tutorialspoint is the largest tutorial library.";       
Parse topParses[] = ParserTool.parseLine(sentence, parser, 1);

Example

Sau đây là chương trình phân tích văn bản thô đã cho. Lưu chương trình này trong một tệp có tênParserExample.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.cmdline.parser.ParserTool; 
import opennlp.tools.parser.Parse; 
import opennlp.tools.parser.Parser; 
import opennlp.tools.parser.ParserFactory; 
import opennlp.tools.parser.ParserModel;  

public class ParserExample { 
   
   public static void main(String args[]) throws Exception{  
      //Loading parser model 
      InputStream inputStream = new FileInputStream(".../en-parserchunking.bin"); 
      ParserModel model = new ParserModel(inputStream); 
       
      //Creating a parser 
      Parser parser = ParserFactory.create(model); 
      
      //Parsing the sentence 
      String sentence = "Tutorialspoint is the largest tutorial library.";
      Parse topParses[] = ParserTool.parseLine(sentence, parser, 1); 
    
      for (Parse p : topParses) 
         p.show();          
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac ParserExample.java 
java ParserExample

Khi thực thi, chương trình trên đọc văn bản thô đã cho, phân tích cú pháp nó và hiển thị đầu ra sau:

(TOP (S (NP (NN Tutorialspoint)) (VP (VBZ is) (NP (DT the) (JJS largest) (NN
   tutorial) (NN library.)))))

Chunking một câu đề cập đến việc phá vỡ / chia một câu thành các phần của từ như nhóm từ và nhóm động từ.

Chunking một câu bằng OpenNLP

Để phát hiện các câu, OpenNLP sử dụng một mô hình, một tệp có tên en-chunker.bin. Đây là một mô hình được xác định trước, được đào tạo để chia nhỏ các câu trong văn bản thô nhất định.

Các opennlp.tools.chunker gói chứa các lớp và giao diện được sử dụng để tìm chú thích cú pháp không đệ quy, chẳng hạn như các khối cụm danh từ.

Bạn có thể phân đoạn một câu bằng phương pháp chunk() sau đó ChunkerMElớp học. Phương pháp này chấp nhận mã thông báo của một câu và thẻ POS làm tham số. Do đó, trước khi bắt đầu quá trình phân khúc, trước hết bạn cần Tokenize câu đó và tạo các thẻ POS các phần của nó.

Để phân đoạn một câu bằng thư viện OpenNLP, bạn cần phải -

  • Mã hóa câu.

  • Tạo thẻ POS cho nó.

  • Tải en-chunker.bin mô hình sử dụng ChunkerModel lớp học

  • Khởi tạo ChunkerME lớp học.

  • Chunk các câu bằng cách sử dụng chunk() phương thức của lớp này.

Sau đây là các bước cần làm để viết một chương trình phân đoạn các câu từ văn bản thô đã cho.

Bước 1: Mã hóa câu

Mã hóa các câu bằng cách sử dụng tokenize() phương pháp của whitespaceTokenizer lớp, như được hiển thị trong khối mã sau đây.

//Tokenizing the sentence 
String sentence = "Hi welcome to Tutorialspoint";       
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

Bước 2: Tạo thẻ POS

Tạo các thẻ POS của câu bằng cách sử dụng tag() phương pháp của POSTaggerME lớp, như được hiển thị trong khối mã sau đây.

//Generating the POS tags 
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
POSModel model = new POSModelLoader().load(file);     
//Constructing the tagger 
POSTaggerME tagger = new POSTaggerME(model);        
//Generating tags from the tokens 
String[] tags = tagger.tag(tokens);

Bước 3: Tải mô hình

Mô hình phân đoạn một câu được đại diện bởi lớp có tên ChunkerModel, thuộc về gói opennlp.tools.chunker.

Để tải một mô hình phát hiện câu -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo ChunkerModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau:

//Loading the chunker model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
ChunkerModel chunkerModel = new ChunkerModel(inputStream);

Bước 4: Khởi tạo lớp chunkerME

Các chunkerME lớp của gói opennlp.tools.chunkerchứa các phương thức để phân đoạn các câu. Đây là một khối dựa trên entropy cực đại.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước.

//Instantiate the ChunkerME class 
ChunkerME chunkerME = new ChunkerME(chunkerModel);

Bước 5: Cắt câu

Các chunk() phương pháp của ChunkerMElớp được sử dụng để phân đoạn các câu trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận hai mảng Chuỗi đại diện cho mã thông báo và thẻ, làm tham số.

Gọi phương thức này bằng cách chuyển mảng mã thông báo và mảng thẻ đã tạo ở các bước trước dưới dạng tham số.

//Generating the chunks 
String result[] = chunkerME.chunk(tokens, tags);

Example

Sau đây là chương trình để phân đoạn các câu trong văn bản thô đã cho. Lưu chương trình này trong một tệp có tênChunkerExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
     
      //Generating the POS tags 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModelLoader().load(file);     
      
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model);        
      
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);    
    
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);  
      
      //Instantiate the ChunkerME class 
      ChunkerME chunkerME = new ChunkerME(chunkerModel);
       
      //Generating the chunks 
      String result[] = chunkerME.chunk(tokens, tags); 
  
      for (String s : result) 
         System.out.println(s);         
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng lệnh sau:

javac ChunkerExample.java 
java ChunkerExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho và chia nhỏ các câu trong đó, và hiển thị chúng như hình dưới đây.

Loading POS Tagger model ... done (1.040s) 
B-NP 
I-NP 
B-VP 
I-VP

Phát hiện vị trí của mã thông báo

Chúng tôi cũng có thể phát hiện vị trí hoặc nhịp của các khối bằng cách sử dụng chunkAsSpans() phương pháp của ChunkerMElớp học. Phương thức này trả về một mảng các đối tượng có kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ startend số nguyên của các bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi chunkAsSpans() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

//Generating the tagged chunk spans 
Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
for (Span s : span) 
   System.out.println(s.toString());

Example

Sau đây là chương trình phát hiện các câu trong văn bản thô nhất định. Lưu chương trình này trong một tệp có tênChunkerSpansEample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer; 
import opennlp.tools.util.Span;  

public class ChunkerSpansEample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);
      ChunkerME chunkerME = new ChunkerME(chunkerModel);       
           
      //Generating the tagged chunk spans 
      Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
      for (Span s : span) 
         System.out.println(s.toString());  
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac ChunkerSpansEample.java 
java ChunkerSpansEample

Khi thực thi, chương trình trên đọc Chuỗi đã cho và các khoảng của các phần trong đó, và hiển thị kết quả sau:

Loading POS Tagger model ... done (1.059s) 
[0..2) NP 
[2..4) VP

Phát hiện xác suất Chunker

Các probs() phương pháp của ChunkerME lớp trả về xác suất của chuỗi được giải mã cuối cùng.

//Getting the probabilities of the last decoded sequence       
double[] probs = chunkerME.probs();

Sau đây là chương trình để in xác suất của chuỗi được giải mã cuối cùng bằng chunker. Lưu chương trình này trong một tệp có tênChunkerProbsExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerProbsExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel cModel = new ChunkerModel(inputStream); 
      ChunkerME chunkerME = new ChunkerME(cModel); 
       
      //Generating the chunk tags 
      chunkerME.chunk(tokens, tags); 
       
      //Getting the probabilities of the last decoded sequence       
      double[] probs = chunkerME.probs(); 
      for(int i = 0; i<probs.length; i++) 
         System.out.println(probs[i]);       
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac ChunkerProbsExample.java 
java ChunkerProbsExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho, phân đoạn nó và in ra xác suất của chuỗi được giải mã cuối cùng.

0.9592746040797778 
0.6883933131241501 
0.8830563473996004 
0.8951150529746051

OpenNLP cung cấp Giao diện dòng lệnh (CLI) để thực hiện các hoạt động khác nhau thông qua dòng lệnh. Trong chương này, chúng tôi sẽ lấy một số ví dụ để chỉ ra cách chúng tôi có thể sử dụng Giao diện dòng lệnh OpenNLP.

Mã hóa

input.txt

Hi. How are you? Welcome to Tutorialspoint. We provide free tutorials on various technologies

Cú pháp

> opennlp TokenizerME path_for_models../en-token.bin <inputfile..> outputfile..

chỉ huy

C:\> opennlp TokenizerME C:\OpenNLP_models/en-token.bin <input.txt >output.txt

đầu ra

Loading Tokenizer model ... done (0.207s)  
Average: 214.3 sent/s 
Total: 3 sent 
Runtime: 0.014s

output.txt

Hi . How are you ? Welcome to Tutorialspoint . We provide free tutorials on various technologies

Phát hiện câu

input.txt

Hi. How are you? Welcome to Tutorialspoint. We provide free tutorials on various technologies

Cú pháp

> opennlp SentenceDetector path_for_models../en-token.bin <inputfile..> outputfile..

chỉ huy

C:\> opennlp SentenceDetector C:\OpenNLP_models/en-sent.bin <input.txt > output_sendet.txt

Đầu ra

Loading Sentence Detector model ... done (0.067s)  

Average: 750.0 sent/s 
Total: 3 sent 
Runtime: 0.004s

Output_sendet.txt

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Nhận dạng đối tượng được đặt tên

input.txt

<START:person> <START:person> Mike <END> <END> is senior programming manager and 
<START:person> Rama <END> is a clerk both are working at Tutorialspoint

Cú pháp

> opennlp TokenNameFinder path_for_models../en-token.bin <inputfile..

Chỉ huy

C:\>opennlp TokenNameFinder C:\OpenNLP_models\en-ner-person.bin <input_namefinder.txt

Đầu ra

Loading Token Name Finder model ... done (0.730s) 
<START:person> <START:person> Mike <END> <END> is senior programming manager and 
<START:person> Rama <END> is a clerk both are working at Tutorialspoint  
Average: 55.6 sent/s 
Total: 1 sent 
Runtime: 0.018s

Các phần của gắn thẻ bằng giọng nói

Input.txt

Hi. How are you? Welcome to Tutorialspoint. We provide free tutorials on various technologies

Cú pháp

> opennlp POSTagger path_for_models../en-token.bin <inputfile..

Chỉ huy

C:\>opennlp POSTagger C:\OpenNLP_models/en-pos-maxent.bin < input.txt

Đầu ra

Loading POS Tagger model ... done (1.315s) 
Hi._NNP How_WRB are_VBP you?_JJ Welcome_NNP to_TO Tutorialspoint._NNP We_PRP 
provide_VBP free_JJ tutorials_NNS on_IN various_JJ technologies_NNS  

Average: 66.7 sent/s 
Total: 1 sent 
Runtime: 0.015s