가독성은 URL에서 텍스트를 추출하는 데 어떤 알고리즘을 사용합니까?


102

한동안 나는 광고와 관련된 모든 텍스트와 다른 모든 혼란을 제거하여 URL에서 "관련성있는"텍스트를 지능적으로 추출하는 방법을 찾고있었습니다. 몇 달의 조사 끝에 저는 문제로 포기했습니다. 정확하게 결정할 수 없습니다. (다른 방법을 시도했지만 신뢰할 수있는 방법은 없습니다)

일주일 전, 모든 URL을 읽을 수있는 텍스트로 변환하는 플러그인 인 Readability를 우연히 발견했습니다 . 나에게는 꽤 정확 해 보입니다. 내 생각 엔 그들은 관련 텍스트를 추출하기에 충분히 똑똑한 알고리즘을 가지고 있다는 것입니다.

그들이 어떻게하는지 아는 사람이 있습니까? 아니면 어떻게 안정적으로 할 수 있습니까?


3
질문은 가독성이 페이지를 처리하지 않는 알고리즘을 사용하는 것입니다. :)
Piotr Dobrogost

답변:


170

가독성은 주로 많은 경우 "어떻게 든 잘 작동하는"휴리스틱으로 구성됩니다.

이 주제에 대한 몇 가지 연구 논문을 작성했으며, 잘 작동하는 솔루션을 쉽게 찾을 수있는 이유와 100 % 정확도에 가까워 질 때의 배경에 대해 설명하고 싶습니다.

웹 페이지 콘텐츠에도 (배타적이지는 않지만) 명시되어있는 인간 언어의 언어 법이있는 것 같습니다.이 법칙은 이미 두 가지 유형의 텍스트 (전체 텍스트와 비 전체 텍스트 또는 대략적으로 " 주요 콘텐츠 "vs."상용구 ").

HTML에서 주요 콘텐츠를 가져 오려면 약 10 단어가 넘는 HTML 텍스트 요소 (즉, 마크 업에 의해 중단되지 않는 텍스트 블록) 만 유지하는 것으로 충분합니다. 인간은 텍스트를 작성하는 두 가지 다른 동기를 위해 두 가지 유형의 텍스트 (발산하는 단어 수로 측정되는 "짧은"및 "긴") 중에서 선택하는 것으로 보입니다. 나는 그들을 "항해 적"및 "정보 적"동기라고 부를 것입니다.

저자 가 작성한 내용 을 빨리 얻으려면 "탐색"텍스트를 사용합니다 (예 : "STOP", "Read this", "Click here"). 탐색 요소 (메뉴 등)에서 가장 눈에 잘 띄는 텍스트 유형입니다.

저자가 자신의 의미를 깊이 이해하기를 원하면 많은 단어를 사용합니다. 이렇게하면 중복성이 증가하는 대신 모호성이 제거됩니다. 기사와 유사한 콘텐츠는 일반적으로 몇 단어 이상이 포함되어 있으므로이 클래스에 속합니다.

이 분리는 수많은 경우에서 작동하는 것처럼 보이지만 헤드 라인, 짧은 문장, 면책 조항, 저작권 바닥 글 등으로 인해 까다로워지고 있습니다.

기본 콘텐츠와 상용구를 분리하는 데 도움이되는보다 정교한 전략과 기능이 있습니다. 예를 들어 링크 밀도 (링크 된 블록의 단어 수 대 블록의 전체 단어 수), 이전 / 다음 블록의 특징, "전체"웹에서 특정 블록 텍스트의 빈도, HTML 문서의 DOM 구조, 페이지의 시각적 이미지 등

이론적 관점에서 통찰력을 얻으 려면 저의 최신 기사 " 얕은 텍스트 기능을 사용한 상용구 감지 "를 읽을 수 있습니다 . VideoLectures.net에서 내 논문 프레젠테이션의 비디오를 볼 수도 있습니다.

"가독성"은 이러한 기능 중 일부를 사용합니다. SVN 변경 로그를주의 깊게 살펴보면 시간이 지남에 따라 전략 수가 변하고 가독성의 추출 품질도 변함을 알 수 있습니다. 예를 들어, 2009 년 12 월에 링크 밀도의 도입은 개선에 큰 도움이되었습니다.

제 생각에는 정확한 버전 번호를 언급하지 않고 "가독성이 그렇게 하죠"라고 말하는 것은 의미가 없습니다.

여러 가지 추출 전략을 제공하는 보일러 파이프 라는 오픈 소스 HTML 콘텐츠 추출 라이브러리를 게시했습니다 . 사용 사례에 따라 하나 또는 다른 추출기가 더 잘 작동합니다. Google AppEngine의 보조 보일러 파이프 웹 앱을 사용하여 선택한 페이지에서 이러한 추출기를 사용해 볼 수 있습니다.

