Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Алгоритм разбора данных (https://javascript.ru/forum/misc/71336-algoritm-razbora-dannykh.html)

Lion777 11.11.2017 13:56

Алгоритм разбора данных
 
Прилетает строка, возможно со всяким муссором, вот такого вида:
Включить пожалуйста воду и свет
муссор тут "пожалуйста и"
Мне нужно делать определенные действия, т.е. если есть подстрока "включить" с ключевыми словами "воду" "свет", то включаем воду и включаем свет, если "выключить", то выключаем.
Команд с разными опциями может быть много: включить, выключить, перейти, установить и т.п. и просто перебирать if'ами не хотелось бы, например так:

//Это переменная со строкой данных
var instr;

if (instr.search('включить') != -1){
    if (instr.search('обогрев') != -1){
     
    }
    if (instr.search('свет') != -1){
     
    }
    if (instr.search('воду') != -1){
        if (instr.search('теплице') != -1){
     
    }
        if (instr.search('кухне') != -1){
     
    }
     
    }
    if (instr.search('полив') != -1){
     
    }
}

рони 11.11.2017 16:18

Lion777,
для медитации ...
применение-побитовых-операторов #маска

Lion777 11.11.2017 20:19

Вариант передачи данных интересный, но мне надо будет распарсить результат всеравно, с помощью тип switch или if, но вариант интересный, для передачи по сети отличный вариант, трафика минимум уйдет, мне для общения с микроконтроллером подойдет, я раньше тип как методом гет, а тут в одно число можно все закодировать
---
А )) не совсем подходит, мне надо будет передавать не только булевы значения, а и строки

рони 11.11.2017 21:01

:write: каждому слову сделать вес -- сложить все веса - проверить все тригеры на этот вес - включить тригеры прошедшие фильтрацию

Lion777 11.11.2017 22:57

я думал так, взять 30 бит, например, первых(или точнее - последних) 5 будет отвечать за команду, тип 10000 - включить, 10001 - выключить, 10010 - и т.д получится 31 разных команд, остальные по 5 подкоманды, тип 00001 - воду на кухне, 00010 - свет, 00011 - воду в теплице
10000 00000 00011 00010 00000 00001 , например тут при команде 10000 "включить" подкоманда "00001" будет значить " включить воду на кухне", для другой основной команды подкоманда "00001" будет иметь инное значение ))) или это какой-то велосипед ?))
___
можно вообще взять 8 бит и зашифровать в 256 разные команды, тип 0 - включить воду, 1- выключить воду, 2- включить свет, 3-выключить свет, но тут вложенности не получится, тип включить->воду->на кухне

laimas 11.11.2017 23:27

Цитата:

Сообщение от Lion777
тип 00001 - воду на кухне, 00010 - свет, 00011 - воду в теплице

Лучше так - [команда][данные][адрес], где команда, это операция, данные, это указатель на объект (вода, свет, ....), адрес, это указатель на целевой объект (кухня, теплица, ...).

Соответственно отведя под каждую часть необходимое число бит. Формат команды будет проще и ее длина гораздо короче.

Lion777 12.11.2017 00:33

Это все хорошо,но как разбирать все эти команды без кучи if'ов
тип собрал команду включить->свет->на кухне->возле холодильника->код?

рони 12.11.2017 01:54

Lion777,
как - то так ...
<script>
var obj = {"Включ" : 1, "вод" : 2, "свет" : 4} , triger = [{wt : obj["Включ"]|obj["вод"], title : "включить воду"}, {wt : obj["Включ"]|obj["свет"], title : "включить свет"}]
function fn(str) {
    var key = str.split(/\s+/).reduce(function(s, a) {
        Object.keys(obj).forEach(function(k) {
            if (a.toLowerCase().indexOf(k.toLowerCase()) !== -1) s |= obj[k]
        });
        return s
    }, 0);
    return triger.filter(function(el) {
               return (key & el.wt) == el.wt
    });
};

