Que algoritmo a legibilidade usa para extrair texto de URLs?

102

Por um tempo, venho tentando encontrar uma maneira de extrair de forma inteligente o texto "relevante" de um URL, eliminando o texto relacionado aos anúncios e todo o resto. Após vários meses de pesquisa, desisti como um problema que não pode ser determinado com precisão. (Eu tentei maneiras diferentes, mas nenhuma era confiável)

Uma semana atrás, me deparei com Legibilidade - um plugin que converte qualquer URL em texto legível. Parece muito 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?

user300981
fonte
3
A questão é qual algoritmo o SO usa que a legibilidade não controla suas páginas? :)
Piotr Dobrogost
1
Relacionado: Como funciona o Safari's Reader e quando aparece?
Piotr Dobrogost de

Respostas:

170

A legibilidade consiste principalmente em heurísticas que "funcionam bem de alguma forma" em muitos casos.

Eu escrevi alguns trabalhos de pesquisa sobre este tópico e gostaria de explicar por que é fácil encontrar uma solução que funcione bem e quando fica difícil chegar perto de 100% de precisão.

Parece haver uma lei linguística subjacente à linguagem humana que também (mas não exclusivamente) se manifesta no conteúdo da página da Web, que já separa claramente dois tipos de texto (texto completo vs. texto não completo ou, aproximadamente, " conteúdo principal "vs." clichê ").

Para obter o conteúdo principal do HTML, em muitos casos é suficiente manter apenas os elementos de texto HTML (ou seja, blocos de texto que não são interrompidos pela marcação) que têm mais de cerca de 10 palavras. Parece que os humanos escolhem entre dois tipos de texto ("curto" e "longo", medido pelo número de palavras que emitem) para duas motivações diferentes de escrever um texto. Eu as chamaria de motivações "navegacionais" e "informativas".

Se um autor deseja que você obtenha rapidamente o que está escrito, ele / ela usa um texto "navegacional", ou seja, poucas palavras (como "PARAR", "Leia isto", "Clique aqui"). Este é o tipo de texto mais proeminente em 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 ambigüidade é removida ao custo de um aumento na redundância. O conteúdo semelhante a um artigo geralmente se enquadra nessa classe, pois contém mais do que apenas algumas palavras.

Embora essa separação pareça funcionar em uma infinidade de casos, está ficando complicada com títulos, frases curtas, isenções de responsabilidade, rodapés de direitos autorais etc.

Existem estratégias e recursos 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), as características dos blocos anteriores / seguintes, a frequência de um texto de bloco específico na Web "inteira", Estrutura DOM do documento HTML, a imagem visual da página etc.

Você pode ler meu artigo mais recente " Detecção de padrões usando recursos de texto raso " para obter alguns insights 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 recursos. Se você observar cuidadosamente o changelog do SVN, verá que o número de estratégias variou ao longo do tempo, assim como a qualidade de extração da Legibilidade. Por exemplo, a introdução da densidade de link em dezembro de 2009 ajudou muito a melhorar.

Na minha opinião, portanto, não faz sentido dizer "Legibilidade é assim", sem mencionar o número exato da versão.

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 de sua escolha usando o aplicativo boilerpipe-web no Google AppEngine.

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

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

Felicidades,

cristão

Christian Kohlschütter
fonte
3
Este projeto boilerpipe ainda está ativo?
Abby
5
Eu acredito que é melhor você colocar seu projeto no GitHub para que ele cresça socialmente por desenvolvedores de código aberto.
Inanc Gumus
1
Um bom exemplo da explicação do Dr. Kohlschütter é na verdade esta página da web, no Safari, se você usou o Reader verá que sua resposta é exibida como o texto principal, graças à densidade do link. É um texto vinculado, portanto reconhecido como texto principal, quando comparado a outros blocos.
Abdelrahman Eid
1
"Migrou" uma cópia para o meu repositório github.com/k-bx/boilerpipe para o caso de se perder :)
Konstantine Rybnikov
16

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

Moin Zaman
fonte
12

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

Os identificadores negativos seriam:

  • Comente
  • discutir

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

O código possui 1792 linhas. Parece um problema não trivial, então talvez você possa obter suas inspirações a partir daí.

slhck
fonte
2
Por acaso, você sabe se o código deles é open source e se pode ser usado em produtos comerciais?
user300981
2
Ele diz que o código-fonte é lançado sob Apache License 2.0, o que significa que você pode usá-lo, distribuí-lo, modificar e distribuir versões modificadas dele. Não estou muito claro sobre os detalhes, no entanto.
slhck
2
@bobsmith Apple o usou na versão mais recente do Safari. Eles creditaram Arc90 nas notas de lançamento.
s4y
7

Interessante. Desenvolvi um script PHP semelhante. Basicamente, faz a varredura de artigos e anexa classes gramaticais a todo o texto (Brill Tagger). Então, sentenças gramaticalmente inválidas são eliminadas instantaneamente. Então, mudanças repentinas nos pronomes ou no pretérito indicam que o artigo acabou ou ainda não começou. Frases repetidas são procuradas e eliminadas, como "Finanças esportivas do Yahoo news" aparece dez vezes na página. Você também pode obter estatísticas sobre o tom com uma infinidade de bancos de palavras relacionadas a várias emoções. Mudanças repentinas no tom, de ativo / negativo / financeiro para passivo / positivo / político, indicam uma fronteira. É realmente infinito, por mais que você queira cavar fundo.

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

user734063
fonte
3
Isso soa como uma abordagem realmente interessante - você tem algum código para compartilhar com isso?
lsh de
2
Em segundo lugar, você tem algum código de exemplo ou informação em torno do seu código que possamos examinar?
userabuser