기사 나 게시물이 중복되는지 감지하기 위해 어떤 알고리즘을 사용할 수 있습니까?


17

기사 또는 포럼 게시물이 데이터베이스 내의 중복 항목인지 감지하려고합니다. 나는 내용을 복제 한 사람이 세 가지 중 하나를 사용하여 그렇게 할 것이라는 결론에 이르렀다.

  1. 간단한 복사로 전체 텍스트 붙여 넣기
  2. 텍스트의 일부를 자신의 텍스트와 병합하여 복사하여 붙여 넣기
  3. 외부 사이트에서 기사를 복사하고 자신의 것으로 위장

분석을위한 텍스트 준비

기본적으로 모든 이상 목표는 가능한 한 텍스트를 "순수한"것으로 만드는 것입니다. 보다 정확한 결과를 위해 텍스트는 다음과 같이 "표준화"됩니다.

  1. 중복 공백 제거 및 선행 및 후행 트리밍.
  2. 줄 바꾸기는 \ n으로 표준화됩니다.
  3. HTML 태그가 제거되었습니다.
  4. Daring Fireball URL이라는 RegEx를 사용하면 제거됩니다.
  5. 내 응용 프로그램에서 BB 코드를 사용하므로 계속됩니다.
  6. (ä) 양수 및 외국 (잉글랜드 제외)은 외국이 아닌 형태로 전환됩니다.

각 기사에 대한 정보를 (1) 통계표와 (2) 키워드 표에 저장합니다.

(1) 통계표 텍스트 내용에 대한 다음 통계가 저장됩니다 (이 게시물과 유사).

  1. 텍스트 길이
  2. 문자 수
  3. 단어 수
  4. 문장 수
  5. 문장 당 평균 단어
  6. 자동 가독성 지수
  7. 교활한 안개 점수

유럽 ​​언어의 경우 음절 계산을 사용하지 않으므로 Coleman-Liau 및 자동 가독성 지수를 사용해야하므로 합리적으로 정확한 점수를 산출해야합니다.

(2) 키워드 표

키워드는 'the', 'a', 'of', 'to'등과 같은 방대한 단어 (일반 단어)를 제외하여 생성됩니다.

샘플 데이터

  • text_length, 3963
  • letter_count, 3052
  • 단어 수, 684
  • sentence_count, 33
  • word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • 키워드 1, 사망
  • 키워드 2, 임원
  • 키워드 3, 경찰

기사가 업데이트되면 위의 모든 통계가 재생성되며 완전히 다른 값이 될 수 있습니다.

위의 정보를 사용하여 처음으로 게시 된 기사가 데이터베이스에 이미 존재하는지 감지하려면 어떻게해야합니까?


나는 디자인 할 것이 완벽하지 않을 것이라는 것을 알고 있습니다. 가장 큰 위험은 (1) 복제되지 않은 컨텐츠는 복제로 표시됩니다. (2) 시스템은 복제 컨텐츠를 통과시킵니다.

따라서 알고리즘은 중복 위험이없는 0에서 중복 가능성이 5이고 중복이 10 인 위험 평가 번호를 생성해야합니다. 5 이상이면 내용이 복제 될 가능성이 큽니다. 이 경우 내용은 중복 될 수있는 기사에 표시되고 링크 될 수 있으며 사람은 삭제할지 여부를 결정할 수 있습니다.

기사 전체에 키워드를 저장하기 전에 말씀 드렸듯이 단락 단위로 동일한 작업을 수행 할 수 있을지 궁금합니다. 이것은 또한 DB에서 내 데이터를 더 분리한다는 것을 의미하지만 초기 게시물에서 (2)를 쉽게 감지 할 수 있습니다.

통계간에 가중 평균을 생각하고 있지만 어떤 순서로 어떤 결과를 초래할까요?


정확히 일치하면 필드를 고유하게 설정할 수 있습니다. 그렇지 않은 경우 텍스트가 사본 또는 밀접하게 파생 된 작품으로 간주 될 수있는 시점을 결정해야합니다.
James P.

