Makalelerin veya yayınların kopya olup olmadığını tespit etmek için hangi algoritmaları kullanabilirim?


17

Bir makale veya forum gönderisi veritabanı içinde yinelenen bir giriş olup olmadığını tespit etmeye çalışıyorum. Bunu biraz düşündüm, içeriği çoğaltan birisinin üçünden birini kullanarak tespit edeceği sonucuna vardım (tespit edilmesi zor inenlerde):

  1. tüm metni basit kopyala yapıştır
  2. kendi bölümleriyle birleştiren metnin bölümlerini kopyalayıp yapıştırma
  3. harici bir siteden bir makaleyi kopyalamak ve kendilerine ait bir maskeli balo

Metni Analiz İçin Hazırlama

Temel olarak herhangi bir anomali; amaç metni olabildiğince "saf" hale getirmektir. Daha doğru sonuçlar için metin şu şekilde "standartlaştırılır":

  1. Yinelenen beyaz boşlukları sıyırma ve önde gelen ve sondaki kırpma.
  2. Yeni satırlar \ n olarak standartlaştırılmıştır.
  3. HTML etiketleri kaldırıldı.
  4. Daring Fireball adlı bir RegEx kullanıldığında URL'ler çıkarılır.
  5. Uygulamamda BB kodunu kullanıyorum.
  6. (ä) ccented ve yabancı (Enlgish dışında) yabancı olmayan biçimlerine dönüştürülür.

Her makale hakkındaki bilgileri (1) istatistik tablosunda ve (2) anahtar kelimeler tablosunda depolarım.

(1) İstatistik Tablosu Metin içeriği hakkında aşağıdaki istatistikler saklanır (bu gönderiye çok benzer)

  1. metin uzunluğu
  2. harf sayısı
  3. sözcük sayısı
  4. cümle sayısı
  5. cümle başına ortalama kelimeler
  6. otomatik okunabilirlik endeksi
  7. gunning sis skoru

Avrupa dilleri için hece sayımı kullanmadığından Coleman-Liau ve Otomatik Okunabilirlik Endeksi kullanılmalıdır, bu nedenle makul derecede doğru bir puan üretilmelidir.

(2) Anahtar Kelimeler Tablosu

Anahtar kelimeler, çok sayıda durdurma kelimesi listesi (yaygın kelimeler), ör. ',', 'A', '', 'ila' vb.

Örnek veri

  • metin_uzunluğu, 3963
  • letter_count, 3052
  • kelime_sayısı, 684
  • cümle_sayısı, 33
  • word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • anahtar kelime 1, öldürüldü
  • anahtar kelime 2, memurlar
  • anahtar kelime 3, polis

Bir makale güncellendiğinde, yukarıdaki tüm istatistiklerin yeniden oluşturulduğu ve tamamen farklı değerler olabileceği unutulmamalıdır.

İlk kez yayınlanan bir makalenin veritabanında zaten var olup olmadığını belirlemek için yukarıdaki bilgileri nasıl kullanabilirim?


Tasarım yapacağım her şeyin mükemmel olmayacağının farkındayım, en büyük risk (1) Yinelenmeyen içerik yinelenen olarak işaretlenecek (2) Sistem yinelenen içeriğe izin veriyor.

Bu nedenle algoritma, 0'dan hiçbir yinelenen risk 5'in yinelenmemesi ve 10'un yinelenmesinden bir risk değerlendirme numarası üretmelidir. 5'in üstündeki herhangi bir şey, içeriğin yinelenme olasılığı yüksektir. Bu durumda içerik işaretlenebilir ve olası kopyalar olan makalelere bağlanabilir ve bir insan silinip silinmeyeceğine veya izin verilip verilmeyeceğine karar verebilir.

Daha önce de söylediğim gibi, tüm makale için anahtar kelimeler saklıyorum, ancak paragraf bazında da aynı şeyi yapabilir miyim merak ediyorum; bu aynı zamanda DB'deki verilerimin daha da ayrılması anlamına gelecektir, ancak aynı zamanda ilk yazımda (2) tespitini de kolaylaştıracaktır.

İstatistikler arasında ağırlıklı ortalama düşünüyorum, ama hangi sırayla ve sonuçların ne olacağını ...


