Писане на алгоритъм за търсене на публикации

Опитвам се да напиша алгоритъм за безплатно търсене на текст за намиране на конкретни публикации на стена (подобен вид стена, използван от Facebook). Предполага се, че потребителят може да напише няколко думи в полето за търсене и да получи попадения на публикации, които съдържат думите; с най-доброто съвпадение отгоре и след това други публикации в низходящ ред според резултата на съвпадението.

Използвам разстоянието за редактиране (Левенщайн) „e(x, y) = e“, за да изчисля резултата за всяка публикация в сравнение с думата за заявка „x“ и думата за публикация „y“ според: score(x, y ) = 2^(2 - e)(1 - min(e, |x|) / |x|), където "|x|" е броят на буквите в думата за заявка.

Всяка дума в публикация допринася за общия резултат за тази конкретна публикация. Този подход изглежда работи добре, когато публикациите са с приблизително еднакъв размер, но понякога определени големи публикации успяват да натрупат резултат единствено поради наличието на много думи в тях, като на практика не са подходящи за заявката.

Подхождам ли към този проблем по грешен начин или има някакъв начин за нормализиране на резултата, за който не съм се сетил?


person MdaG    schedule 27.05.2010    source източник


Отговори (1)


да Има много методи за нормализиране, които можете да използвате. Това е добре проучена област!

Разгледайте модела на векторното пространство. TDF/IDF може да е от значение за това, което правите. Не е тясно свързано с метода, който използвате, но може да ви даде някои примери за нормализиране.

Също така имайте предвид, че сравняването на всяка публикация ще бъде O(N) и може да стане много бавно. Вместо string-distance, може да имате по-добри резултати с stemmming. След това можете да поставите това във VSM обърнат индекс.

Много бази данни (включително MySQL и Postgres) имат пълнотекстово търсене. Това вероятно е по-практично, отколкото да го направите сами.

person Joe    schedule 27.05.2010
comment
Благодаря ви, tf-idf изглежда обещаващо. Просто трябва да го приложа към моя проблем, тъй като заявката за търсене, която използвам, може да се състои от няколко думи, чието появяване трябва да е по-важно, ако съществуват в една и съща публикация. Броят на публикациите в стената е доста скромен (максимум 10 000 публикации), но тъй като трябва да сравня всяка дума за търсене с всички думи във всички публикации, получавам O(N^3)... Може би е по-лесно просто да използвам вместо това пълнотекстово търсене е включено в базата данни на MS SQL 2008. Причината, поради която започнах да го разглеждам, беше, че исках размито търсене на думи, но може би базата данни може да се справи с това? - person MdaG; 27.05.2010
comment
Не знам за MSSQL, но Postgres е много добър и много персонализиран. Опитах се да направя нещо подобно на вас (размито съвпадение на низ върху документи, но не и текст). Текущото решение е да се раздели алгоритъмът за размито съвпадение в центъра и да се постави търсене във векторно пространство в средата. Изглежда, че работи за мен! folktunefinder.com - person Joe; 27.05.2010