2
이러한 종류의 분석에는 여러 가지 방향이 있습니다. 사람들은 이런 종류의 주제에 관한 책을 씁니다. 목표가 "상대적 친밀감"을 결정하는 것이라면 선택의 여지가 거의 없지만 Natural Language Processing and Machine Learning 을 탐구하는 것 입니다. 그것이 컴퓨터 과학자들이 부르는 것이지만 실제로는 고급 통계 분석 일뿐입니다. 좋은 출발점은 레 벤슈 테인 거리를 보는 것 일지 모르지만 단어 / 문장 수와 같은 "멍청한"통계는 거의 도움이되지 않을 것입니다.
rdlowrey

1
또한 SO에서 마이그레이션하기 전에 [php] 태그가 지정되었으므로 PHP의 기본 levenshtein 함수
rdlowrey

사람의 검사를받는 것이 좋은 생각입니다. > 7이 중복되고 <6이 다르고 사람이 6 또는 7의 점수 만 갖도록 자동으로 결정할 수 있습니다. 스팸 식별에는 컴퓨터가 알지 못하는 사람이 있다는 것을 알고 있습니다 어느 카테고리도 모릅니다; 당신이 할 수있는 최선의 방법으로 거의 복제본과 원본 작품 사이의 회색 영역은 다소 임의적 인 판단을하는 것입니다.
GlenPeterson

@rdlowrey-Levenshtein 알고리즘은 내가 C #에서했던 비슷한 프로젝트에서 사용한 것입니다. 나는 시작하기에 좋은 곳이며 충분할 수도 있다는 데 동의합니다.
jfrankcarr

답변:


4

NLP의 문서 유사성을 처리하는 많은 알고리즘 이 있습니다 . 다음은 다양한 알고리즘을 설명 하는 중요한 논문 입니다. 또한 wikipedia 에는 더 큰 컬렉션이 있습니다. 저는 Jaro Winkler 측정 값을 선호하고이를 종합적인 클러스터링 방법으로 대학원 프로젝트에 사용했습니다.


6

Rabin-Karp algborithm을 살펴보십시오 . 그것은 사용하는 롤링 해시를 동기화 동안 전송 된 바이트 수를 최소화하기 위해 사용 된 Rsync처럼 다소. 해시에 사용하는 창의 크기를 조정하면 다소 민감하게 만들 수 있습니다. RK는 무엇보다도 기본적으로 일종의 속임수를 찾는 표절 탐지에 사용됩니다.


4
OP가 설명하는 문제는 표절 탐지 와 똑같아 보이며 , 먼저 도움을 구할 것을 제안합니다. (그냥 당신의 출처를 확인하십시오!)
Caleb

4

첫 번째로 문장 (또는 다른 적당한 데이터 블록)을 탐지 할 수 있습니다. 해당 블록을 가져와 모든 메타 데이터, html 임의 공백, 반환 등을 제거하십시오. 결과의 MD5를 가져 와서 테이블에 저장하십시오. 그런 다음이 블록과 일치하여 일치하는 것을 찾으십시오.

이것이 작동하지 않으면 n 그램을 시도 할 수 있습니다. 여기에는 페이지에 각 단어를 한 개씩 입력해야하지만 꽤 잘 일치 할 수 있습니다.

http://en.wikipedia.org/wiki/N-gram


n-grams 기반 측정은 특히 html과 같은 반 구조화 된 데이터의 경우 md5 해시보다 훨씬 좋습니다.
Candide

1

정확한 수학 수학을 위해 해시를 저장하고 비교합니다.

시험에 사용되는 시스템은 단어 그룹과 각 크기의 그룹 빈도를 측정한다고 생각합니다. 예를 들어, 복사 된 30 개의 단어 체인은 5 개의 위험 점수를, 5 개의 단어 체인은 5 개의 점수를 기록했습니다. 그런 다음 500 단어 당 30 점의 타협을 잡을 수 있습니다.

실제로 '또한'및 'and'와 같은 단어가 동일하게 구문 분석되도록 의미 알고리즘이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.