Veritabanı bulanık arama kavramı


13

Bunu düşündüm ve örneğin bir kullanıcı bir yazım hatası yazarsa, bir veritabanında bulanık arama nasıl çözümler bulmaya çalışıyorum. Bunun arkasındaki mantıkla ilgili göze çarpan sorunlar var mı? Çalışacak mı ve daha önce yapıldı mı?

Aramak istediğimiz masamız:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Bu yüzden fiziksel metin için ham metin gövdesini saklıyoruz. Diğer 2 sütun, aşağıdaki şekilde önceden hesaplanan aramalar için kullanılır:

Soundex

Beden kelimelere bölünür ve soundex versiyonuna çevrilir. IE;

H252 B54 C23 E33... etc

Yani birisi 'dinosore' girebilir ve makale gövdesi 'dinozor'u okur, her ikisi de B26 için değerlendirir. Daha sonra arama teriminin soundex değeri üzerinde bir LIKE çalıştırırız.

Karakter Kodlu

Karakterleri asal sayılara eşleyen bir karakter eşlemesi verildiğinde IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Bir kullanıcı 'merhaba' yazmak istiyorsa, ancak iki veya daha fazla karakteri değiştirdiyse, örneğin 'hlelo', aynı sayıya bakar. Ham gövdeyi kelimelere ayırın, her kelimeyi hazırlayın ve veritabanında saklayın, size benzeyen bir alan sağlayın:

330 6825 330 1050... etc

Daha sonra bu değeri arama ile metrikleri eşleştirebiliriz.

Yararları

  • Yazmaya karşı korumalı yazım hataları
  • Fonetik yanlış yazımlar
  • Daha anadili İngilizce konuşma dostu
  • Herhangi bir dilde çalışır (soundex'in çalıştığı yerde)

Yorumlar ve düşünceler? Bir çeşit çok katmanlı arama. Tabii ki daha iyi hale getirmek için ağırlık değerlerini geri alabilirsiniz (IE gerçek bir metin beden eşleşmesi daha değerlidir), ancak bu yazım hataları ve arama yapamayan anadili İngilizce olmayanlar için iyi bir çözüm müdür?


Bunun Trigram Arama ile nasıl karşılaştırıldığını görmek ilginç olurdu.
Zengin

Wordpress için böyle bir şeye sahip olmak isterdim ...
Kit Menke

Karma işleviniz için primer kullanmak aynı yöntemleri içermeyen kelime çarpışmalarını imkansız hale getiriyor mu? Görünüşe göre, birkaç yüksek değerli harfe sahip kısa bir kelimeyle aynı değere sahip çok sayıda düşük değerli harf içeren uzun bir kelimeye sahip olmak mümkün olmalı, ancak çok fazla sayı teorisi bilmiyorum muhtemelen şu ya da bu şekilde kanıtlanmış ...
glenatron

1
@Alen Afaik, primerlerin birlikte çoğaltılması her zaman benzersiz bir sayı üretir. Anagramlar çarpışacak ama ne kadar sorun olduğunu idrak edin, temelde anagramları hızlı bir şekilde bulmak budur.
Tom

@Glen: Benzersizlik için benzersiz çarpanlara ayırma teoremine bakın.
Steven Evers

Yanıtlar:


2

Bir dizi başka arama algoritması var. Smith-Waterman insan metni için daha iyi olanlardan biridir, BLAST (şimdiye kadar) DNA dizilerini aramak için en iyisidir. hlepBunun yerine çeşitli yazım hataları içeren bir metin görüntülendiğinde help, minimum düzenleme mesafesini arıyorsunuz .

Bir kütüphanenin SQL Server 2005'te (ve üstü) CLR'de bu işlevlerin bir kısmını uygulaması için, kaynak forge projesi SimMetrics'e bakın . SimMetrics hakkında blog yazısı . http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex geliştirildi, çünkü bölgesel konuşma varyasyonları arasındaki temel farklar neredeyse sadece ünlülerdeydi - bu yüzden ünlüleri fırlatır. Aktarılmış harflerle başa çıkmak iyi değildir.


2

Apache Solr, eşanlamlıları ve yazım düzeltmelerini destekler - yine de kenarlarda biraz pürüzlü olsa da.

Bulanık Aramalar Ngramlar kullanılarak gerçekleştirilebilir,

Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/

ve http://wordnet.princeton.edu/ gibi bir dil veritabanı

... ama Xapian ve Solr gibi projeler bunun çoğunu sizin için halleder.

Kendi kelime arama terim ayrıştırma / arama motorunuzu oluşturmak istiyorsanız, oluşturduğunuz belirteçleri veya terimleri dil araması yapmak için tasarlanmış mevcut bir veritabanına koymanızı öneririm.


1

Böyle bir şey bir süre geri bir dizeyi başka bir dizeye dönüştürmek için kaç değişiklik alacağını kontrol eder ve ne kadar yakından eşleşen iki ve 1 arasında sayısal bir değer döndürecek adresler için bir süre yaptım.

N / North, St / Street, EastMain / MainEast, vb. Öğeler için yüksek bir değer döndüreceği için harika çalıştı. Fikir bu CodeProject bağlantısından geldi


Adres eşleme için yazdığınız kod açık kaynak mı?
Thismatters

@Thismatters Ben kod erişimi yok, ama benim cevap bağlantı bunun için mantık sağlamalıdır. Temel olarak, bir dizeyi diğerine dönüştürmek için kaç değişikliğin gerektiğini ve daha az değişiklik daha yakın olduklarını görmek istersiniz
Rachel

0

Adları, kişileri veya yerleri eşleştiriyorsanız, eşanlamlılar listesi çok daha iyi çalışabilir.

Soundex, "Dick == Richard" "Kit == Christopher" veya "Ms. == Bayan" ile eşleşmez.

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.