2010-05-13 22 views
5

Tek bir belge ile çok sayıda belgenin (n = 1 milyon) her biri arasındaki belge benzerliğini olabildiğince çabuk tespit etmeye çalışıyorum. Daha spesifik olarak, karşılaştırdığım belgeler e-postalardır; gruplandırılırlar (yani, klasörler veya etiketler vardır) ve hangi grubun yeni bir e-posta için en uygun olduğunu belirlemek isterim. Hızlı performans önemlidir.Çok hızlı belge benzerliği

Önsöz varsayımım, terim vektörleri arasındaki kosinüs benzerliğinin bu uygulama için uygun olmasıdır; Lütfen bunun kullanmanın iyi bir ölçü olup olmadığı hakkında yorum yapın!

Zaten, aşağıdaki olanaklar performansını hızlandırmak için dikkate almış:

  1. tüm terimi vektörleri

  2. her grup için bir terim vektörü hesaplayın (n + = 10,000) Ön normalize her e-posta yerine (n = = 1,000,000); Bu muhtemelen benim başvurum için kabul edilebilir olurdu, ancak bunu yapmamak için bir neden düşünebilirseniz, bana bildirin! Yeni bir e-posta önce önceki e-postaların birinde hiç görülmemiş yeni bir terim varsa ben yeniden gerek demek,

    1. :

    bir kaç sorum var Dönem vektörlerimin tüm hesaplamasını? Bu pahalı görünüyor.

  3. Yalnızca sorgu belgesine yakın olması muhtemel olan vektörleri dikkate almanın akıllıca bir yolu var mı?

  4. Tüm bu vektörler için kullanıyorum bellek miktarı hakkında daha tutumlu olmanın bir yolu var mı?

teşekkürler!

cevap

4

Bayesian filtering'u kullanın. Sağlanan bağlantı spam filtrelemeye başvurur, ancak algoritmayı kolayca birden çok kategoriye/etikete uyarlayabilirsiniz.

Pek çok iyi SO question about Bayesian filtering da vardır.

+0

Öneri için teşekkürler. Bayes filtreleme ilginç bir fikir. Birkaç sorum var: 1. Neden BF'nin bu örnek için kosinüs benzerliğinden daha iyi olduğunu düşünüyorsunuz? 2. Bir şey kaçırıyor olabilirim, ama kategorize etme zamanım hala n = kategori sayısı için O (n) değil, kosinüs benzerliği için olduğu gibi mi? İhtiyacım olan kategori adaylarını sıralamak için ihtiyacım olan şey bir O (log n) veya O (1) arama tablosu. – Peyton

+0

Buraya geldiğimde - şu anda problem için Bayes filtrelemeyi deniyorum - iyi bir fikir gibi görünüyor, bu yüzden bu cevabı kabul ediyorum. – Peyton