Я смотрю на поиск очень коротких подстрок (узор, игла) во многих коротких строках текста (стога сена). Тем не менее, я не совсем уверен, какой метод использовать вне наивного метода грубой силы.
Фон: я делаю побочный проект для развлечения, где я получаю журналы чата для обмена сообщениями нескольких пользователей (в любом месте от 2000-15000 строк текста и до 2- 50 пользователей), и я хочу найти все различные совпадения шаблонов в журналах чата, основанных на предопределенных словах, которые я придумал. Пока у меня около 1600 моделей, которые я ищу, но я могу искать больше.
Так, например, я хочу найти количество слов, связанных с питанием, которые используются в среднем текстовом сообщении, таком как "гамбургер", "пицца", "кокс", "обед", "ужин", "ресторан" "," Макдоналдс". Пока я приводил английские примеры, я действительно буду использовать корейский язык для своей программы. Каждое из этих обозначенных слов будет иметь свой собственный балл, который я помещаю в хэш-карту как ключ и значение отдельно. Затем я показываю лучшие бомбардиры для слов, связанных с пищевыми продуктами, а также самые частые слова, используемые этими пользователями для пищевых слов.
Мой текущий метод - исключить каждую строку текста пробелами и обработать каждое отдельное слово из стога сена, используя метод contains (который использует метод indexOf и алгоритм поиска наивной подстроки) стога сена содержит шаблон.
wordFromInput.contains(wordFromPattern);
Чтобы привести пример, с 17 пользователями в чате, 13000 строк текста и 1600 паттернов, я обнаружил, что эта целая программа заняла 12-13 секунд с помощью этого метода. И в Android-приложении, которое я разрабатываю, для обработки потребовалось 2 минуты и 30 секунд, что слишком медленно.
Сначала я попытался использовать хэш-карту и просто получить шаблон вместо поиска его в ArrayList, но потом понял, что это...
для того, что я пытаюсь сделать с подстрокой.
Я просмотрел Stackoverflow и нашел много полезных и связанных вопросов, таких как эти два:
1 и 2. Я несколько больше знаком с различными строковыми алгоритмами (Boyer Moore, KMP и т.д.).
Сначала я подумал, что наивный метод, конечно, будет наихудшим типом алгоритма для моего случая, но, найдя этот вопрос, я понял, что мой случай (короткая диаграмма, короткий текст), может фактически быть более эффективным с наивным методом. Но я хотел знать, есть ли что-то, что я пренебрегаю полностью.
Вот фрагмент моего кода, хотя, если кто-то хочет увидеть мою проблему более конкретно.
В то время как я удалял большие части кода, чтобы упростить его, основной метод, который я использую для сопоставления подстрок, есть в методе matchWords().
Я знаю этот действительно уродливый и плохой код (5 для циклов...), поэтому, если есть какие-то предложения для этого, я тоже рад его слышать.
Итак, чтобы очистить его:
- строки текста из журналов чата (2000-10 000 +), haystack
- 1600+ узоры, иглы (и)
- в основном с использованием корейских символов, хотя некоторые английские включены
- Метод наивной наихудшей силы просто слишком медленный, но обсуждается, есть ли другие альтернативы и даже если есть, являются ли они практичными, учитывая характер коротких шаблонов и текста.
Я просто хочу внести свой вклад в мой мыслительный процесс и, возможно, в какой-то общий совет. Но, кроме того, я хотел бы получить какое-то конкретное предложение для конкретного алгоритма или метода, если это возможно.