Khả năng đọc sử dụng thuật toán nào để trích xuất văn bản từ URL?


102

Trong một thời gian, tôi đã cố gắng tìm cách trích xuất văn bản "có liên quan" từ URL một cách thông minh bằng cách loại bỏ văn bản liên quan đến quảng cáo và tất cả những thứ lộn xộn khác. Sau vài tháng nghiên cứu, tôi đã loại bỏ nó như một vấn đề mà không thể xác định chính xác. (Tôi đã thử nhiều cách khác nhau nhưng không có cách nào đáng tin cậy)

Một tuần trước, tôi tình cờ thấy Khả năng đọc - một plugin chuyển đổi bất kỳ URL nào thành văn bản có thể đọc được. Nó trông khá chính xác đối với tôi. Tôi đoán là bằng cách nào đó họ có một thuật toán đủ thông minh để trích xuất văn bản có liên quan.

Có ai biết họ làm điều đó như thế nào không? Hoặc làm thế nào tôi có thể làm điều đó một cách đáng tin cậy?


3
Câu hỏi là SO sử dụng thuật toán nào mà Khả năng đọc không xử lý các trang của nó? :)
Piotr Dobrogost

Câu trả lời:


170

Khả năng đọc chủ yếu bao gồm các phương pháp heuristics "chỉ bằng cách nào đó hoạt động tốt" trong nhiều trường hợp.

Tôi đã viết một số bài nghiên cứu về chủ đề này và tôi muốn giải thích cơ sở lý do tại sao có thể dễ dàng đưa ra một giải pháp hoạt động tốt và khi khó đạt được độ chính xác 100%.

Dường như có một quy luật ngôn ngữ cơ bản trong ngôn ngữ của con người cũng (nhưng không phải riêng) được thể hiện trong nội dung trang Web, vốn đã phân tách khá rõ ràng hai loại văn bản (toàn văn so với không toàn văn hoặc đại khái là " nội dung chính "so với" boilerplate ").

Để lấy nội dung chính từ HTML, trong nhiều trường hợp chỉ giữ lại các phần tử văn bản HTML (tức là các khối văn bản không bị ngắt quãng bởi đánh dấu) có nhiều hơn khoảng 10 từ. Dường như con người chọn từ hai loại văn bản ("ngắn" và "dài", được đo bằng số từ mà họ phát ra) cho hai động cơ khác nhau của việc viết văn bản. Tôi gọi chúng là động lực "định hướng" và "thông tin".

Nếu một tác giả muốn bạn nhanh chóng nhận được những gì được viết, họ sử dụng văn bản "điều hướng", tức là ít từ (như "STOP", "Read this", "Click here"). Đây là loại văn bản nổi bật nhất trong các phần tử điều hướng (menu, v.v.)

Nếu một tác giả muốn bạn hiểu sâu sắc ý của anh ấy / cô ấy, anh ấy / cô ấy sẽ sử dụng nhiều từ. Bằng cách này, sự mơ hồ được loại bỏ với cái giá phải trả là sự gia tăng sự dư thừa. Nội dung giống như bài viết thường rơi vào lớp này vì nó chỉ có một vài từ.

Mặc dù sự tách biệt này dường như hoạt động trong rất nhiều trường hợp, nhưng nó ngày càng trở nên phức tạp với tiêu đề, câu ngắn, tuyên bố từ chối trách nhiệm, chân trang bản quyền, v.v.

Có nhiều chiến lược và tính năng phức tạp hơn, giúp tách nội dung chính khỏi bản soạn sẵn. Ví dụ: mật độ liên kết (số từ trong một khối được liên kết so với tổng số từ trong khối), các tính năng của khối trước / sau, tần suất xuất hiện của một văn bản khối cụ thể trong "toàn bộ" Web, Cấu trúc DOM của tài liệu HTML, hình ảnh trực quan của trang, v.v.

