Hiểu truy xuất thông tin bằng cách sử dụng Apache Lucene và Tika - Phần ...


Lê Hoài An
5 năm trước
Hữu ích 2 Chia sẻ Viết bình luận 0
Đã xem 3020

Giới thiệu

Trong hướng dẫn này, các khung công tác Apache Lucene và Apache Tika sẽ được giải thích thông qua các khái niệm cốt lõi của chúng (ví dụ: phân tích cú pháp, phát hiện mime, phân tích nội dung, lập chỉ mục, ghi điểm, tăng cường) thông qua các ví dụ minh họa có thể áp dụng cho không chỉ các nhà phát triển phần mềm dày dạn để phân tích nội dung và lập trình là tốt. Chúng tôi giả định rằng bạn có kiến ​​thức làm việc về ngôn ngữ lập trình Java ™ và nhiều nội dung cần phân tích.

Trong suốt hướng dẫn này, bạn sẽ tìm hiểu:

  • cách sử dụng API của Apache Tika và các chức năng phù hợp nhất của nó
  • cách phát triển mã với API Lucene của Apache và các mô-đun quan trọng nhất của nó
  • cách tích hợp Apache Lucene và Apache Tika để xây dựng phần mềm của riêng bạn lưu trữ và truy xuất thông tin một cách hiệu quả. (mã dự án có sẵn để tải về)

 Lucene và Tika là gì?

  Theo trang web của Apache Lucene, Apache Lucene đại diện cho một thư viện Java nguồn mở để lập chỉ mục và tìm kiếm từ trong các bộ sưu tập tài liệu lớn. Kích thước chỉ mục đại diện cho khoảng 20-30% kích thước của văn bản được lập chỉ mục và các thuật toán tìm kiếm cung cấp các tính năng như:

  • tìm kiếm xếp hạng - kết quả tốt nhất được trả về đầu tiên
  • nhiều loại truy vấn mạnh mẽ: truy vấn cụm từ, truy vấn ký tự đại diện, truy vấn gần, truy vấn phạm vi và nhiều hơn nữa. Trong hướng dẫn này, chúng tôi sẽ chỉ trình bày các truy vấn cụm từ.
  • tìm kiếm thực địa (ví dụ tiêu đề, tác giả, nội dung)
  • sắp xếp theo lĩnh vực nào
  • khuôn mặt linh hoạt, làm nổi bật, tham gia và nhóm kết quả
  • mô hình xếp hạng có thể cắm, bao gồm  Mô hình không gian Vector  và  Okapi BM25

  Nhưng mục đích chính của Lucene là xử lý trực tiếp văn bản và chúng tôi muốn thao túng các tài liệu, những người có định dạng và mã hóa khác nhau. Để phân tích nội dung tài liệu và các thuộc tính của chúng, thư viện Tika của Apache là cần thiết.

  Apache Tika là một thư viện cung cấp một bộ giao diện linh hoạt và mạnh mẽ có thể được sử dụng trong bất kỳ bối cảnh nào cần phân tích siêu dữ liệu và trích xuất văn bản có cấu trúc. Thành phần chính của Apache Tika là giao diện Parser (org.apache.tika.parser.Parser) vì nó che giấu sự phức tạp của các định dạng tệp khác nhau trong khi cung cấp một cơ chế đơn giản và mạnh mẽ để trích xuất nội dung văn bản và siêu dữ liệu có cấu trúc từ tất cả các loại tài liệu.

Tiêu chí cho thiết kế phân tích cú pháp Tika

Phân tích cú pháp trực tuyến

Giao diện không yêu cầu ứng dụng khách cũng như cài đặt trình phân tích cú pháp để giữ toàn bộ nội dung tài liệu trong bộ nhớ hoặc được lưu vào đĩa. Điều này cho phép thậm chí các tài liệu khổng lồ được phân tích cú pháp mà không yêu cầu tài nguyên quá mức.

Nội dung có cấu trúc

Việc triển khai trình phân tích cú pháp phải có thể bao gồm thông tin cấu trúc (tiêu đề, liên kết, v.v.) trong nội dung được trích xuất. Một ứng dụng khách có thể sử dụng thông tin này chẳng hạn để đánh giá tốt hơn mức độ liên quan của các phần khác nhau của tài liệu được phân tích cú pháp.

Siêu dữ liệu đầu vào

Một ứng dụng khách sẽ có thể bao gồm siêu dữ liệu như tên tệp hoặc loại nội dung được khai báo với tài liệu cần phân tích cú pháp. Việc thực hiện trình phân tích cú pháp có thể sử dụng thông tin này để hướng dẫn tốt hơn quá trình phân tích cú pháp.

Siêu dữ liệu đầu ra

Việc triển khai trình phân tích cú pháp sẽ có thể trả về siêu dữ liệu tài liệu bên cạnh nội dung tài liệu. Nhiều định dạng tài liệu chứa siêu dữ liệu như tên của tác giả có thể hữu ích cho các ứng dụng khách.

Độ nhạy bối cảnh

