Я ищу систему текстового поиска для нетрадиционного вида текстового поиска и хочу получить совет о том, какой инструмент (Lucene, Sphinx, Xapian или что-то еще) наиболее подходит для меня, а также указатели о том, где начать.
У меня есть молекулы, представленные в виде графиков (атомы и связь). У меня есть способ перечислить все подграфы до размера k. Будучи техническими, входными данными являются SMILES , а выходными данными является канонический SMARTS и количество раз, которое встречается каждый подграф / SMARTS.
Например, если входная молекула " CCO ", то канонические результаты: {"C": 2, "O": 1, "CC": 1, "OC": 1, "CCO": 1} и если молекула " SCO ", то канонические результаты: {"C": 1, "S": 1, "O": 1, "CS": 1, "OC": 1, "SCO": 1}. Это крошечные примеры. Для реальной молекулы я получил около 500 «слов», которые выглядят как «CC (C) O», «CCCOCC», «cn» и «cccc (c) O».
Рассмотрение молекул как совокупности характерных строк плюс число означает, что я должен иметь возможность использовать инструмент текстового поиска для сравнения на уровне текста с надеждой, что они значимы на уровне химии.
Например, я могу использовать косинусное сходство , возможно, с весом tf-idf и находить похожие молекулы, ища аналогичные субпаттерны. В приведенных выше примерах "CCO" и "SCO" косинусное сходство составляет (2 * 1 + 1 * 1 + 1 * 1) / sqrt (2 * 2 + 1 * 1 + 1 * 1 + 1 * 1 + 1 * 1) / кв.м (6 * (1 * 1)) = 4 / кв.м (8 * 6) = 0,58.
В другом примере, если я хочу найти молекулы, которые содержат субструктуру "CCS", тогда я могу выполнить быстрый поиск по инвертированному индексу на основе подсчета (молекулы должны иметь по крайней мере 2 "C", по крайней мере, 1 " CS "и т. Д.) До решения проблемы изоморфизма подграфа NP. То есть текстовые методы могут выступать в качестве фильтра для отклонения очевидных несоответствий.
Я пытаюсь выяснить текстовые решения, которые существуют, но это немного сложно. Мне не нужны стоп-слова, мне не нужно останавливаться, мне нет дела до порядка слов; Мне не нужно много функций, которые существуют. Мне нужна возможность сохранять векторы слов, так как важно знать, появляется ли буква «С» 2 раза или 3 раза.
Какая система текстового поиска мне больше всего подходит? Похоже на Lucene, особенно с работой в Mahout. Можете ли вы порекомендовать, какие части документации посмотреть или соответствующие руководства? Те, что я нашел, предназначены для полнотекстового поиска, с основами и другими функциями, которые мне не нужны.