Помогите в реализации.

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Всем привет!
В данный момент занимаюсь реализацией бота-автоответчика под свои нужды.

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


1. Есть таблица EXEL и в ней есть ответы.
2. Есть сообщение от пользователя.

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


======================

Текущий метод автоответов меня не очень радует:

1. Есть сообщение пользователя. Мы его разбираем и каждое слово складываем в список.
2. Есть таблица с ответами в два столбика: в 1-ом ключевые слова, во 2-ом готовые ответы.

Т.е. мы берем слово из списка, далее ищем этот же ключ в таблице, если нашли, то берем ответ из второго столбца на соответствующей строчке.
Но при работе с большой базой ответов и весьма динамичными сообщениями от клиентов, тут как с бубном не танцуй, точность ответов вообще нельзя организовать и придется делать 1203182391273 заготовок ответов и вопросов в точной форме)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
складываешь все подходящие ответы по всем ключевикам в список. Получится что-то типа
ответ1
ответ3
ответ1
ответ2
ответ2
ответ2
...
Сортируешь. Получаем
ответ1
ответ1
ответ2
ответ2
ответ2
ответ3
...

А теперь просто пробегаешь по списку и ищешь самую долгую последовательность одинаковых ответов. Надеюсь этот алгоритм расписывать не надо?
 
  • Спасибо
Реакции: Voldemar

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
складываешь все подходящие ответы по всем ключевикам в список. Получится что-то типа
ответ1
ответ3
ответ1
ответ2
ответ2
ответ2
...
Сортируешь. Получаем
ответ1
ответ1
ответ2
ответ2
ответ2
ответ3
...

А теперь просто пробегаешь по списку и ищешь самую долгую последовательность одинаковых ответов. Надеюсь этот алгоритм расписывать не надо?
Интересная конечно реализация, спасибо!
Но вот конечны загонку в базу тысячи ответов не избежать :( Но в любом случае, надо смотреть на практике, как получиться.
Подскажите пожалуйста, а как сортировку делать в списке?
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
Но вот конечны загонку в базу тысячи ответов не избежать
Это не займет много времени.
Сортировать кубиком работы со списком. А если код нужен, то нужно искать
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Стандартным действием - Операции над списком - Сортировать.
Буду очень Вам благодарен если ответите в теме, которая имеет отношение к данной реализации ;-) СПАСИБО!

http://zennolab.com/discussion/threads/poisk-po-spiskam-i-tablicam-cherez-c-makros.10734/page-6#post-187490

Это не займет много времени.
Сортировать кубиком работы со списком. А если код нужен, то нужно искать
Извиняюсь за тупость, но стандартными методами без костылей определить наибольшее количество повторений, какого именно варианта? У меня есть предположения, но мои методы не очень практичны при большом количество ключевых слов от пользователя и большого количества возможных ответов

РЕД.


Ааааа....или тут предполагается, что можно будет взять первый вариант из списка, после сортировки и считать его самым часто повторяемым? Но это в том случае, если как Вы указали в примере с цифровым порядком.
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
Что значит какого именно варианта? ты сбрасываешь в список абсолютно все возможное ответы, которые соответствуют ключевикам сообщения. и ищешь среди этих ответов тот, который имеет наибольшее число повторений. Или ты что-то другое хотел узнать?
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Это не займет много времени.
Сортировать кубиком работы со списком. А если код нужен, то нужно искать
Что значит какого именно варианта? ты сбрасываешь в список абсолютно все возможное ответы, которые соответствуют ключевикам сообщения. и ищешь среди этих ответов тот, который имеет наибольшее число повторений. Или ты что-то другое хотел узнать?
как узнать простым способом узнать в списке, какое значение повторяется больше всего? Я думаю это проще на C# делать, но в нем я не але.

Да и сортировка не совсем понятна, прикрепил скрин (тут по убываю сортировка) Но как я понял тут алгоритм от А до Я сортирует, а не по количеству совпадений)
 

