내용별로 중복 PDF 파일 찾기

내용별로 중복 PDF 파일 찾기

일부 저널은 다운로드할 때마다 다른 PDF를 생성합니다. APS를 예로 들어보자시간과 IP 주소를 PDF로 저장합니다.

또는 하이퍼링크가 포함된 하드 카피와 텍스트 참조가 포함된 하드 카피가 있습니다.

오픈 소스 소프트웨어를 사용하여 Linux 시스템에서 90% 동일한 내용이 포함된 논문의 중복 다운로드를 찾는 방법은 무엇입니까?

저는 PDF 파일을 임시 디렉토리의 일반 텍스트로 변환하는 방법을 생각해 왔습니다 pdf2txt. 그런 다음 diff a bx줄을 초과하는 모든 파일 이름을 필터링할 수 있습니다 . 그러나 이는 전혀 우아하지 않으며 스캔한 출판물에서는 실패합니다. 저널은 일반적으로 오래된 출판물에 대해 OCR 텍스트를 제공하지 않습니다.

compare또한 ImageMagick 제품군을 사용해 보았지만 해당 도구를 사용하여 여러 페이지로 구성된 PDF 파일을 처리할 수 없었습니다.

차이점 PDF 2.1.1두 파일의 GUI에서는 훌륭하게 작동하지만 많은 파일에 적용하는 방법을 모르고 최신 버전은 오픈 소스 라이선스에 따라 사용할 수 없습니다.

답변1

출판사마다 PDF에 "태그"를 지정하기 위해 다양한 방법을 사용하므로 비교할 때 태그를 고려하지 않는 것이 좋습니다.

또한 동일한 PDF를 반복적으로 다운로드하고 제안한 대로 IP 및/또는 날짜-타임 스탬프로 태그를 지정하는 경우 새 PDF를 다운로드한 모든 PDF와 비교할 수 있는 효율적인 방법이 필요합니다. 각각의 새 PDF를 다운로드한 여러 PDF와 비교하기 위해 시간이 많이 걸리는 비교 메커니즘을 사용하고 싶지 않습니다.

필요한 것은 가능한 모든 토큰을 제거하고 나머지 데이터의 해시를 생성하는 유틸리티입니다. 간단한 파일에 있을 수 있는 해시 → 파일 이름 맵을 유지해야 합니다. 계산된 해시가 이미 파일에 있으면 복사본이 있습니다(그리고 해시가 아직 없으면 삭제하거나 필요한 모든 작업을 수행합니다). , 해시 값과 파일 이름을 추가합니다. 파일은 다음과 같습니다:

6fcb6969835d2db7742e81267437c432  /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9  /home/anthon/orders/your_order_20150320.pdf