document.write(JSON.stringify(fn("Включить пожалуйста воду и свет"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста воду"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста свет"))+"<br>")
document.write(JSON.stringify(fn("свеТ вклЮчить скорее"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста радугу"))+"<br>")
</script>

laimas 12.11.2017 08:40

Цитата:

Сообщение от Lion777
как разбирать все эти команды без кучи if'ов

Знать бы для чего все это пишется. Может быть почитать об архитектуре микроконтроллеров, например от Microchip? Например, для семейства PIC16C5X длина инструкции составляет 12 бит, которые разделены на тип команды и на операнды. Операнды, это регистры, биты или байты (для бит или байт ориентированных команд).

За небольшим исключением команды этого семейства выполняются за один командный цикл. Команды проверяющие условия или изменяющие программный счетчик выполняются за два командных цикла. При этом, имея небольшой набор команд могут нести на борту различные функциональные устройства, от таймеров, и АЦП, до связи по Интернет, что позволяет создавать на них самые различные устройства.

По такому же принципу и ваш контроллер должен работать. К примеру ваши команды занимают два бита в инструкции: 00 - выключить, 01 - включить, 10 - получить. Следующая пар бит определяет устройство: 00 - свет, 01 - вода, 10 - холодильник. И последняя пара, это помещение: 00 - комната, 01 - кухня, 10 - ванная.

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

Дешифратор команд должен последовательно декодировать каждую и исполнять. В памяти программ команды идут одна за другой и нет никаких пробелов, но пусть у вас они будут представлены таким образом:

010001
011001

Дешифратор разбивает поток команд по \n, затем извлекает биты инструкции, например по шаблону рег. выражения. Далее выполнение - определить порт, установить/получить состояние порта. Если ваша задача вывести текст по команде, значит битовые значения можно преобразовать в десятичные, которые есть свойства объекта содержащие текст.

Какие либо if здесь не потребуются. Но если команда включить/выключить, это установить 1/0 на выходе указанного порта, то команда "получить", это считать состояние порта, передать его программе, которая и будет это состояние анализировать. А уже по результату может включать/выключать, запускать подпрограммы и т.д.

Lion777 12.11.2017 15:19

Ребята, благодарю за подсказки.
Ну это тип управление умным домом, захотел добавить еще голосовое управление, но что-бы оно было тип умное ), что-бы фразы были не строго "однотипные" тип "Включить воду", а тип "Включите пожалуйста воду и свет" слова-муссор удалялись и собиралась команда, ну и собранная команда шла на исполнение, но в ифы добавлять тупо, если их будет множество...
---
рони, хотел еще спросить, зачем использовать побитовое или "|" в "wt : obj["Включ"]|obj["вод"]", ведь если там будут числа 9,10,11 и т.п. то будет неверно складывать ?

рони 12.11.2017 15:58

Lion777,
не понимаю вопроса, так проще делать цепочки типа "wt : obj["Включ"]|obj["холод"]|obj["кухн"]"" - включить холодильник на кухне и прочее, предел только 32 слова -- но сочетаний неограничено

Lion777 12.11.2017 16:09

alert(9|9)
alert(9|8)

рони 12.11.2017 16:34

Lion777,
?

рони 12.11.2017 16:40

Lion777,
рекомендую Rise,


пример

Lion777 12.11.2017 16:45

Цитата:

Сообщение от рони (Сообщение 469884)
Lion777,
?

ну я так понял, что с помощью | получаем сумму и это как идентификатор ? и если сложить таким образом например 9|9 или 9|8, то получим 9

рони 12.11.2017 16:53

Lion777,
не осилил, возможно Rise, сможет вам лучше обьяснить

laimas 12.11.2017 23:52

Цитата:

Сообщение от Lion777
Ну это тип управление умным домом, захотел добавить еще голосовое управление, но что-бы оно было тип умное )

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

Lion777 13.11.2017 00:56

Цитата:

Сообщение от laimas (Сообщение 469907)
Вряд ли удобно будет управление, в котором с клавиатуры нужно будет писать "пожалуйста...", гораздо удобнее нажать клавишу/кнопку/сенсор. А если голос, то это уже совсем иное и все что тут обсуждалось не годится.

я незнаю что тут обсуждалось, но голосом работает нормально все, локально читает, удаленно работает синтезатор речи, это как опция понтов больше, а так можно и в ручном режиме и автоматическом управлять.
---
рони, пасиб за помощь, возможно я не так понял все..

laimas 13.11.2017 01:13

Цитата:

Сообщение от Lion777
но голосом работает нормально все

Тем более не понятно чего надо еще? )

Lion777 13.11.2017 01:50

Цитата:

Сообщение от laimas (Сообщение 469915)
Тем более не понятно чего надо еще? )

данные, что пришли - разбирать правильно )

laimas 13.11.2017 02:06

Цитата:

Сообщение от Lion777
данные, что пришли

Какие данные? Голосом работает, а еще чем управляется, текстом с клавиатуры?

Lion777 13.11.2017 02:23

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

laimas 13.11.2017 02:38

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

Есть готовые системы/софт, есть API от гугла и можно управлять системой со смартфона. В сети описания этого добра сколь угодно.


Часовой пояс GMT +3, время: 18:01.