Bạn có thể đọc bài viết mới nhất của tôi " Phát hiện tấm lót bằng cách sử dụng Tính năng văn bản nông " để có một số hiểu biết sâu sắc từ góc độ lý thuyết. Bạn cũng có thể xem video bài thuyết trình của tôi trên VideoLectures.net.

"Khả năng đọc" sử dụng một số tính năng này. Nếu bạn xem kỹ bảng thay đổi SVN, bạn sẽ thấy rằng số lượng chiến lược thay đổi theo thời gian và chất lượng trích xuất của Khả năng đọc cũng vậy. Ví dụ, việc giới thiệu mật độ liên kết vào tháng 12 năm 2009 đã giúp cải thiện rất nhiều.

Theo ý kiến ​​của tôi, do đó không có ý nghĩa gì khi nói "Khả năng đọc được như vậy", mà không đề cập đến số phiên bản chính xác.

Tôi đã xuất bản một thư viện trích xuất nội dung HTML nguồn mở có tên là boilerpipe , cung cấp một số chiến lược trích xuất khác nhau. Tùy thuộc vào trường hợp sử dụng, một hoặc các bộ giải nén khác hoạt động tốt hơn. Bạn có thể thử các trình giải nén này trên các trang mà bạn chọn bằng ứng dụng web boilerpipe đồng hành trên Google AppEngine.

Để nói lên con số, hãy xem trang " Điểm chuẩn " trên wiki boilerpipe so sánh một số chiến lược trích xuất, bao gồm boilerpipe, Readability và Apple Safari.

Tôi nên đề cập rằng các thuật toán này giả định rằng nội dung chính thực sự là toàn văn. Có những trường hợp "nội dung chính" là thứ khác, ví dụ như hình ảnh, bảng, video, v.v. Các thuật toán sẽ không hoạt động tốt cho những trường hợp như vậy.

Chúc mừng,

Cơ đốc giáo


3
Dự án boilerpipe này có còn hoạt động không?
Abby

5
Tôi tin rằng bạn nên đưa dự án của mình lên GitHub để nó sẽ phát triển về mặt xã hội bởi các nhà phát triển nguồn mở.
Inanc Gumus

1
Một ví dụ điển hình về lời giải thích của Tiến sĩ Kohlschütter thực sự là trang web này, trong Safari, nếu bạn sử dụng Trình đọc, bạn sẽ thấy rằng câu trả lời của anh ấy được hiển thị dưới dạng văn bản chính, nhờ vào mật độ liên kết. Đó là văn bản được liên kết, do đó được công nhận là văn bản chính, khi so sánh với các khối khác.
Abdelrahman Eid

1
"Đã di chuyển" một bản sao vào repo của tôi github.com/k-bx/boilerpipe chỉ trong trường hợp nó bị mất :)
Konstantine Rybnikov

16

khả năng đọc là một bookmarklet javascript. có nghĩa là mã phía máy khách thao tác DOM. Nhìn vào đoạn mã javascript và bạn sẽ có thể thấy những gì đang xảy ra.

Quy trình làm việc và mã của khả năng đọc:

/*
     *  1. Prep the document by removing script tags, css, etc.
     *  2. Build readability's DOM tree.
     *  3. Grab the article content from the current dom tree.
     *  4. Replace the current DOM tree with the new one.
     *  5. Read peacefully.
*/

javascript: (function () {
    readConvertLinksToFootnotes = false;
    readStyle = 'style-newspaper';
    readSize = 'size-medium';
    readMargin = 'margin-wide';
    _readability_script = document.createElement('script');
    _readability_script.type = 'text/javascript';
    _readability_script.src = 'http://lab.arc90.com/experiments/readability/js/readability.js?x=' + (Math.random());
    document.documentElement.appendChild(_readability_script);
    _readability_css = document.createElement('link');
    _readability_css.rel = 'stylesheet';
    _readability_css.href = 'http://lab.arc90.com/experiments/readability/css/readability.css';
    _readability_css.type = 'text/css';
    _readability_css.media = 'all';
    document.documentElement.appendChild(_readability_css);
    _readability_print_css = document.createElement('link');
    _readability_print_css.rel = 'stylesheet';
    _readability_print_css.href = 'http://lab.arc90.com/experiments/readability/css/readability-print.css';
    _readability_print_css.media = 'print';
    _readability_print_css.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(_readability_print_css);
})();

