Skip to content

shyzik93/ManSPy

Repository files navigation

ManSPy: "Programmer! Please, make me smart!"

Build Status

Краткая история диалога

Поверхностный взгляд

Основная идея - попытка ответить на вопросы:

  • Что максимального удастся сделать до привлечения искусственных нейронных сетей?
  • Является ли естественный язык Тьюринг-полный?

Основные принципы:

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

В идеальных преувеличенных планах:

  • экспертная система
  • система управления (ассистент)
  • написание скриптов на естественном языке

Программа построена по принципу подключаемых модулей:

  • заменяемый лингвистический модуль синтеза текста на языке Эсперанто (реализованы графематический, морфологический и постморфологический, синтаксический анализы) (/language/*)
  • заменяемые интерфейсные модули (/interface/*)
  • заменяемые исполнительные модули (/action/*)
  • заменяемые логирующие модули (/logger/*)
  • заменяемые модули базы данных (/database/*)
  • модуль хранения семантических отношений (/manspy/relation.py)
  • модуль анализа имеет объекты единиц речи: слова, предложения, текста, имеющие удобные функции для построения алгоритмов анализа (/manspy/unit.py)

Как работает ManSPy:

  1. Из модуля интерфейса от пользователя поступает предложение
  2. В лингвистическом модуле над ним производятся анализы:
    1. Графематический
    2. Морфологический
    3. Постморфологический
    4. Синтаксический
  3. Из анализов каждого предложения вынимается сказуемое и его актанты
  4. Из базы данных вынимаются ФАСИФы для актантов глагола (словосочетаний)
  5. На основании анализов и ФАСИФа получаем функции и аргуметы: своеобразный "внутренний язык"
  6. Функция и аргументы выполняются модулем выполнения функций
  7. Ответ из функции поступает в модуль интерфейса к пользователю

А как ManSPy можно использовать уже сейчас?

  • лингвистический анализ текста на языке Эсперанто
  • "подсвечивание" текстов на языке Эсперанто (например, в редакторах Sublime Text, Notepad++, PyCharm)
  • конвертация числительных, прилагателных и существительных (производные от числительных) в число.
  • Ваш вариант :)

Установка

Для установки используйте команду pip install https://github.com/shyzik93/manspy/archive/master.zip

Для удаления: pip uninstall manspy

В программе используются следующие сторонние модули Python, которые необходимо устанавливать отдельно из-за их отсутствия в стандартной библиотеке:

Запуск

Консольная команда manspy должна работать аналогично python3 cli.py

Командная строка - режим без интерфейсов

  • manspy --text "montru sesdek du kaj dolaran kurzon" - отобразить 62 и 60
  • manspy text_example.txt - если Вы находитесь в корне репозитория, то программа прочтёт файл text_example.txt и выполнит его, выведя на экран 80 и 91

Подробнее о командной строке: manspy -h

Для запуска программы служит файл run.py, размещёнеый в корне репозитория. В файле присутствуют словарь, позволяющий включать/отключать модули интерфейсов (МИ), через которые происходит взаимодействие пользователя с программой:

interfaces = {
  'autofeed':    1, # Автоподатчик, включён
  'TKinter':     1, # Примитивный чатб включён
  'jabber':      0, # Jabber,  выключен, но можно включить
  'vkcom':       0, # ВКонтакте, выключен из-за наличия ошибок
  'Commandline': 0  # Один из первых МИ, выключен так как не имеет смысла
  }

Есть ещё файл с настройками для авторизации в Jabber и ВКонтакте. Он расположен уровнем выше директории репозитория, имеет имя IFM_passwords.txt и следующее содержимое в формате JSON:

{
  "jabber": {
    "login": "ИмяПользователя@Сервер",
    "pass": "Пароль"
  },
  "vkcom": {
    "app_id": "ИдентификаторПриложения",
    "login": "ТелефонИлиЭлАдрес",
    "pass": "Пароль"
  }
}

Данный файл необходимо создать вручную, если хотите использовать интерфейс Jabber.

Файлы, генерируемые программой

После запуска появится директория DATA_BASE (расположена уровнем выше директории проекта), в которой будут сгенерированы следующие файлы:

  • analysis.txt - результаты анализа предложений (графематический, морфологический, постморфологический, синтаксический). Сюда же пишутся предложения на внутреннем языке (ВЯ), которые строятся на основе анализов и содержат выполняемые программой функции.
  • comparing_fasif.txt - результаты сравнения актанта (словосочетания) со словосочетанием в ФАСИФе.
  • history.txt - история диалога отдельно для каждого модуля интерфейсов (МИ)

А также директория Esperanto, в которой лежит файл БД main_data.db.

Директории репозитория

Репозиторий расположен в директории ManSPy (но может быть и любое другое имя), в которой расположены ещё две директории:

  • ManSPy - сама программа
  • IFModules - модули интерфейсов (МИ), выполненные в виде отдельных маленьких программ. В них реализованы варианты взаимодействия с программой: примитивный чат на TKinter'е, автоподатчик (используется для автоматической поочередной подачи предложений), доступ из чатов Jabber'а. Там же реализован механизм параллельной работы всех запущенных МИ и программы ManSPy. Вы можете писать собственные МИ, например, для доступа к программе из социальных сетей, виртуальных миров, а с использованием распознавания речи можно написать МИ для доступа через сотовую связь, также есть возможный вариант применения интерфейсов мозг-компьютер.

В файле run.py происходит создание объекта программы и его передача в модули интерфейсов. Объект программы имеет следующие функции, которые вызываются МИ:

  • send_to_in(IF, w_text) - принимает МИ и текст на естественном языке.

В свою очередь модуль интерфейса должен содержать следующие функции, которые вызываются ManSPy:

  • init() - инициализация модуля
  • to_IF(read_text) - передаёт ответ

ФАСИФ - формат ассоциирования слов и функций.

ФАСИФ - это формат, в котором удобно описывать ассоциации между функцией и глаголом и/или словосочетанием. В ассоциациях лингвистическую информацию можно писать сразу для нескольких языков, хотя пока доступен один - Эсперанто. Существует два вида ФАСИФа.

Первый вид - это ассоциация функции и глагола. В данном случае указывается функция и имя глагола, возможно, с синонимами. В функцию будут передаваться состояния словосочетаний, которые могут быть выведены в качестве ответов, но могут быт и другие варианты использования (зависит от указанной функции). О состоянии словосочетания - ниже. Например доступен для использования глагол montru, выводящий состояния в МИ. Глаголы могут быть переопределены в ФАСИФе второго вида для каждого словосочетания отдельно.

Второй вид - это ассоциация функции и словосочетания, а также функции и глагола, связанного со словосочетанием. В нём подробно описываются аргументы функции, их соответствие словам в конкретном словосочетании. Слово, ассоциированное с аргументом функции, называется аргументным. Причём для аргументного слова указываются гиперонимы - абстрактные группы, в которые это аргументное слово может входить. Кроме этого, для аргументов, при необходимости, указывается таблица конвертации, в которой указываются возможные аргументные слова и то, на что они должны замениться перед передачей в функцию, если не указано, то в функцию передаётся корень слова.

Каждое словосочетание может иметь несколько глаголов, и для каждого - своя функция.

В данный момент реализованы ФАСИФы для получения курса валют, включения/выключения света - сейчас сделана эмуляция, получения IP-адреса компьютера.

Написание собственных МИ

Модули МИ находятся в /ifmodules и имеют имя IFM_*.py, где * (звёздочка) - имя Вашего модуля. Модуль содержит класс с именем Interface. Класс имеет слеующую структуру:

class Interface():
    def __init__(self, API):
        self.API = API
        self.settings = {} # настройки ManSPy, действующие только для данного МИ. Необязательны.

    def your_name(self):
        ''' Одна из Ваших любых функций с любым именем и любыми аргументами. '''

        # передаём сообщение в ManSPy. Ответ от ManSPy будет передан в self.send_to_out.
        # any_data - необязательный аргумент. Будет передан в self.send_to_out.
        self.API.send_to_in(self, "Ваше сообщение", any_data)

    def send_to_out(self, r_text, any_data):
        ''' Функция принимает: r_text - ответ от Manspy, any_data - произвольная информация от данного класса 
        '''

    def init(self):
        ''' код инициализации модуля '''

Подробно о ФАСИФе

Releases

No releases published

Packages

No packages published

Languages