Я пытаюсь перевести пользовательский ввод в реальном времени на язык, который они определили, используя PHP.
Например, пользователь создает следующий словарь (где левая сторона — это ввод, а правая сторона — это вывод):
[
"A" => "alpha",
"B" => "bravo",
"CD" => "charlie delta"]
Затем пользователь вводит следующее (подробности см. Ниже):
"A", "B", "C", "D"
Как я могу перевести эти входные данные в режиме реального времени:
|-------------|---------------------------------|
| input | output |
|-------------|---------------------------------|
| "A" | "alpha" |
| "A" + "B" | "alpha" + "bravo" |
| "AB" + "C" | "alpha bravo" + ? |
| "ABC" + "D" | "alpha bravo" + "charlie delta" |
|-------------|---------------------------------|
Если бы это было взаимно-однозначное отношение между входными и выходными строками, это не было бы проблемой. Однако несколько входных строк могут относиться к одной выходной строке (например, «CD» означает «дельта Чарли»).
Возможное решение
Я думал о токенизации входной строки в N-грамм, где N максимальное количество входов для одного вывода в словаре пользователя (в приведенном выше примере N будет 2 из-за «CD»).
Примерно такой алгоритм:
Я токенизирую входную строку:
|--------|---------|
| tokens | hits |
|--------|---------|
| "A" | "alpha" |
|--------|---------|
Я токенизирую новый вход в биграммы:
|--------|--------|
| tokens | hits |
|--------|--------|
| "B" | "beta" |
| "AB" | |
|-----------------|
Я токенизирую новый вход в биграммы:
|--------|--------|
| tokens | hits |
|--------|--------|
| "C" | |
| "BC" | |
|-----------------|
Я токенизирую новый вход в биграммы:
|--------|-----------------|
| tokens | hits |
|--------|-----------------|
| "D" | |
| "CD" | "charlie delta" |
|--------------------------|
Конечно, N-граммы растут с количеством возможных вводов. Есть ли более простое или быстрое решение, которого я не вижу?
РЕДАКТИРОВАТЬ 19 марта 2015 г .:
Словарь пользователя может содержать десятки тысяч терминов. Итак, я храню его в базе данных. Я также храню вывод в базе данных для последующего использования.
На внешнем интерфейсе пользователь вводит свой ввод в текстовый ввод, и значение ввода отправляется в PHP через AJAX-запрос в фоновом режиме.
Например…
Я мог бы собирать ввод текста и отправлять его каждые 30 секунд или около того для обработки на сервере, чтобы запросы не начали складываться, но вы поняли идею.
PHP не будет отличной идеей для этого приложения. PHP — это серверная технология, то есть вам придется запускать отправку каждый раз, когда вы хотите, чтобы она интерпретировала и изменила введенное значение. Единственный способ, которым это было бы осуществимо, состоит в том, чтобы заполнить пользовательскую запись (заполнить все поле), отправить ее на сервер, разбить строку, проанализировать и заменить, а затем вернуть значение с обновлением страницы. Не очень удобно для пользователя.
По этой причине вы почти наверняка захотите использовать Javascript.
В javascript это не очень сложно. Вы должны будете определить свой список конверсии, вероятно, с помощью ajax-вызова, который получает его с вашего сервера. Вы бы присвоили эти результирующие данные объекту, который вы можете использовать для поиска значений. Вы создадите событие keyup или change в поле ввода, в этом случае вы оцените ввод, определите вывод из вашего объекта определения и вернете его в другое поле.
Других решений пока нет …