2010-07-11 2 views
1

Мне нужно фильтровать поток текстовых статей, проверяя каждую запись для нечетких совпадений предопределенной строки (я искал имена продуктов с орфографическими ошибками, иногда они имеют разный порядок слов и лишних буквенных символов например «:» или «,»).Нечеткий поиск во время выполнения без использования базы данных index

Я получаю отличные результаты, помещая эти статьи в индекс sphinx и выполняя поиск по нему, но, к сожалению, я получаю сотни статей каждую секунду и обновляю индекс после того, как каждая статья слишком медленная (и я понимаю, что она не предназначена для таких задача). Мне нужна библиотека, которая может построить в памяти индекс малого ~ 100 КБ текста и выполнять нечеткий поиск на нем, что-то вроде этого существует?

ответ

1

Эта проблема почти идентична Bayesian spam filtering, и уже написанные инструменты, которые могут быть обучены распознавать в соответствии с вашими критериями.

добавлен в ответ на комментарий:

Так как вы разбивая поток в бункерах сейчас? Если у вас уже есть состав разделенных статей, просто подайте это в классификатор. Байесовские классификаторы - это способ нечеткого соответствия содержания в контексте и могут классифицировать все от спама до нуклеотидов до астрономических спектральных категорий.

Вы можете использовать менее стохастические методы (например, Levenshtein), но в какой-то момент вам нужно описать разницу между хитами и промахами. Красота байесовских методов, особенно если у вас уже есть разделенный корпус в руке, заключается в том, что вам действительно не нужно четко знать, как вы классифицируете.

+0

Thx, это очень яркая идея, но, к сожалению, сейчас я не могу обучить фильтры и фильтрация AFAIK байесовский не будет хорошо работать в течение длительного (6-7 слов) строки поиска. – Riz

+0

FAYK неверен. По-видимому, не только у вас нет времени на подготовку фильтров, но у вас нет времени на RTFWA. – msw

+0

LOL, не поймите меня неправильно, я не имел в виду, что я слишком ленив, чтобы тренировать фильтры (или читать wikipedia), но количество этих фильтров может быть довольно большим (поэтому я не могу подготовить набор обученного фильтра для всех) и создание цикла «добавить фильтр - проверка - поезд - повторение» - не лучшее решение для моей задачи (конечные пользователи предпочтут получить неправильные результаты, а не тратят больше времени на учебные фильтры). Что касается длинных строк поиска, я могу ошибаться, это просто личный опыт использования фильтрации байесовского спама в моем почтовом клиенте :) – Riz

1

Как насчет использования расширения sqlite fts3?

CREATE VIRTUAL TABLE enrondata1 ИСПОЛЬЗОВАНИЕ fts3 (content TEXT);

(Вы можете создать любое количество столбцов - все они будут проиндексированы)

После этого вы вводите все, что вам нравится, и можете найти его без восстановления индекса - соответствие либо конкретного столбца или всего ряд.

(http://www.sqlite.org/fts3.html)

+0

Thx для предложения, играемого с sqlite для бит, с использованием fts3 с портьером tokenizer дает действительно хорошие результаты, но он не работает для случаев, когда строка поиска похожа на «Toy Story 3 something», а текст содержит «История игрушек 3 some_other_word» :( – Riz

Смежные вопросы