Концепція пошуку нечіткого пошуку в базі даних


13

Я думав про це і намагався придумати рішення, як нечітко шукати базу даних, якщо, наприклад, користувач вводить орфографічну помилку. Якісь гострі проблеми з логікою, що стоїть за цим? Чи буде це працювати і чи робилося це раніше?

Наша таблиця, яку ми хочемо шукати:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Тому ми зберігаємо неочищений текстовий корпус для фізичного відображення. Інші 2 стовпці використовуються для пошуку, які попередньо обчислюються наступним чином:

Soundex

Body розбито на слова, і перекладено на його звукову версію. IE, в результаті орган може бути чимось на зразок:

H252 B54 C23 E33... etc

Тож хтось може ввести "динозора", і тіло статті читає "динозавра", і те і інше оцінюють за B26. Потім ми запускаємо LIKE на звукову величину пошукової фрази.

Персонаж закодований

З огляду на символьне відображення, яке відображає символи до простих чисел, 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

Якщо користувач мав намір ввести "привіт", але він перемикав два або більше символів, наприклад "hlelo", він оцінював би те саме число. Розділіть сировину на слова, просто кодуйте кожне слово та зберігайте в базі даних, надаючи поле, яке виглядає так:

330 6825 330 1050... etc

Тоді ми можемо любити пошук за цим значенням, щоб відповідати помилкам.

Переваги

  • Опечатки захищені від
  • Фонетично неправильні написання захищені від
  • Більше не рідний англійський розмовний дружній
  • Працюватиме будь-якою мовою (де працює звуковий файл)

Коментарі та думки? Сорт багатошарового пошуку. Ви, звичайно, можете повернути вагові значення, щоб зробити його ще кращим (IE буквальна відповідність тексту тексту вартує більше), але чи це хороше рішення для написання помилок написання тексту та інших носіїв англійської мови, які роблять пошук?


Було б цікаво подивитися, як це порівнюється з пошуком Trigram.
Багатий

Я хотів би мати щось подібне для wordpress ...
Kit Menke

Чи використання прайметів для вашої функції хешування унеможливлює зіткнення слів, які не містять однакових методів? Здається, що має бути можливим мати довге слово з великою кількістю малоцінних букв до нього, яке хешируется на те саме значення, що і коротке слово з кількома великими літерами, але я не знаю багато теорії чисел так це, мабуть, добре доведено так чи інакше ...
glenatron

1
@Glen Afaik множення простих чисел разом завжди генерує унікальне число. Анаграми зіткнуться, однак, але idk, скільки проблеми є, в основному, справа в тому, щоб швидко знайти анаграми.
Том

@Glen: Дивіться унікальну теорему факторизації про унікальність.
Стівен Еверс

Відповіді:


2

Існує ряд інших алгоритмів пошуку. Сміт-Уотерман є одним з кращих для людського тексту, тоді як BLAST є (поки що) найкращим для пошуку послідовностей ДНК. Коли вам подають текст з різними орфографічними помилками, такими як hlepзамість них help, ви шукаєте мінімальну відстань редагування .

Щоб бібліотека реалізувала ряд цих функцій у CLR в SQL Server 2005 (і пізніших версіях), подивіться на проект початкової формати SimMetrics . Повідомлення в блозі про SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex був розроблений тому, що первинні відмінності між регіональними варіантами мовлення були майже виключно в голосних - саме тому він викидає голосні звуки. Не годиться справлятися із перекладеними листами.


2

Apache Solr, підтримує синоніми та правописні виправлення, хоча все ще трохи грубі по краях.

Нечіткі пошуки можна реалізувати за допомогою Ngrams,

Портер Стеммер: http://tartarus.org/~martin/PorterStemmer/

та мовна база даних, наприклад http://wordnet.princeton.edu/

... але такі проекти, як Xapian і Solr, справляють багато з вас.

Якщо ви хочете створити свій власний розбір / пошуковий механізм пошуку слова, я б запропонував розмістити маркери або терміни, які ви створюєте, у існуючу базу даних, яка призначена для пошуку мови.


1

Нещодавно я зробив щось подібне назад для адрес, які б перевірили, скільки змін знадобиться, щоб перетворити одну рядок в іншу рядок і повернути числове значення між 0 і 1 щодо того, наскільки тісно відповідність обох.

Він працював великий , так як він буде повертати велике значення для таких елементів, як N / North, St / Street, Істмен / MainEast і т.д. Ідея прийшла з цього посилання CodeProject


Чи відповідає код, який ви написали для адреси, з відкритим кодом?
Це питання

@Thismatters У мене немає доступу до коду, але посилання у моїй відповіді повинно містити логіку для цього. По суті, ви просто хочете побачити, скільки змін знадобиться, щоб перетворити один рядок в інший, і чим менше змін, тим ближче вони
Рейчел,

0

Якщо ви співпадаєте з іменами чи людьми чи місцями, список синонімів може працювати набагато краще.

Soundex не відповідає "Дік == Річард", "Кіт == Крістофер" або "Пані. == місіс".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.