Вложения

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
берешь переменную, в которую будут помещаться строки при переборе. пусть называется record. temp_recor будет содержать в себе предыдущую строку. Изначально она пуста, пустота поможет стартануть алгоритм. Еще будет переменная count. Это счетчик, высчитывающий повторения каждого ответа. Изначально равен 0. Ну и result_record в которой будет храниться ответ, повторяющийся наибольшее количество раз на данном шаге и соответственный ему счетчик повторений max_count(тоже 0 по умолчанию).
Берем строку со списка с удалением. Кладем в record. Сравниваем с temp_record.
Если переменные равны - апаем count.
Если неравны - сравниваем count и max_count. Если count > max_count , то в result_record кладём temp_record, а в max_count кладём count. Независмо от результата сравнения обнуляем count.
Независмо от того, по каким веткам мы прошли ранее в конце всегда в temp_record кладём record.
Берем строку с удалением...

Вроде так, но может и запартачил где-то. Выход произойдет по красной ветке взятия строки. Ответ будет в result_record
 
  • Спасибо
Реакции: Voldemar

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
как узнать простым способом узнать в списке, какое значение повторяется больше всего? Я думаю это проще на C# делать, но в нем я не але.

Да и сортировка не совсем понятна, прикрепил скрин (тут по убываю сортировка) Но как я понял тут алгоритм от А до Я сортирует, а не по количеству совпадений)
все верно. от а до я. Количество совпадений нужно самому прошерстить. Примерный алгоритм выше
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
берешь переменную, в которую будут помещаться строки при переборе. пусть называется record. temp_recor будет содержать в себе предыдущую строку. Изначально она пуста, пустота поможет стартануть алгоритм. Еще будет переменная count. Это счетчик, высчитывающий повторения каждого ответа. Изначально равен 0. Ну и result_record в которой будет храниться ответ, повторяющийся наибольшее количество раз на данном шаге и соответственный ему счетчик повторений max_count(тоже 0 по умолчанию).
Берем строку со списка с удалением. Кладем в record. Сравниваем с temp_record.
Если переменные равны - апаем count.
Если неравны - сравниваем count и max_count. Если count > max_count , то в result_record кладём temp_record, а в max_count кладём count. Независмо от результата сравнения обнуляем count.
Независмо от того, по каким веткам мы прошли ранее в конце всегда в temp_record кладём record.
Берем строку с удалением...

Вроде так, но может и запартачил где-то. Выход произойдет по красной ветке взятия строки. Ответ будет в result_record
Да, похоже без костылей не обойтись, я уже с таблицей начал костыль делать :D
 

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
554
Баллы
93
Да, похоже без костылей не обойтись, я уже с таблицей начал костыль делать :D
Так получить что то толковое точно не получится, а болталку небольшую можно. Посмотри БроБот он однопоточный бесплатен и в нём реализован бот модуль или спарси уже готовые диалоги отсюда
Код:
http://chatbot.tw1.ru/dialogs.htm
Смотреть надо в сторону нейросетей и кодить.
Код:
http://www.codeproject.com/Articles/16447/Neural-Networks-on-C?rp=/KB/recipes/aforge_neuro/neuro_src.zip
Базы использовать: базы субтитров и диалоги из книг.
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Так получить что то толковое точно не получится, а болталку небольшую можно. Посмотри БроБот он однопоточный бесплатен и в нём реализован бот модуль или спарси уже готовые диалоги отсюда
Код:
http://chatbot.tw1.ru/dialogs.htm
Смотреть надо в сторону нейросетей и кодить.
Код:
http://www.codeproject.com/Articles/16447/Neural-Networks-on-C?rp=/KB/recipes/aforge_neuro/neuro_src.zip
Базы использовать: базы субтитров и диалоги из книг.
Получиться, ещё как))) На зене делаю типа макета для дальнейшей реализации, сейчас есть задача сделаю первично ботов для взаимодействия с новой и текущей ЦА. И организовать поддержку и информирование во время отсутствия персонала. Люди в 90% случаях задаю вопросы, на которые уже где то есть ответы, просто им нужен тот, кто их будет тыкать )))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)