Mặc dù các cài đặt và hành vi mặc định của trình phân tích cú pháp Tika sẽ hoạt động tốt trong hầu hết các trường hợp sử dụng, vẫn có những tình huống kiểm soát chi tiết hơn đối với quá trình phân tích cú pháp là mong muốn. Nên dễ dàng đưa thông tin cụ thể theo ngữ cảnh đó vào quá trình phân tích cú pháp mà không phá vỡ các lớp trừu tượng.


Yêu cầu

  • Maven 2.0 trở lên
  • Java 1.6 SE trở lên

Bài học 1: Tự động trích xuất siêu dữ liệu từ bất kỳ loại tệp nào

Các tiền đề của chúng tôi là như sau: chúng tôi có một bộ tài liệu được lưu trữ trên đĩa / cơ sở dữ liệu và chúng tôi muốn lập chỉ mục chúng; các tài liệu này có thể là Tài liệu Word, PDF, HTML, tệp văn bản thuần, v.v. Vì chúng tôi là nhà phát triển, chúng tôi muốn viết mã có thể sử dụng lại để trích xuất các thuộc tính tệp về định dạng (siêu dữ liệu) và nội dung tệp. Apache Tika có một kho lưu trữ mô phỏng và một tập hợp các lược đồ (bất kỳ sự kết hợp nào giữa MAGIC, mẫu URL, ký tự gốc XML hoặc phần mở rộng tệp) để xác định xem một tệp, URL hoặc phần nội dung cụ thể có khớp với một trong các loại đã biết không. Nếu nội dung không khớp, Tika đã phát hiện ra mô phỏng của nó và có thể tiến hành chọn trình phân tích cú pháp thích hợp.

  Trong mã mẫu, phát hiện loại tệp và phân tích cú pháp của nó đang được trình bày bên trong lớp com.retriever.lucene.index.IndexCreator , phương thức indexFile.

Liệt kê 1.1 Phân tích một tệp với Tika

public static DocumentWithAbstract indexFile(Analyzer analyzer, File file) throws IOException {
        Metadata metadata = new Metadata();
        ContentHandler handler = new BodyContentHandler(10 * 1024 * 1024);
        ParseContext context = new ParseContext();
        Parser parser = new AutoDetectParser();
        InputStream stream = new FileInputStream(file); //open stream
        try {
            parser.parse(stream, handler, metadata, context); //parse the stream 
        } catch (TikaException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } finally {
            stream.close(); //close the stream
        }
   //more code here 
 }

Đoạn mã trên hiển thị cách Tệp được phân tích cú pháp bằng cách sử dụng org.apache.tika.parser.AutoDetectParser;  loại triển khai này đã được chọn vì chúng tôi muốn đạt được các tài liệu phân tích cú pháp bất chấp định dạng của chúng. Ngoài ra, để xử lý nội dung, org.apache.tika.sax.BodyContentHandler đã được xây dựng với writeLimit được cung cấp dưới dạng tham số (10 * 1024 * 1024); loại hàm tạo này tạo một trình xử lý nội dung ghi các sự kiện ký tự cơ thể XHTML vào bộ đệm chuỗi bên trong và trong trường hợp các tài liệu có nội dung lớn sẽ ít ném SAXException (ném khi đạt đến giới hạn ghi mặc định). 

Do phân tích cú pháp của chúng tôi, chúng tôi đã thu được một đối tượng siêu dữ liệu mà bây giờ chúng tôi có thể sử dụng để phát hiện các thuộc tính tệp (tiêu đề hoặc bất kỳ tiêu đề nào khác cụ thể cho định dạng tài liệu). Xử lý siêu dữ liệu có thể được thực hiện như được mô tả dưới đây ( com.retriever.lucene.index.IndexCreator , phương thức indexFileDescriptors):

  Liệt kê 1.2 Xử lý siêu dữ liệu

private static Document indexFileDescriptors(String fileName, Metadata metadata) {
        Document doc = new Document();
        //store file name in a separate TextField
        doc.add(new TextField(ISearchConstants.FIELD_FILE, fileName, Store.YES)); 
        
        for (String key : metadata.names()) {
            String name = key.toLowerCase();
            String value = metadata.get(key);

            if (StringUtils.isBlank(value)) {
                continue;
            }

            if ("keywords".equalsIgnoreCase(key)) {
                for (String keyword : value.split(",?(\\s+)")) {
                    doc.add(new TextField(name, keyword, Store.YES));
                }
            } else if (ISearchConstants.FIELD_TITLE.equalsIgnoreCase(key)) {
                doc.add(new TextField(name, value, Store.YES));
            } else {
                doc.add(new TextField(name, fileName, Store.NO));
            }
        }

Trong phương pháp được trình bày ở trên, chúng tôi lưu trữ tên tệp trong một trường riêng biệt và cả tiêu đề của tài liệu (một tài liệu có thể có tiêu đề khác với tên tệp của nó); chúng tôi không quan tâm đến việc lưu trữ các thông tin khác.

Hữu ích 2 Chia sẻ Viết bình luận 0
Đã xem 3020