Интеллектуальные диалоговые системы с интерфейсом на естественном языке

Как Вы уже наверно поняли, речь пойдет о так называемых виртуальных собеседниках или, как их еще называют, чат-ботах. В названии поста я умышленно использовал понятие «интеллектуальная диалоговая система» (для краткости дальше по тексту сокращенно — ИДС), поскольку считаю, что понятия «чат-бот» и «виртуальный собеседник» полностью дискредитированы и не отражают всей сути этого «явления».

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

Зачем нужны ИДС?


Спектр применения подобных систем невероятно широк. Первое, что приходит на ум:
  • для автоматической проверки знаний (школьников, студентов, соискателей на какую-либо должность и т.д.)
  • в качестве автоматизированной службы поддержи пользователей
  • для диагностики (болезней, неисправностей и пр.)
  • для развлечения в конце концов

Как обстоят дела с ИДС в России?


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

Не так давно на глаза попалась компания «Наносемантика», которая создает, так называемых инфов (виртуальных собеседников). Но при близком знакомстве с этими инфами был разочарован. Выглядит красиво, а на поверку ничего заслуживающего внимания нет.

На сайте компании написано:
Помимо прочего, в комплексную платформу входит база знаний инфа — набор гибких сценариев с заданными вариантами вопросов и ответов на них.


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

Портрет идеальной ИДС


Какой же минимум должна уметь действительно интеллектуальная диалоговая система? По моему глубокому убеждению:

1. Диалоговая система претендующая на интеллектуальность должна уметь поддерживать беседу на заданную тему. В идеале, она должна не просто отвечать на вопросы, но и задавать их, спорить, отстаивать свою точку зрения (ну и иметь ее конечно). Понятно, что добиться этого на практике очень трудно, но некоторые наработки и идеи (говорю о себе) уже есть.

2. ИДС должна иметь механизм самообучения (хотя бы примитивный). Без этого назвать ее интеллектуальной просто язык не поворачивается.

3. ИДС должна уметь конструировать ответ на естественном языке (хотя бы в каких-то конкретных случаях), а не просто тупо выдавать забитый в нее ответ.

4. Диалоговая система должна иметь собственную цель. В начале диалога такой целью может быть знакомство с человеком, выяснение его пола, возраста, потребностей, интересов и так далее. Потом на основе этих данных она должна обращаться к пользователю, например, по имени или по имени отчеству или на Вы/Ты (по желанию человека). Также должен быть механизм «запоминания» и «узнавания». Чтобы в новой беседе не пришлось все начинать сначала.

5. Диалоговая система в ряде случаев должна обладать индивидуальностью и эмоциями. В противном случае общаться с такой системой будет скучно.

6. Еще одно, пусть не самое важное, но все же необходимое умение — умение выполнять какие-либо действия. Открыть какой-то адрес в интернете, выполнить поиск по сайту, зарегистрировать пользователя, отправить электронное сообщение и так далее.

Естественно, наличие тех или иных умений должно быть обусловлено сферой применения системы. Так, например, автоматической support-системе не зачем (и даже вредно) иметь эмоции. Уже представляю себе разгневанного пользователя, который вместо решения своей проблемы получает в ответ: «А не пошел(-а) бы ты на… Грущу я. Вот!»

Внутреннее устройство ИДС


Практически все ныне существующие ИДС (по крайней мере из тех с чьим устройством я знаком) имеют базу знаний в форме:

фраза пользователя или ее значимая часть|один или несколько вариантов ответа системы

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

как тебя зовут|меня зовут так-то
как тибя завут|меня зовут так-то


Если ошибки не учитывать, то на вопрос «как тибя завут» программа не ответит адекватно.

В-третьих, если база состоит не из полных фраз — неизбежны некорректные ответы системы. Например база содержит такую строку:

сколько лет|Мне 2 года

Очевидно, автор хотел предусмотреть несколько вариантов вопроса о возрасте программы. «Сколько лет тебе?», «Тебе сколько лет?» — на них программа корректно ответит: «Мне 2 года»

А что если ее спросят «Сколько лет твоему создателю?» или «Сколько лет планете Земля?» Вероятно, ответ «Мне 2 года» пользователя в этом случае не устроит.

В-четвертых, при таком способе хранения знаний очень трудно обеспечить возможность «держать тему».

Выводы: описанный метод хранения данных (он является традиционным) не оптимален. При наличии большой базы, которая содержит самые распространенные вопросы, программа может показаться довольно «умной», но как только человек затронет тему не представленную в базе, весь интеллект тут же испарится и система начнет дико тупить.

Если Вы решили, что я категорически против описанного метода хранения данных, то Вы ошибаетесь. Такой подход имеет право на жизнь (с определенными оговорками), но если используется только он, то это тупик.

Итак, в каких же случаях и при каких условиях можно использовать традиционный способ хранения знаний в базе данных ИДС?

1. Непосредственно перед поиском в базе реплика пользователя должна быть проверена на возможные опечатки и ошибки. Естественно при их наличии они должны быть исправлены. Сделать это можно с помощью специального модуля — спеллчекера.

2. В базе должен храниться полный вариант реплики пользователя, а не просто ее значимая часть. Это позволит исключить ошибочные ответы системы.

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

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

