Нечеткий поиск во время выполнения без использования базы данных \ индекса

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

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


person Riz    schedule 11.07.2010    source источник


Ответы (2)


Эта проблема почти идентична байесовской фильтрации спама, и инструменты, уже написанные для этого, можно просто обучить распознавать по вашим критериям.

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

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

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

person msw    schedule 11.07.2010
comment
Спасибо, это очень яркая идея, но, к сожалению, сейчас я не могу обучать фильтры, и AFAIK байесовская фильтрация не будет работать для длинных (6-7 слов) строк поиска. - person Riz; 11.07.2010
comment
ФАЙК неверен. Видно не только нет времени обучать фильтры, но и нет времени на RTFWA. - person msw; 11.07.2010
comment
LOL, не поймите меня неправильно, я не имел в виду, что мне лень обучать фильтры (или читать википедию), но количество этих фильтров может быть довольно большим (поэтому я не могу подготовить набор обученных фильтров для всех) и создание цикла «добавить фильтр - проверка - обучение - повторить» - не лучшее решение для моей задачи (конечные пользователи предпочли бы получить некоторые неправильные результаты, а не тратить больше времени на обучение фильтров). Что касается длинных строк поиска, я могу ошибаться, это просто личный опыт использования байесовской фильтрации спама в моем почтовом клиенте :) - person Riz; 11.07.2010
comment
Я использую простой строковый поиск и помечаю статьи вручную :) В любом случае - спасибо за предложение, я обязательно попробую поиграть с текущими данными, так как у меня уже есть наборы правильных и неправильных данных (не знаю, достаточно ли у меня данных для создания хорошие правила). Любые рекомендации по библиотекам Python? - person Riz; 12.07.2010
comment
На ум приходит nltk.org, который доставит вас туда (и сотни других мест), но, вероятно, есть что-то еще сосредоточены на PyPi: pypi.python.org/ - person msw; 12.07.2010

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

СОЗДАТЬ ВИРТУАЛЬНУЮ ТАБЛИЦУ enrondata1 ИСПОЛЬЗУЯ fts3 (ТЕКСТ содержимого);

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

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

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

person t7ko    schedule 11.07.2010
comment
Спасибо за предложение, немного поигрался с sqlite, использование fts3 с токенизатором портера дает действительно хорошие результаты, но он не работает для случаев, когда строка поиска похожа на Toy Story 3 something, а текст содержит Toy Story 3 some_other_word :( - person Riz; 12.07.2010