#ruby-on-rails #regex #twilio
#ruby-on-rails #регулярное выражение #twilio
Вопрос:
Я создаю приложение, которое принимает входные данные из текста SMS через Twilio. Я хотел бы создать таблицу, которая соответствует тексту входящего SMS с соответствующим ответом.
Например, представьте, что я создаю текстовое сообщение NFL.
Кто-то пишет «Краснокожие», а мы отвечаем: «Краснокожие играют на поле FedEx», кто-то пишет «Колтс», и мы отвечаем: «Колтс — гордость Индианы».
Вот сложная часть:
Конечно, нашему приложению Rails потребуется интерпретировать входящие названия команд с помощью регулярных выражений, поскольку многие пользователи будут вводить текст: Redskins или КРАСНОКОЖИЕ, или КРАСНОКОЖИЙ, или краснокожий, или краснокожий…..
С помощью одной или двух команд можно было бы просто жестко запрограммировать регулярное выражение и ответ в контроллере…но с 30 командами это кажется неправильным. (А со 120 записями — скажем, all pro sports — еще хуже).
Есть ли у кого-нибудь какие-либо советы по получению имен команд на этапе ввода через этап таблицы DB с преобразованием ‘RegExp’ в середине?
Заранее спасибо.
Ответ №1:
для небольшого количества ключевых слов я рекомендую подход с двумя таблицами с ключевыми словами и псевдонимами, всегда сохраняемыми в нижнем регистре. Преобразуйте входные данные в нижний регистр. Для каждого ключевого слова (скажем, redskins) вы вручную добавляете 5-10 вариантов (включая правильный) в псевдонимах, все из которых имеют псевдоним.keyword_id = идентификатор ключевого слова. Таким образом, вы просто ищете псевдоним для пользовательского ввода, и если вы находите совпадение, у вас есть keyword_id ключевого слова.
У него есть два преимущества: быстрое и простое расширение… если вы зарегистрируете «нет совпадений», вы получите список новых псевдонимов, которые нужно добавить один раз в базу данных. НАМНОГО проще и надежнее, чем пытаться сделать это с помощью регулярного выражения.
Комментарии:
1. всегда пожалуйста. я получил большую помощь здесь, в stackoverflow, и счастлив, когда у меня появляется шанс отплатить мне тем же!
Ответ №2:
Я не думаю, что вам нужны регулярные выражения здесь. Как насчет орфографических ошибок? Для удобства (особенно из текстового сообщения) Я думаю, вы тоже хотите разрешить сокращения.
Возможно, лучше всего было бы использовать библиотеку на основе Soundex или для исправления орфографии. Вам нужен алгоритм ближайшего соответствия, а не шаблонный.
Ответ №3:
Если текстовое сообщение не слишком длинное, вам следует сначала разбить его на слова, а затем провести пересечение со списком названий команд.
array_of_team_names = %w(Redskins Colts ... ) # keep it all capitalized
'cOLts blah blah'.scan(/w /).map{|word| word.capitalize} amp; array_of_team_names
# => ['Colts']
Если вы хотите обработать опечатки, как предлагает drysdam, или если вы хотите обрабатывать больший текст с большей точностью, вам следует использовать какую-нибудь специальную библиотеку для этого.
Ответ №4:
Я думаю, вы спрашиваете: «как мне избежать жесткого кодирования регулярных выражений в моем коде, поскольку у меня их может быть много, и они на самом деле являются элементом данных»?
Если вы хотите выполнить сопоставление с помощью регулярного выражения, вам следует отметить, что вы можете создать регулярное выражение из строки, так что вы могли бы легко получить таблицу, содержащую столбец регулярного выражения в строковой форме. Затем вы можете динамически создавать массив объектов регулярных выражений, с помощью которых вы будете выполнять поиск по входящей строке. Хитрость в том, что делать, когда у вас есть совпадение. Вам нужно будет разработать набор правил (еще одну таблицу), в которой в основном указано, какой ответ выбирать на основе входящего текста. Например, если ваше правило просто «сопоставьте на основе названия команды и укажите, где они играют», это довольно просто. Каждое регулярное выражение, которое вы ищете, соответствует ровно одному действию («Медведи играют в Чикаго»). Если ваши правила сложнее (найдите медведей, а затем посмотрите, есть ли там слово «расписание», а также «первая игра (ы)», тогда вам понадобится другая таблица, которая сопоставляет коллекцию совпадений с ответом.