Применяя такой подход можно приводить разные варианты запроса к единому виду. Проиллюстрирую свою мысль. Допустим имеем реплики пользователя:

Сколько тебе лет?
Сколько тибе лет?
Какой твой возраст?


Первая реплика: числительное «сколько» однозначно идентифицирует реплику как вопрос. Местоимение-существительное «тебе» однозначно идентифицирует этот вопрос как личный вопрос системе. Существительное «лет» принадлежит к категории «единицы измерения времени -> возраст». Получаем: системе задали личный вопрос о ее возрасте.

Вторая реплика: тоже самое, но предварительно «тибе» будет исправлено на «тебе».

Третья реплика: местоименное прилагательное «какой» однозначно идентифицирует реплику как вопрос. Местоименное прилагательное «твой» однозначно идентифицирует этот вопрос как личный вопрос системе. И наконец, существительное «возраст» принадлежит к категории «возраст». Опять таки получаем: системе задали личный вопрос о ее возрасте.

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

На сегодня пожалуй хватит. В следующей статье я расскажу о том как можно научить ИДС «держать тему» и самообучаться. Надеюсь Вам понравилось.

P.S. В комментариях хотелось бы увидеть Ваши мысли и предложения по поводу хранения информации в базе знаний системы.

Комментарии 76

    +1
    Как насчет адаптировать эту систему для организации человекообразного интерфейса с ПК? подача команд, самообучение ИИ, исследование мира роботом, описание найденных объектов.
      +1
      Самое главное создать эту систему. Сделать ее максимально гибкой и самообучаемой. Если в итоге система окажется эффективной, то потенциал ее применения станет поистине безграничен.

      И кстати, эта статья (вернее цикл статей, т.к. будет еще несколько) это не просто теоретический треп об искусственном интеллекте и диалоговых системах. Я действительно пишу такую систему.

      Тема искусственного интеллекта интересна мне с того самого момента как я узнал о программировании. Мною было предпринято несколько попыток создания ИДС. Но все они по разным причинам терпели неудачу (не то чтобы вообще ничего не получилось, но конечный результат не устраивал). Видимо сказывался недостаток опыта и незнание теории.

      Теперь же есть и то и другое, поэтому шансы на успех достаточно велики. Плюс надеюсь, что хабражители укажут на мои ошибки, поделятся своим опытом и идеями.
        +1
        мне тоже интересна эта тема довольно давно, я как-то начинал писать базу под нее, но одному достаточно сложно уделять этому время и охватить то, что я хочу, а единромышленников особо не нашлось.
          +1
          Вы планируете заниматься проектом в одиночку, или в команде? Если второе, то я с радостью вольюсь в проект. Напишите мне в ICQ (указана в профиле), если интересуетесь совместной разработкой. :)
            +1
            В одиночку пока не будет создано абстрактное ядро и действующий прототип. А потом уже можно будет собирать команду. Чтобы каждый член решал узкую задачу.
              +1
              Учитесь писать грамотно, в т.ч. подружитесь со знаками препинания. Вы же всё-таки пишете систему, которая будет понимать русский язык. Иначе проект обречён на провал.
              Казнить нельзя помиловать.
                +2
                Я когда-то тоже занимался подобной темой и даже обзавёлся учебниками русского языка для школьников. Рекомендую.
                  +1
                  Система которую я стремлюсь создать поняла бы даже такую писанину как у меня! А вообще мы все тут не на экзамене. Я выражаю свои мысли. Это творческий процесс. Если где-то буква пропущена, лишняя запятая стоит или что-то в этом роде, то ничего особо страшного в этом я не вижу. А учебника я и так читаю, правда более мудреные. Но все равно спасибо.
                    0
                    Система, к которой вы стремитесь, по идее должна была исправить вашу «писанину» на «нормальную форму». Как это сделать, её не зная, я не знаю :)
          +3
          Насчет исправления ошибок нужно думать дальше. Например, если система знает, что есть такой мальчик, которого зовут Тиба, то ошибку в вопросе «сколько тибе лет?» просто так не исправить. Придется переспрашивать, о каком «тибе» идет речь — о системе или о мальчике Тибе? И чем дальше, тем сложнее ситуации. Наверное, стоит этот аспект выделить в отдельную систему по исправлению ошибок письменной речи (как орфографических, так и смысловых — заодно избавим систему от измышлений на тему «о лет моя тебе система сколько?»), связав ее с базой знаний основной системы (потому что без нее так никто и не узнает о бедном Тибе). Заодно и всяким Word'ам пинка даст в плане исправления ошибок (^_^)
            0
            Здесь все просто, мы же имитируем человеческое мышление, а когда человеку непонятно, он переспрашивает, называя тот смысл, который понял «Сколько мне лет?» или если система решила, что Тиба — это имя «Сколько Тибе лет?» и тогда получив уточняющий ответ человека ориентируется дальше. Не нужна безошибочная система, нужно самообучающаяся, способная к диалогу с человеком.
              0
              ИМХО, почти наверняка все подобные системы рано или поздно сведутся к схеме создания какой-то заготовки и ее последующему обучению, ибо не так-то просто осознанно воссоздать все ассоциации, которые непременно возникнут при поступлении опыта в больших количествах, и запрограммировать их — проще научить систему самостоятельно искать ассоциации и скормить ей очень-очень-очень большой объем данных, периодически помогая в сложных местах. Проблема только в том, что подобный подход упирается в лимиты хранилищ и скорости обработки информации. Зато он очень похож на развитие homo sapiens, чего мы, собссно, и добиваемся.
                +1
                Так об этом и речь. Нужно создавать алгоритм обучения и анализа информации. Не нужно задавать все изначально. Только логику работы и правила языка, в процессе обучения остальное будет дано. Только обучать должны не хомячки, которым по-приколу обучить всякой фигне, а начальное обучение нужно делать тем, кто хорошо сознает как и чему учит, тогда система дальше уже будет учиться эффетивнее с верным базовым набором знаний
                +1
                RaJa полностью с Вами согласен по поводу безошибочности системы. Безошибочную систему создать в принципе невозможно. На любом этапе развития найдется тема в которой интеллект (искусственный или естественный без разницы) будет не компетентен.
                  0
                  поэтому при проектировании это должно четко осознаваться и решать задачу в условиях возможной ошибки и действия в условиях недостаточности данных и умений. Тогда и скайнета нечего бояться, если в нем не заложено принципа непрогрешимости, то он и не сможет никогда считать себя богом :)
                    0
                    Опять согласен, и более того, полностью это осознаю. Что касается «решать задачу в условиях возможной ошибки и действия в условиях недостаточности данных и умений», то в этом и прелесть интеллекта (любого). Принимать решения в условиях недостатка информации — одна из фундаментальных особенностей, которой должен обладать ИИ и интеллектуальные диалоговые системы в частности.

                    Кстати, огромное Вам спасибо за инвайт
                      0
                      Пожалуйста. Главное, чтобы идеи удалось реализовать.
                +1
                Алгоритм мыслится примерно таким:
                1. получить базовую форму для каждого слова в реплике, тем более что это в любом случае нужно будет сделать (колбасы->колбаса, тест->тест || тесто)

                2. если для какого-либо слова базовую форму определить не удалось, то вероятно в слове ошибка

                3. попытаться автоматически исправить ошибку

                4. если ошибку можно исправить несколькими способами, то нужно получить все варианты реплики (с учетом разных исправлений)

                5. получить на каждую реплику статистику и дать ответ на ту реплику, которая наиболее вероятна

                Очевидно что вопрос о возрасте системы будет более вероятен, чем вопрос о том сколько лет мальчику Тибе или кому-то еще. В конце концов подобная система не обязана знать такие вещи. А если она их знает, то уточняющие вопросы (от системы) неизбежны. Ведь мальчиков с таким именем может быть не один десяток.

                Кстати у меня давно возникла вот какая идея. Помимо ответа система должна (опционально, по желанию пользователя) предоставлять информацию о процессе осмысления фразы. В частности что-то типа:

                вероятно исходная фраза «сколько тибе лет?» содержит ошибку
                автоисправление «тибе»->«тебе»
                исправленная фраза «сколько тебе лет»
                и так далее
                  0
                  С логом осмысления интересно, но, КМК, это не более чем отладочная информация — разработчик ее и так будет видеть (необязательно в такой красивой форме), а рядовому пользователю взглянуть один раз ради интереса и забыть про эту фичу — смысл всей этой системы в упрощении диалога, а подобный лог только увеличивает количество информации сомнительной полезности, которую нужно будет обработать пользователю (читай — пользователю будет лень думать, что это за буковки, ему быстрее объясниться с системой на русском (возможно, матерном)).
                    0
                    В принципе согласен. Но все же подобная функциональность будет не лишней. Рассчитывать же нужно не только на тех кому лень. Найдутся люди которым информация об осмыслении фразы будет более интересна нежели сам ответ.
                  +1
                  Теоретически проблема с мальчиком Тибой решается с помощью контекстного анализа комманды или вопроса. То есть, если уже система знает о наличии мальчика с таким именем, то стоит добавить модуль, который сверяет возможное значение слова не только со стандартным словарем, привязанным к программе, но и с базой данных возможных значений. Такая база данных может быть как локальной (история запросов к программе, контакты пользователя), так и глобальной — достаточное количество текстов на конкретном языке, которые прогнали по статистическому алгоритму (Hidden Markov Model).

                  Советую также посмотреть: Grammatical Framework
                  0
                  а можно ли привести какие нибудь чат-боты, хотя бы отдаленно похожие, допустим на cleverbot?
                  и стоит ли таких ботов сажать в саппорт?
                    0
                    Да много их, но большинство более менее умных, к сожалению общаются только на английском.
                    А стоит ли сажать в саппорт или нет это уж дело Ваше. Тут и специфику проекта нужно учитывать и степень развитости системы. Если он грубо говоря тупая, то смысла нет. Это будет только раздражать. А вот если Вы ее научите решать проблемы пользователей, то почему бы и не попробовать.
                      0
                      я просто теоретически думал что будет если посадить бота допустим в базовую тех. поддержку хостинга, он сможет ответить на типичные вопросы к примеру. А если что переправить на сотрудника тех. поддержки.
                        0
                        Думаю что для таких задач бота использовать вполне возможно. Просто нужно побольше времени уделить обучению.
                          0
                          а не подскажете с чего начать? мне интересна тема искуственного интеллекта но я ни бум бум. Понятия не имею как они функционируют, пробовал разобраться с нейронными сетями но нигде литературы доступной не нашел для понимания. Везде пишут профессорским языком.
                            0
                            Ну если Вам нужно чисто для саппорта. То тут можно обойтись системой «фраза пользователя или ее значимая часть»->один или несколько заранее забитых в базу ответов на эту фразу. Те же инфы от Наносимантики как раз для этого и созданы.
                    +2
                    Можете пояснить, зачем нужны такие системы? Правда, есть ли реальное применение? Я не имею ввиду развлечение на пять минут. Что-то более существенное.

                    На счет спел-чекера я полностью согласен. Исправление опечаток тут очень нужно. Но все же, не понятно что вы собираетесь делать.

                    >> То есть запрос пользователя подвергается предварительной обработке (например, упомянутые ранее исправление ошибок/опечаток, морфология, синтаксис, семантика и прочее).

                    Это, конечно, сильно. Но давайте разберем, что вы предлагаете. Ладна, морфология — не такая уж проблема. Синтаксис — будет тяжело. Сложность задачи повышает то, что редкий пользователь пишет синтаксически верные предложения. Но да ладно, таки или иначе это можно решить. Но что касается семантики — это что? Как вы собираетесь хранить знания? Что это за внутренний язык, который вы упомянули. Поясните, плз.
                      –1
                      По поводу того зачем нужны такие системы я писал в посте. Но давайте немного пофантазируем.

                      Например, естественно-языковый интерфейс с ПК (при условии наличия качественного механизма синтеза и распознавания речи).

                      Читаете Вы Хабр, а Ваш персональный ИИ сообщает, что пришло письмо с такого-то адреса.
                      Вы ему: «Прочитай». Он читает…
                      Вы ему: «Удали». Он удаляет…
                      Вы ему: «Я иду по делам, пока меня не будет дома собери информацию по такой то теме». Вы пришли, а для Вас в удобном виде вся инфа уже найдена и рассортирована.
                      и так далее.

                      Еще один вариант применения. Скорая психологическая помощь. Человек рассказывает о своей проблеме, а ИИ дает советы, рассказывает о том как эту проблему решали другие, предоставляет книги или ссылки на сайты по теме и прочее.

                      Можно найти массу применений. Ограничений нет — только Ваша фантазия.

                      По поводу внутреннего языка и хранения знаний будет отдельная статья. Тема эта очень обширная, в комментарии ее не осветить.
                        +1
                        Понятно, спасибо. Что касается ЕЯ командного интерфейса — тут можно обойтись простыми механизмами. Все что вам нужно — мапить команду пользователя на команду системы. Решается какой-нить вероятностной моделью.

                        Что же касается психологической помощи — тут да, нужно что-то похитрей. Ладна. Мой вопрос был связан с тем, что почти все чат-боты пишутся без задачи в голове. Т.е. единственная цель этих «программ» — ответить так, чтобы было по-человечески и прикольно. На мой взляд написание таких поделок — тупейшая трата времени и сил. Не наступите на эти грабли.

                        Что же касается реализации. Ну хотя-бы направление можете обозначить? Судя по тому, что вы написали, я предполагаю вы хотите работать в «классическом» стиле обработки языка — морфология, синтаксис, семантические правила + некая логика для связки. Теоретически это делается так — строится ситактико-семантическая грамматика, где на входе идет строка — на выходе некое семантическое дерево, либо запись языке логики первого порядка.

                        Но проблема в том, что очень сложно описать эти правила. Язык слишком гибок. И я не видел ни одну успешную реализацию такого подхода. Почти все более-менее успешные современные системы (перевод, разпознавание речи) работают на статистиках, и не затрагивают даже простые лингвистические техники.

                        Соответственно вопрос — как? :)

                          0
                          Говорил мне молодому один дядя: «I'll be back», и, видимо, не врал… :)

                          На самом деле тема очень интересная, но мне кажется настолько сложной, что вникать страшно. Я имею ввиду самообучающийся алгоритм, а не тупую выборку из баз, как вы описали.
                            0
                            Представил себе openspace на 100 человек в офисе, где у компьютеров языковой интерфейс. :)
                              0
                              Языковой != голосовой. Да и по телефону часто много говорят.
                          0
                          Тоже интересно послушать реализацию внутреннего языка.
                            +1
                            По моему, с таким подходом идея обречена на провал. Т.к. предполагается, что система имеет некий изначальный объем данных (например, «получить базовую форму для каждого слова в реплике»). Что, имхо, является неверным посылом.
                            Посмотрите на живую природу: те кто обладает большим набором врожденных инстинктов (изначальный набор знаний), как-то не блещут интеллектом и не очень склонны к обучению.
                            Собственно, ключевой вопрос — как строить систему обучения и познания. Если решить его, то один раз систему можно и с нуля научить, пусть за те же 21 год как и человека :)
                              0
                              Искусственный интеллект одними размышлениями не напишешь. Слова нужно переносить в код. Я пытаюсь предложить на суд публике конкретные алгоритмы и решения. Никто не говорит, что мой подход верен.

                              Сегодня я решил «получить базовую форму для каждого слова в реплике». Этот алгоритм поработал несколько дней, недель, месяцев. Накопилась статистика. Посмотрел, проанализировал. Ага, подход не самый лучший. Проблема? Нет. Сделаю иначе, всего-то делов.

                              Но суть в том, что все нужно пробовать. Иначе как узнать работает это или нет?
                                0
                                Я чуть о другом говорил: система должна уметь пополнять свою базу знаний самостоятельно с самого начала.
                                Приведу пример задачи которую решал: на входе несколько сотен тысяч имен, фамилий, отчеств. Их нужно было склонять и формировать множественное число. Были закодированы правила русского языка, а для оптимизации все склоненные фамилии хранились в БД.
                                Собственно, когда система не находила в БД фамилии, она начинала думать, и еще просила оператора проверить, правильно ли она подумала. Если подумала неправильно, звали программиста (меня т.е.) и я допиливал алгоритмы склонений.
                                Имхо, такой, алгоритм более жизнеспособен, чем наполнение БД в рукопашную и попытками реализовать алгоритмы анализа натуральной речи, подходящие для всех случаев жизни. В общем, хоть задача и узкая, но на тех объемах данных (которые, кстати, постоянно пополнялись) спасла много нервных клеток и времени.
                                  0
                                  Вот кстати что меня особенно покоробило: «Ага, подход не самый лучший. Проблема? Нет. Сделаю иначе, всего-то делов.»
                                  Стратегические ошибки невозможно исправить оперативными действиями. Т.е. на этапе прототипирования — вполне себе подход, но если у вас уже тонны кода и годы работы… Черт его знает, может стоит поразмышлять предварительно.
                                    0
                                    Не знаю почему Вас это покоробило. Система однозначно должна быть модульная. Ядро системы — абстрактное. Изменение логики модуля не должно влиять на остальные модули.

                                    К примеру я написал модуль автоисправления ошибок. Он поработал и выяснилось, что в нем есть ошибки. Я могу исправить ошибки в этом модуле (в одном месте) и это никак не отразится на работе других модуле. В конце концов я могу вообще отказаться от автоисправления ошибок и отключить соответствующий модуль. Это опять таки никак не должно влиять на работу других модулей. Это скажется только на самой системе — вероятно она перестанет понимать фразы с ошибками/опечатками.

                                    Стратегические ошибки невозможно исправить оперативными действиями. Т.е. на этапе прототипирования — вполне себе подход, но если у вас уже тонны кода и годы работы… Черт его знает, может стоит поразмышлять предварительно.
                                    поразмышлять безусловно стоит, но все предусмотреть не возможно. И поэтому уже на этапе прототипирования нужно делать гибкую модульную систему. Которую можно легко менять, улучшать, конфигурировать и так далее.
                                    0
                                    >> «получить базовую форму для каждого слова в реплике»
                                    пожалуй лучшее opensource по теме что я видел/использовал aot.ru
                                    или враппер AOT для java code.google.com/p/russianmorphology
                                    0
                                    Забыл про изначальный объем данных. Я считаю что он просто обязан быть и чем он больше, тем лучше?

                                    Во-первых, кто станет общаться с системой, которая «полный ноль». А не будут общаться — система не будет развиваться. А если она будет общаться только со мной, то процесс обучения займет всю мою жизнь. И времени совершенствовать систему (на уровне устройства, а не знаний) у меня не будет.

                                    Во-вторых, не согласен вот с этим:
                                    те кто обладает большим набором врожденных инстинктов (изначальный набор знаний), как-то не блещут интеллектом и не очень склонны к обучению.

                                    Любой человек обладает огромнейшим набором врожденных инстинктов и это не мешает ему самообучаться и иметь интеллект.
                                      +2
                                      Человек имеет огромное кол-во инстинктов? Посмотрите на муравьев, перелетных птиц, морских котиков. Человек год ходить учится — это огромное кол-во инстинктов? Это с точки зрения природы — кандидат на дарвиновский отсев :)

                                      Кстати, есть теория, что интеллект есть всего лишь не сформировавшийся инстинкт.
                                    0
                                    Т.е. единственная цель этих «программ» — ответить так, чтобы было по-человечески и прикольно. На мой взляд написание таких поделок — тупейшая трата времени и сил. Не наступите на эти грабли.
                                    — полностью согласен. Беда таких программ в том, что практически не предпринимается попыток именно научить систему понимать смысл фразы. А подход = найти фразу в базе и дать заранее прописанный ответ — является тупиковым и ни к чему не ведет.

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

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

                                    Исходная фраза «Море большое»

                                    Море->существительное->физический объект->1103 (1103 эта та самая константа, 1103 просто для примера, могло быть и 128 и 42)

                                    большое->прилагательное->описывает размер->47

                                    Вопросительного слова и знака вопроса нет, значит считаем фразу утверждением. Получается на внутреннем языке фраза будет выглядеть так: 1103 47

                                    Что это дает? Мы можем проверить есть ли во фразе смысл. Проверка сводится к тому, что нам нужно узнать может ли физический объект (в данном случае — море) иметь свойство размер (в данном случае — большое).

                                    Проверка нам дала результат: да физ. объект может иметь такую характеристику. Система отвечает: «Да, море вполне может быть большим»
                                      0
                                      а теже цифры можно записывать как биты. Вот вам и базовая база знаний АИ.
                                      +1
                                      >Первая реплика: числительное «сколько» однозначно идентифицирует реплику как вопрос.
                                      >Существительное «лет» принадлежит к категории «единицы измерения времени -> возраст»

                                      Сколько лет, сколько зим!

                                      >местоименное прилагательное «какой» однозначно идентифицирует реплику как вопрос

                                      Какие твои годы!

                                      >Местоименное прилагательное «твой» однозначно идентифицирует этот вопрос как личный вопрос системе.

                                      Когда тебе ничего не остаётся, то ты…

                                      В общем, по-моему, думать об исправлении ошибок и мальчиках Тибе несколько преждевременно, пока не решена задача распознавания смысла грамматически корректно сформулированных фраз. Что, имхо, «на современной элементной базе невозможно» ©
                                        0
                                        Идиоматические выражения всегда описывались в отдельных словарях. При обучении любому иностранному языку их нужно запоминать «потому, что понат эта нэ возможна»
                                          0
                                          Да, возможно я зря написал «однозначно идентифицирует», нужно было что-то вроде «наиболее вероятно».
                                          Ну а вообще, это решаемо. Допустим при наличии вопросительного слова изначально считаем что это вопрос. Последующие аналитические инструменты могут выявить что это не так (не вопрос, а например, утверждение).

                                          Согласен с unconnected, что идиоматические выражения всегда описывались в отдельных словарях. И их выявление это отдельная тема.

                                          А вот с Вашим высказыванием
                                          В общем, по-моему, думать об исправлении ошибок и мальчиках Тибе несколько преждевременно, пока не решена задача распознавания смысла грамматически корректно сформулированных фраз.
                                          согласиться не могу. Если начать с распознавания смысла, то при наличии ошибок/очепяток смысл Вы распознать не сможете. Поэтому начать, наверно, нужно именно с исправления ошибок. А потом уже анализировать, то что получилось. А если не получилось, то возможно это не была ошибка. Возможно это было какое-либо слово или понятие неизвестное системе.
                                            0
                                            Просто не люблю категоричность в утверждениях, если её слышу, то пытаюсь найти исключения не попадающие в утверждение :)

                                            В процессе исправления ошибок у вас может получиться, что орфографически и грамматически безупречно верная фраза абсолютно бессмысленна семантически. Гляньте, например, на какой-нибудь «бредогенератор» качественный. Имхо, первым делом нужно попытаться найти смысл во введенной фразе, а вот если не получится однозначно (или с большой долей вероятности) его найти, то тогда только подключать модуль коррекции возможных ошибок «брутфорся» различные варианты и оценивая каждый вариант на наличие смысла какой-то весовой функцией. То есть модуль оценки смысла нужен и до работы модуля проверки на ошибки и для его работы.
                                              0
                                              Возможно Вы и правы. Но я в любом случае буду пробовать разные подходы.
                                          0
                                          В базе должен храниться полный вариант реплики пользователя, а не просто ее значимая часть.

                                          Одна и та же реплика может требовать десятки ответов в зависимости от контекста. Вот что самое главное, но упомянуто у Вас это вскользь. Парсинг, выбор ответа, те же эмоции — всё должно зависеть от контекста.

                                          Первая реплика: числительное «сколько» однозначно идентифицирует реплику как вопрос. Местоимение-существительное «тебе» однозначно идентифицирует этот вопрос как личный вопрос системе.
                                          Существительное «лет» принадлежит к категории «единицы измерения времени -> возраст». Получаем: системе задали личный вопрос о ее возрасте.

                                          Сколько лет, сколько зим. Не всё так однозначно, и это гораздо большая проблема, чем исправление очепяток.
                                            0
                                            Это замечательно, что подобные системы разрабатываются, и взор направлен именно на подобное поведение подобных систем. Признаться, мечтал о такой штукенции ещё в детстве (да, думаю, и не я один).
                                            Но непонятно мне, почему автор собираясь написать целый цикл статей, не приводит самого наглядного, что характеризует систему наилучшим образом — сам код? Ведь тема социального кодинга проста и вполне работает. В одиночку разрабатывать такую полезную систему, безусловно, очень похвально, и это вопрос времени… Но, думаю, многие хотели бы помочь автору в написании сего…
                                            Хотя, конечно, в начале должен быть прототип системы, чтобы потом его можно было перепиливать и дорабатывать всем скопом социальных кодеров. А недоработанный до первого рабочего варианта код, может послужить причиной бесконечному холивару…
                                              0
                                              Приводить код смысла не вижу. Во-первых, это не инструкция на тему «ИИ своими руками». Я пишу потому, что это безусловно заинтересует многих и эти многие могут подсказать мне идеи или указать на ошибки. Во-вторых, я пишу на PHP. Безусловно его знают многие, но ведь не все. В-третьих, как Вы это себе представляете? Это же не пара строк кода. Это классы, интерфейсы, библиотеки и прочее прочее прочее.
                                                +1
                                                во первых php чуть ли не самый распространенный язык, у него очень низкий порог вхождения поэтому на нем кодит очень большое количество народу. Вот если бы вы сказали питон/руби, тут да, тут горааздо меньше.
                                                В-третьих, как Вы это себе представляете? Это же не пара строк кода. Это классы, интерфейсы, библиотеки и прочее прочее прочее.

                                                Вы возможно не слышали про Github
                                                  0
                                                  Я пытаюсь разобраться с общими алгоритмами, а конкретная реализация это отдельная тема.

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

                                                  Про GitHub я конечно же слышал. Но опять таки не вижу в этом смысла. Если бы это была реально действующая, доказавшая свою эффективность система и у людей возник вопрос: «А как все это работает?» То да, без кода не обойтись. Но пока до этого далеко…
                                                    +2
                                                    Мой вам совет — для разбирания с алгоритмами используйте какой-нибудь другой язык, тот же Python или Ruby, а может и в сторону чисто функциональных/декларативных языков посмотреть, но там мышление надо менять резко. Сложная алгоритмическая обработка сложных структур данных не самая сильная сторона PHP. Да, все основные конструкции присутствуют и даже более-менее приличная поддержка функций высшего порядка появилась, но синтаксис как-то бросается в глаза резко, отвлекая от алгоритма. Даже если не использовать «экзотический» сахар Python или Ruby, то код выглядит намного опрятнее, концентрируя внимание на алгоритме, не отвлекая его на $this-> и прочий «мусор».

                                                    Не верьте мне на слово, хотя на PHP я пишу уже с десяток лет и его недостатки, как минимум, синтаксические, хорошо знаю, просто уделите как-нибудь выходной или пару вечеров каждому из этих языков. Ведь библиотеки/фреймворки вам сейчас не нужны, достаточно консольного или файлового ввода-вывода. Готов держать пари, что вам понравится :)

                                                    Да и вообще, использование PHP может оттолкнуть потенциальных участников проекта, хотя бы из-за его репутации «языка быдлокодеров».
                                                      0
                                                      Спасибо, но не вижу смысла в изучении нового языка. Прежде всего это займет время. Что само по себе немаловажно. Кроме того я считаю, что не важно на чем ты программируешь, важно как ты программируешь. При желании и на Бейсике можно много чего сделать. А быдлокодить можно на любом языке, ведь это в первую очередь зависит от программиста.
                                                        +1
                                                        Речь не о быдлокоде, а о синтаксической избыточности PHP, которая мешает восприятию алгоритма.
                                                        0
                                                        репутация «языка быдлокодеров» взялась только потому что у него низкий порог вхождения. Он простой.
                                                        А this он и в питонских классах точно такой же this.
                                                        Скажите, мне правда интересно, какая конкретная часть php вас отвлекает от алгоритма?
                                                          0
                                                          Неважно откуда она взялась, но она есть и может отпугнуть от серьёзного проекта, имхо.

                                                          Запись self.var явно короче и «чище» записи $this->var, не говоря о том, что self лишь соглашение, а не синтаксис.

                                                          Да многие, навскидку: $, ->, array(), круглые скобки после if, while и т. п., фигурные скобки для выделения блоков, точка с запятой, new… Когда долго крутишься в мире Си-образных языков, то на это внимания не обращаешь, воспринимаешь как должное. Но когда немного попишешь на языках, где это отсутствует, то возвращаться на PHP сложно чисто психологически — понимаешь, что вводишь лишние символы — блоки и так выделяешь отступами, точка с запятой стоит всегда в конце строки, функции с именем класса или переменной нет, после if следует выражение и зачем его дополнительно скобками выделять не понятно, мы же не пишем $c = ($a), но почему то пишем if ($a). Вроде всё мелочи, но количество переходит в качество и мысль, что любимый язык далеко не идеален, что заставляет делать работу, которую мог бы делать транслятор, настроение портит и от основной задачи отвлекает.
                                                            0
                                                            не знаю, кодил на питоне некоторые парсерсы, без проблем могу кодить хоть на php хоть на python. А вот отступы в питоне мне на самом деле очень не нравятся.
                                                            ИМХО такие мелочи не сильно сказываются на читабельности кода, проблема надуманна.
                                                            Могу согласиться что в питоне синтаксического сахара больше, те же разрезы.
                                                              0
                                                              Не сильно, но сказываются.
                                                      +1
                                                      Ну, заинтересовавшемуся PHP-программисту освоить Python, Ruby, C# или Java на уровне синтаксиса и простейших (типа stdlib :) ) библиотек довольно легко, по себе сужу. Гораздо сложнее разобраться с инфраструктурой или, как сейчас модно говорить, экосистемой. Но чисто алгоритмические задачи (а сабж, несомненно, таковой является, по крайней мере пока не дошло дело до нагрузочного тестирования и оптимизации) можно начинать решать буквально после нескольких часов или даже десятков минут изучения языка. Пускай код будет не «канонический», какой-то сахар языка использоваться не будут, но код будет рабочим.
                                                        0
                                                        я думаю вы имели «идеологию кодинга на языке», т.е грубо говоря не писать php код синтаксисом python.
                                                          0
                                                          Я имел в виду, что даже при наборе кода в php-стиле на python он получится лаконичнее — меньше «синтаксического мусора».
                                                    +2
                                                    Сначала надо определиться с алгоритмом, ибо неясно ещё, как всё это сделать. А код — дело последнее.
                                                    0
                                                    Так как раз, если это не инструкция, то предложить конкретную реализацию можно только взглянув на уже имеющийся код, и предложив новый, как вариант решения одной из внутренних задач.
                                                    А представляю это себе так: например, можно выложить код на github, приложив к нему UML диаграммы классов, интерфейсов и вызовов. Если кто-то не знает PHP (хотя таких думаю мало), то этот кто-то и не будет смотреть код… С другой стороны этот кто-то может знать UML и тогда ему будет всё понятно по диаграммам.
                                                    Хотя судя по имеющемуся опыту, редко кто выкладывает диаграммы (может быть они вообще не нужны создателям?).
                                                      0
                                                      Поймите, у меня нет проблем с тем как что-то реализовать в коде. Когда они возникнут я попрошу о помощи хоть на ГитХабе, хоть на Хабре, хоть еще где-то. Проблемы есть в идейном плане, а именно, как реализовать самообучение, хранение знаний и так далее.
                                                        0
                                                        можно хранить знания в продукциях(CLIPS)
                                                          0
                                                          Ну да это классика. Что-то подобное вполне вероятно придется использовать.
                                                      0
                                                      Если взять несколько копий такой самообучающейся системы, и дать им «поработать» с разными группами пользователей или с данными, то каждая копия приобретет свой особенный опыт. Предполагается ли использовать одну общую базу данных, которая периодически пополняется опытом каждой копии системы?
                                                        0
                                                        Ну особого смысла в копировании системы на ранних этапах я не вижу. Каждая такая копия будет неполноценна, т.к. она будет общаться только с определенной группой пользователей (или данных), т.е. автоматически это не все люди или данные, а только какая-то часть. В итоге сумма знаний всех таких систем будет меньше чем у системы, общающейся с абсолютно разными людьми. Ведь у нее будет опыт самый разнообразный.

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

                                                          0
                                                          Например, в говорящих игрушках, в персональном электронном тренере или переводчике. В этом случае круг пользователей почти всегда будет ограничен одним человеком. Или же для общения с базами знаний вроде Wolfram | Alpha — тогда это уже для всех.
                                                        +3
                                                        Уровни ИДС:
                                                        1. Фонетический анализ — это способность воспринимать язык на слух. На входе аналоговый сигнал, на выходе — фонемы. После ряда преобразований получаем текст — слова с разделителями.
                                                        2. Морфологический и синтаксический анализ — анализ каждого слова. Выполняется необходимые коррекции/исправления. Определяется тип каждой словоформы и строится полная структура предложения. Если структура неполная — принимаются допущения. На выходе полная классификация предложения (Подлежащее, сказуемое), тип предложения (факт, вопрос), классификация слов (прилагательное, существительное, ...).
                                                        3. Семантический анализ — построение образов в виде отношений между предметами в контексте разговора. Предметы, свойства, действия обладают свойством символизма. На этом этапе, как вы правильно отметили, уже не важно как звучит или пишется слово — ему может быть поставлена эквивалентная константа.
                                                        4. Машина вывода, База знаний — на этом уровне из собственной базы знаний (о мире, контексте, себе) и поступивших фактов строится динамическая модель знаний. Тут уже можно делать выводы, получать ответы на вопросы.

                                                        Для построения ИДС 1, 2 уровни технологические, довольно проработанные. 3 служит для понижения шума значений слов. 4. ядро системы. В принципе очень самостоятельные уровни и можно работать над реализацией отдельно.

                                                        На практике чтобы ощутить 2 и 3 можно изучив язык lojban . Он создан, чтобы максимально упростить морфологию и синтаксис. И разговаривать на уровне символов и отношений между ними.

                                                        поиграться с 4 уровнем можно создавая модели в системе разработки интерактивных сценариев на базе естественного языка Inform. Статья на Хабре.

                                                        Все уровни довольно сложны, фундаментальны. Но заниматься можно ими совершенно раздельно. Например, довольно перспективна задача создания базы знаний в виде правил и фактов (CLIPS) (4 уровень). Например, для описания прожитого опыта.

                                                          0
                                                          +1 Спасибо, очень интересно. Приму к сведению. А вообще почитав комментарии понял, что не зря потратил время на написание статьи. Тема волнует многих, появляются не только вопросы, но и дельные предложения и критика. Это очень хорошо!
                                                            0
                                                            И не пропустите Prolog(одна из удачных реализаций). Можно получить ощущение, как машина думает. Для 2 уровня есть DCG.
                                                          0
                                                          может стоит воспользоваться тем, что уже существует, дополнить и усовершенствовать !?

                                                          «осмысление» и выдача ответа — задача любой экспертной системы. Каждая из существующих ЭС со своим уровнем гибкости, «самообучения». Как представляются знания в системе это отдельный вопрос, один из распространенных способов хранения — фреймы.

                                                          Есть множество диссертаций и докторских русских лингвистов. Чем не база для успешной работы? Не натыкаться на те же подводные камни проблемы, что там рассмотрены

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

                                                          Самое читаемое