Và nếu bạn làm theo các tệp JS và CSS mà đoạn mã trên kéo vào, bạn sẽ có được bức tranh toàn cảnh:

http://lab.arc90.com/experiments/readability/js/readability.js (cái này được nhận xét khá hay, đọc thú vị)

http://lab.arc90.com/experiments/readability/css/readability.css


12

Tất nhiên, không có cách nào đáng tin cậy 100% để làm điều này. Bạn có thể xem mã nguồn Khả năng đọc tại đây

Về cơ bản, những gì họ đang làm là cố gắng xác định các khối văn bản tích cựctiêu cực . Số nhận dạng dương (tức là các ID div) sẽ giống như sau:

  • bài báo
  • thân hình
  • Nội dung
  • Blog
  • câu chuyện

Số nhận dạng phủ định sẽ là:

  • bình luận
  • bàn luận

Và sau đó họ có những ứng cử viên khócó thể . Những gì họ sẽ làm là xác định những gì có nhiều khả năng là nội dung chính của trang web, xem dòng 678trong nguồn khả năng đọc. Điều này được thực hiện bằng cách phân tích phần lớn độ dài của các đoạn văn, số nhận dạng của chúng (xem ở trên), cây DOM (nghĩa là nếu đoạn văn là nút con cuối cùng), loại bỏ mọi thứ không cần thiết, xóa định dạng, v.v.

Mã có 1792 dòng. Đó có vẻ như là một vấn đề không hề nhỏ, vì vậy có thể bạn có thể lấy cảm hứng từ đó.


2
Bạn có tình cờ biết mã của họ có phải là mã nguồn mở không và nó có thể được sử dụng trong các sản phẩm thương mại không?
user300981

2
Nó nói rằng mã nguồn được phát hành theo Giấy phép Apache 2.0, có nghĩa là bạn có thể sử dụng nó, phân phối nó, sửa đổi và phân phối các phiên bản đã sửa đổi của nó. Tôi không quá rõ ràng về các chi tiết.
slhck

2
@bobsmith Apple đã sử dụng nó trong phiên bản Safari mới nhất. Họ ghi có Arc90 trong ghi chú phát hành.
s4y

7

Hấp dẫn. Tôi đã phát triển một tập lệnh PHP tương tự. Về cơ bản, nó quét các bài báo và đính kèm các phần của bài phát biểu vào tất cả văn bản (Brill Tagger). Sau đó, các câu không hợp lệ về mặt ngữ pháp sẽ bị loại bỏ ngay lập tức. Sau đó, sự thay đổi đột ngột của đại từ hoặc thì quá khứ cho thấy bài viết đã kết thúc hoặc chưa bắt đầu. Các cụm từ lặp đi lặp lại được tìm kiếm và loại bỏ, chẳng hạn như "Yahoo news tài chính thể thao" xuất hiện mười lần trong trang. Bạn cũng có thể nhận được số liệu thống kê về giọng điệu với rất nhiều ngân hàng từ liên quan đến các cảm xúc khác nhau. Những thay đổi đột ngột trong giọng điệu, từ chủ động / tiêu cực / tài chính, sang thụ động / tích cực / chính trị chỉ ra một ranh giới. Nó thực sự vô tận, tuy nhiên bạn muốn đào sâu.

Các vấn đề chính là liên kết, các điểm bất thường được nhúng, kiểu tập lệnh và cập nhật.


3
Điều này nghe có vẻ là một cách tiếp cận thực sự thú vị - bạn có bất kỳ mã nào để chia sẻ từ điều này không?
lsh

2
Tôi thứ hai rằng, bạn có bất kỳ mã mẫu hoặc thông tin nào xung quanh mã của bạn mà chúng tôi có thể xem xét không?
userabuser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.