숫자가 말하도록하려면 , 보일러 파이프, 가독성 및 Apple Safari를 포함한 일부 추출 전략을 비교하는 보일러 파이프 위키 의 " 벤치 마크 "페이지를 참조하십시오.

이 알고리즘은 주요 내용이 실제로 전체 텍스트라고 가정합니다. 이미지, 테이블, 비디오 등과 같이 "주요 내용"이 다른 경우가 있습니다. 이러한 경우에는 알고리즘이 제대로 작동하지 않습니다.

건배,

신자


3
이 보일러 파이프 프로젝트가 여전히 활성화되어 있습니까?
애비

5
오픈 소스 개발자가 사회적으로 성장할 수 있도록 프로젝트를 GitHub에 올리는 것이 좋습니다.
Inanc Gumus 2014

1
Dr. Kohlschütter의 설명에 대한 좋은 예는 실제로이 웹 페이지입니다. Safari에서 Reader를 사용하면 링크 밀도 덕분에 그의 답변이 기본 텍스트로 표시된다는 것을 알 수 있습니다. 링크 된 텍스트이므로 다른 블록과 비교할 때 기본 텍스트로 인식됩니다.
Abdelrahman Eid 2014 년

1
"마이그레이션"내 환매 특약에 복사 github.com/k-bx/boilerpipe 이 :) 분실 단지 경우
Konstantine Rybnikov

16

가독성은 자바 스크립트 북마크릿입니다. DOM을 조작하는 클라이언트 측 코드를 의미합니다. 자바 스크립트를 보면 무슨 일이 일어나고 있는지 볼 수있을 것입니다.

가독성의 워크 플로우 및 코드 :

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

그리고 위의 코드가 가져온 JS 및 CSS 파일을 따르면 전체 그림을 얻을 수 있습니다.

http://lab.arc90.com/experiments/readability/js/readability.js (이것은 주석이 잘 달린 흥미로운 읽기입니다)

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


12

물론 100 % 신뢰할 수있는 방법은 없습니다. 여기 에서 가독성 소스 코드를 볼 수 있습니다.

기본적으로 그들이하는 일은 긍정적 이고 부정적인 텍스트 블록 을 식별하는 것 입니다. 양의 식별자 (예 : div ID)는 다음과 같습니다.

  • 함유량
  • 블로그
  • 이야기

음수 식별자는 다음과 같습니다.

  • 논평
  • 논의하다

그리고 그들은 가능성이 없고 아마도 후보를 가지고 있습니다. 그들이 할 일은 사이트의 주요 콘텐츠가 될 가능성이 가장 높은 것을 결정하는 것입니다 678. 가독성 소스의 줄 을 참조하십시오 . 이것은 대부분 단락의 길이, 식별자 (위 참조), DOM 트리 (즉, 단락이 마지막 자식 노드 인 경우)를 분석하고 불필요한 모든 것을 제거하고 서식을 제거함으로써 수행됩니다.

코드에는 1792 줄이 있습니다. 사소한 문제처럼 보이지 않으므로 거기에서 영감을 얻을 수 있습니다.


2
그들의 코드가 오픈 소스이고 상용 제품에 사용될 수 있는지 알고 있습니까?
user300981

2
소스 코드는 Apache License 2.0에 따라 릴리스되어 있으므로이를 사용, 배포, 수정 및 수정 된 버전을 배포 할 수 있습니다. 나는 세부 사항에 대해 너무 명확하지 않습니다.
slhck

2
@bobsmith Apple은 최신 버전의 Safari에서 사용했습니다. 그들은 릴리스 노트에서 Arc90을 인정했습니다.
s4y

7

흥미 롭군. 비슷한 PHP 스크립트를 개발했습니다. 기본적으로 기사를 스캔하고 모든 텍스트에 품사를 첨부합니다 (Brill Tagger). 그러면 문법적으로 잘못된 문장이 즉시 제거됩니다. 그런 다음 대명사 또는 과거 시제의 갑작스런 변화는 기사가 끝났거나 아직 시작되지 않았 음을 나타냅니다. "Yahoo news sports finance"가 페이지에 10 번 나타나는 것처럼 반복되는 구문은 검색 및 제거됩니다. 다양한 감정과 관련된 수많은 단어 모음을 통해 톤에 대한 통계를 얻을 수도 있습니다. 능동적 / 부정적 / 금융 적에서 수동적 / 긍정적 / 정치적 톤으로의 갑작스러운 변화는 경계를 나타냅니다. 정말 끝이 없지만 깊이 파고 싶다면.

주요 문제는 링크, 포함 된 이상, 스크립팅 스타일 및 업데이트입니다.


3
이것은 실제로 정말 흥미로운 접근 방식처럼 들립니다. 공유 할 코드가 있습니까?
lsh

2
두 번째로, 코드를 둘러 볼 수있는 예제 코드 나 정보가 있습니까?
userabuser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.