파일은 원본 PDF에 비해 무시할 정도로 작습니다. 수백만 개의 PDF가 있는 경우 이 데이터를 데이터베이스에 저장하는 것을 고려할 수 있습니다. 효율성을 위해 파일 크기와 페이지 수( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*')를 포함할 수 있습니다.


위의 내용은 태그 제거 및 해시 생성에 대한 문제를 푸시합니다. 해시 생성 루틴을 호출할 때 PDF의 출처를 알고 있다면(즉, 프로그래밍 방식으로 다운로드하는 경우) 이를 기반으로 해시 생성을 미세 조정할 수 있습니다. 그러나 그렇지 않더라도 해시 생성에는 여러 가지 가능성이 있습니다.

  1. 제목 및 작성자 메타데이터가 비어 있지 않고 "Acrobat" 또는 "PDF"와 같은 불특정 문자열을 포함하지 않는 경우 작성자 및 제목 정보만을 기반으로 해시를 생성할 수 있습니다. pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum해시 값을 가져오는 데 사용됩니다 . 해시를 계산할 때 페이지 수(출력 Pages:에 " " )를 포함할 수도 있습니다 pdfinfo.
  2. 이전 규칙이 작동하지 않고 PDF에 이미지가 포함된 경우 이미지가 추출되고 결합된 이미지 데이터에 해시가 생성됩니다. 이미지의 바닥글이나 머리글에 텍스트가 포함된 경우(예: "Joe 사용자에게 라이선스가 부여됨") 해시를 계산하기 전에 상단이나 하단에서 X 줄을 제거하세요. 물론 완전히 검은색이 아닌 픽셀을 필터링하지 않는 한 마크가 큰 글자의 회색 배경 텍스트 안에 있는 경우에는 작동하지 않습니다 imagemagick. pdfimages를 사용하여 이미지 정보를 임시 파일로 추출 할 수 있습니다 .
  3. 이전 규칙이 작동하지 않는 경우(이미지가 없기 때문에) pdftext텍스트를 추출하고 태그를 필터링한 다음(너무 많이 필터링해도 문제가 되지 않음) 이를 기반으로 할 수 있습니다.

또한, 해시를 통해 발견된 기존 파일의 파일 크기가 일정 범위 내에 있는지를 새 파일과 비교할 수 있습니다. 문자열(IP/datetimestamp)의 압축 및 차이로 인해 발생하는 차이는 1% 미만이어야 합니다.

게시자가 해시를 결정할 때 사용한 방법을 알고 있다면 위의 "올바른" 방법을 직접 적용할 수 있지만, 그렇지 않더라도 메타데이터를 확인하고 일부 휴리스틱을 적용하거나 파일의 이미지 수를 확인하고 비교할 수 있습니다. 페이지 수에 따라 달라집니다(페이지가 가까우면 스캔으로 구성된 문서가 있을 가능성이 높습니다). pdftext스캔한 이미지 PDF에도 인식 가능한 출력이 있습니다.


내 작업의 기초로 다음 위치에 Python 패키지를 만들었습니다.비트 버킷및/또는 다음에서 설치할 수 있습니다.피콜린산사용 pip install ruamel.pdfdouble. 이는 pdfdbl메타데이터, 추출된 이미지 또는 텍스트에 대해 위의 검색을 수행하는 명령을 제공합니다 .아무런 필터링도 하지 않습니다표시(하지만), 그러나 추가 정보에는 이 콘텐츠를 추가하기 위해 향상시킬 방법(두 가지)이 설명되어 있습니다.

포함된 추가 정보 파일:

루아멜.pdf더블

이 패키지는 pdfdbl다음 명령을 제공합니다.

pdfdbl scan dir1 dir2

이는 인수로 제공된 디렉토리를 순회하고 발견된 PDF 파일에 대한 해시 기반(순서대로)을 생성합니다.

  • 메타데이터(고유한 경우)
  • 이미지 개수인 경우 이미지
  • 텍스트

pdfinfo, pdfimages 및 pdftotext`는 poppler-utils 패키지에서 사용할 수 있다고 가정합니다.

추가 스캔 테스트를 위한 "데이터베이스"를 구축하십시오 ~/.config/pdfdbl/pdf.lst.

마크 제거

ruamel/pdfdouble/pdfdouble.pyPDF의 태그 필터링 기능을 향상시켜 태그의 고유성을 떨어뜨리고 거의 동일한 파일이 서로 다른 해시를 갖도록 하는 두 가지 방법이 있습니다 .

PdfData.filter_for_marking텍스트의 경우 문자열에서 인수로 토큰을 제거하고 결과를 반환하도록 메서드를 확장해야 합니다 .

PdfData.process_image_and_update스캔한 이미지의 경우 이미지 하단과 상단의 X선을 잘라내고 모든 검정색 픽셀을 흰색으로 설정하여 회색 배경 텍스트를 제거하는 등 방법을 개선해야 합니다. 이 함수에는 .update()전달된 필터링된 데이터로 수신 해시를 업데이트하는 방법이 필요합니다.

한계

현재 "데이터베이스"는 개행 문자가 포함된 경로를 처리할 수 없습니다.

이 유틸리티는 현재 Python 2.7에서만 작동합니다.


reIP 준수 문자열 부분은 Python 모듈로 대체될 수 있습니다.

import re
IPre = re.compile("(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}"
              "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])")

x = IPre.sub(' ', 'abcd 132.234.0.2 ghi')
assert x == 'abcd   ghi'

답변2

pdftotext적어도 실제로 텍스트가 있는 컬렉션의 PDF에 대해서는(그렇지 않으면 OCR을 실행해야 함) 더 나은 도구를 사용하여 출력을 처리할 수 있는 또 다른 기회를 주고 싶습니다 .

diff(더러운) 텍스트 출력을 얻은 후에는 유사점을 확인하도록 설계된 프로그램을 통해 이를 실행하십시오( 광기의 빠른 경로가 될 수 있는 한 줄씩의 차이점 보다는 ).

Perl과 같은 것을 고려하십시오문자열::유사성또는심하쉬프로그램(Debian에서는 사용 가능하지만 Fedora/RHEL에서는 사용 가능하지 않음)

답변3

PDF에는 메타데이터가 포함되어 있습니다. 방금 여러 출판사의 몇 가지 물리학 관련 논문을 확인했는데 모두 최소한 "제목" 속성이 있습니다. 일부의 경우 제목이 출판물의 실제 제목이고, 일부의 경우 DOI 또는 유사한 식별자가 포함되어 있습니다. 그럼에도 불구하고 내가 조사한 모든 논문에는 제목이 포함되어 있었고 제목은 항상 해당 출판물마다 고유했습니다.

이를 사용하여 pdftkPDF의 메타데이터에 액세스하고 비교할 수 있습니다. 귀하의 목적에 따라 이것은 확실히 충분하며 pdftotext성능이 문제인 경우보다 훨씬 빠릅니다. 논문에 제목 메타데이터가 없어야 하는 경우에도 으로 대체할 수 있습니다 pdftotext.

추가 처리를 위해 모든 메타데이터를 텍스트 파일(또는 표준 출력)로 덤프합니다.

pdftk <PDF> dump_data output <TEXTFILE>

또는 더 많은 옵션을 보려면 설명서를 참조하세요.

시도하고 싶다면이미지 마술사그러나 여러 페이지가 문제를 일으킬 수 있습니다. 단일 페이지 추출을 compare사용하여 모든 페이지를 개별적으로 비교할 수도 있습니다 (단지 단일 페이지를 비교하는 것만으로도 충분할 수도 있음).pdftk

diff다음은 이 방법을 사용하여 여러 페이지로 구성된 PDF에 대해 PDF와 유사한 출력을 생성하는 코드 조각입니다.https://gist.github.com/mpg/3894692

답변4

다음은 토론에 대한 겸손한 기여입니다(부분 답변).

텍스트로 변환되면 다음을 사용하여 파일 유사성을 계산합니다(단어 차이를 기준으로).

wdiff -s -123 file1.txt file2.txt |    ## word difference statistics (1)
     grep -Po '(\d+)(?=% common)' |    ## 
     awk '{a+=$1}END{print a/2}'       ## (2)

(1)은 다음과 같은 결과를 생성합니다

file1.txt: 36 words  33 92% common  3 8% deleted  0 0% changed
file2.txt: 35 words  33 94% common  2 6% inserted  0 0% changed

(2) = 93

관련 정보