Tam eşleşme ise, bir alanı benzersiz olarak ayarlayabilirsiniz. Değilse, metnin hangi noktada bir kopya veya yakından türetilmiş bir çalışma olarak değerlendirilebileceğine karar vermeniz gerekir.
James P.

2
Bu tür analizin gidebileceği birçok yön vardır. İnsanlar bu tür bir konu üzerine tüm kitapları yazarlar. Amacınız "göreceli yakınlığı" belirlemekse, Doğal Dil İşleme ve Makine Öğrenimi olarak adlandırmaktan başka çok az seçeneğiniz vardır . Bilgisayar bilimcileri böyle diyor, ama gerçekten sadece gelişmiş istatistiksel analiz. İyi bir başlangıç ​​noktası levenshtein mesafelerine bakmak olabilir, ancak kelime / cümle sayıları gibi "aptal" istatistikler sizin için çok az şey yapar.
rdlowrey

1
Ayrıca, SO'dan taşınmadan önce bu [php] olarak etiketlendi, bu yüzden php'nin doğal levenshtein işlevini kontrol edebilirsiniz
rdlowrey

Bir insan kontrol olası kopyaları için harika bir fikir! Otomatik olarak> 7'nin bir kopya olduğuna ve <6'nın farklı olduğuna ve yalnızca 6 veya 7 puanlarını kontrol eden insanlara sahip olduğuna otomatik olarak karar verebilirsiniz. her iki kategoriyi de bilmiyor; yakın bir kopya ile orijinal iş arasında gri bir alan yapabileceğiniz en iyi şey biraz keyfi bir karar arama yapmaktır.
GlenPeterson

@rdlowrey - Levenshtein algoritmaları C # 'de yaptığım benzer bir projede kullandığım şeydir. Katılıyorum, başlamak için iyi bir yer ve yeterli olabilir.
jfrankcarr

Yanıtlar:


4

Orada birçok NLP doküman benzerliği ile anlaşma algoritmaları. İşte çeşitli algoritmaları tanımlayan bir seminal çalışma . Ayrıca wikipedia daha geniş bir koleksiyona sahiptir. Jaro Winkler önlemini destekliyorum ve aglomeratif kümeleme yöntemlerinde grad okul projeleri için kullandım.


6

Rabin-Karp algborithm'ine bir göz atın . Senkronizasyon sırasında iletilen baytları en aza indirmek için rsync'in kullandığı bir haddeleme karması kullanır. Karma için kullandığınız pencerenin boyutunu ayarlayarak pencereyi daha fazla veya daha az hassas hale getirebilirsiniz. RK, diğer şeylerin yanı sıra, temelde bir tür dupes arayan intihal tespiti için kullanılır.


4
OP'nin açıkladığı sorun intihal algılaması gibi görünüyor ve bunu ilk yardım yeri olarak öneriyorum. (Sadece kaynaklarınızı belirlediğinizden emin olun!)
Caleb

4

Bu ilk kez cümleleri (veya başka bir makul veri bloğunu tespit etmek olabilir. Bu blokları alın ve herhangi bir mete verisini, html rastgele beyaz alanı, geri dönüşleri vb. daha sonra eşleşmeleri bulmak için bu bloklarla eşleştirin.

Bu işe yaramazsa n-gram deneyebilirsiniz. Burada sayfadaki her kelimenin bir girişine ihtiyacınız var, ancak size oldukça iyi eşleşmeler verebilmelidir.

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


n-gram tabanlı ölçümler, özellikle html gibi yarı yapılandırılmış veriler için md5 karma değerlerinden çok daha iyidir.
Candide

1

Tam bir matematik matematiği için bir hash saklar ve bunu karşılaştırırdım.

Sınavlarda kullanılan sistemlerin kelime gruplarını ve sonra her büyüklükteki grupların sıklığını ölçtüğünü düşünüyorum. Örneğin, kopyalanan 30 kelimelik bir zincir 5 risk puanı ve 10 kelime zincirinin 5 oluşumu 5 puan alır. Sonra 500 kelime başına 30 puanlık bir harman tutabilirsiniz.

Gerçekten de semantik bir algoritmaya ihtiyacınız vardır, böylece 'also' ve 've' gibi kelimeler aynı şekilde ayrıştırılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.