Qual algoritmo a legibilidade usa para extrair texto de URLs?

Por um tempo, venho tentando encontrar uma maneira inteligente de extrair o texto “relevante” de uma URL, eliminando o texto relacionado aos anúncios e a todas as outras bagunças. Depois de vários meses de pesquisa, desisti dele como um problema. que não pode ser determinado com precisão. (Eu tentei maneiras diferentes, mas nenhuma foi confiável)

Uma semana atrás, eu deparei com a legibilidade – um plugin que converte qualquer URL em texto legível. Parece bem preciso para mim. Meu palpite é que eles de alguma forma têm um algoritmo inteligente o suficiente para extrair o texto relevante.

Alguém sabe como eles fazem isso? Ou como eu poderia fazer isso de forma confiável?

A legibilidade consiste principalmente em heurísticas que “de certa forma funcionam bem” em muitos casos.

Escrevi alguns trabalhos de pesquisa sobre esse tópico e gostaria de explicar o motivo pelo qual é fácil encontrar uma solução que funcione bem e que fique difícil chegar perto de 100% de precisão.

Parece haver uma lei lingüística subjacente na linguagem humana que também é (mas não exclusivamente) manifestada no conteúdo da página da Web, que já separa claramente dois tipos de texto (texto completo versus texto não completo ou, mais ou menos, ” conteúdo principal “vs.” boilerplate “).

Para obter o conteúdo principal do HTML, em muitos casos ele é suficiente para manter apenas os elementos de texto HTML (ou seja, blocos de texto que não são interrompidos por marcação) que tenham mais de 10 palavras. Parece que os humanos escolhem dois tipos de texto (“curto” e “longo”, medidos pelo número de palavras que emitem) para duas motivações diferentes de escrever texto. Eu os chamaria de motivações “navegacionais” e “informativas”.

Se um autor quer que você obtenha rapidamente o que está escrito, ele usa texto “de navegação”, ou seja, poucas palavras (como “STOP”, “Leia isto”, “Clique aqui”). Este é o tipo de texto predominante nos elementos de navegação (menus, etc.)

Se um autor quer que você entenda profundamente o que ele quer dizer, ele usa muitas palavras. Dessa forma, a ambiguidade é removida ao custo de um aumento na redundância. O conteúdo semelhante a um artigo geralmente se enquadra nessa class, pois tem mais do que apenas algumas palavras.

Enquanto esta separação parece funcionar em uma infinidade de casos, está ficando complicado com manchetes, frases curtas, isenções de responsabilidade, rodapés de direitos autorais etc.

Existem estratégias e resources mais sofisticados que ajudam a separar o conteúdo principal do clichê. Por exemplo, a densidade do link (número de palavras em um bloco que estão vinculadas versus o número total de palavras no bloco), os resources dos blocos anterior / próximo, a freqüência de um determinado texto de bloco na Web “inteira”, Estrutura DOM do documento HTML, a imagem visual da página, etc.

Você pode ler o meu mais recente artigo ” Detecção de texto plano usando resources de texto raso ” para obter algumas informações de uma perspectiva teórica. Você também pode assistir ao vídeo da minha apresentação em papel no VideoLectures.net.

“Legibilidade” usa alguns desses resources. Se você observar atentamente o changelog do SVN, verá que o número de estratégias variou ao longo do tempo, assim como a qualidade de extração de legibilidade. Por exemplo, a introdução da densidade de links em dezembro de 2009 ajudou muito a melhorar.

Na minha opinião, portanto, não faz sentido dizer “Legibilidade faz assim”, sem mencionar o número exacto da versão.

Eu publiquei uma biblioteca de extração de conteúdo HTML de código aberto chamada boilerpipe , que fornece várias estratégias de extração diferentes. Dependendo do caso de uso, um ou outro extrator funciona melhor. Você pode experimentar esses extratores em páginas à sua escolha usando o aplicativo boilerpipe-web complementar no Google AppEngine.

Para deixar os números falarem, consulte a página ” Benchmarks ” no wiki boilerpipe que compara algumas estratégias de extração, incluindo boilerpipe, Readability e Apple Safari.

Devo mencionar que esses algoritmos assumem que o conteúdo principal é, na verdade, texto completo. Há casos em que o “conteúdo principal” é outra coisa, por exemplo, uma imagem, uma tabela, um vídeo, etc. Os algoritmos não funcionam bem para esses casos.

Felicidades,

cristão

legibilidade é um bookmarklet javascript. significando seu código do lado do cliente que manipula o DOM. Olhe para o javascript e você poderá ver o que está acontecendo.

Fluxo de trabalho e código de legibilidade:

/* * 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); })(); 

E se você seguir os arquivos JS e CSS que o código acima puxa, você obterá a imagem completa:

http://lab.arc90.com/experiments/readability/js/readability.js (isso é muito bem comentado, leitura interessante)

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

Não há uma maneira 100% confiável de fazer isso, é claro. Você pode dar uma olhada no código-fonte de legibilidade aqui

Basicamente, o que eles estão fazendo é tentar identificar blocos de texto positivos e negativos . Identificadores positivos (ou seja, IDs div) seriam algo como:

  • artigo
  • corpo
  • conteúdo
  • blog
  • história

Identificadores negativos seriam:

  • Comente
  • discutir

E então eles têm improváveis e talvez candidatos. O que eles fariam é determinar o que provavelmente será o conteúdo principal do site, consulte a linha 678 na fonte de legibilidade. Isso é feito analisando principalmente o comprimento dos parágrafos, seus identificadores (veja acima), a tree DOM (ou seja, se o parágrafo é um último nó filho), retire tudo o que é desnecessário, remova a formatação etc.

O código tem 1792 linhas. Parece um problema não trivial, então talvez você possa obter suas inspirações de lá.

Interessante. Eu desenvolvi um script PHP similar. Basicamente, escaneia artigos e anexa partes do discurso a todo o texto (Brill Tagger). Então, frases gramaticalmente inválidas são instantaneamente eliminadas. Então, mudanças súbitas nos pronomes ou no passado indicam que o artigo acabou ou ainda não começou. Frases repetidas são procuradas e eliminadas, como “Yahoo news sports finance” aparece dez vezes na página. Você também pode obter statistics sobre o tom com uma infinidade de bancos de palavras relacionadas a várias emoções. Mudanças súbitas no tom, de ativo / negativo / financeiro, para passivo / positivo / político indicam um limite. É realmente interminável, no entanto, você quer aprofundar.

Os principais problemas são links, anomalias incorporadas, estilos de scripts e atualizações.