- https://github.com/shyzik93/ManSPy/wiki - описание алгоритмов
Основная идея - попытка ответить на вопросы:
- Что максимального удастся сделать до привлечения искусственных нейронных сетей?
- Является ли естественный язык Тьюринг-полный?
Основные принципы:
- генерация максимальной информации о предложении на естественном языке на всём пути вход-выход и её учёт при последующих анализах.
- обобщение информации (аналогично нейронным сетям) на всём пути вход-выход: от предложения на естественном языке до функции с аргументами
- восстановливаемость исходного предложения на естественном языке из результатов лингвистических анализов: это должно обеспечить качественный анализ, а в будущем - помочь с синтезом текста.
- при обнаружении в предложении двусмысленности программа должна задать уточняющий вопрос
- при обнаружении в предложении недосказанности программа должна задать уточняющий вопрос
В идеальных преувеличенных планах:
- экспертная система
- система управления (ассистент)
- написание скриптов на естественном языке
Программа построена по принципу подключаемых модулей:
- заменяемый лингвистический модуль синтеза текста на языке Эсперанто (реализованы графематический, морфологический и постморфологический, синтаксический анализы) (/language/*)
- заменяемые интерфейсные модули (/interface/*)
- заменяемые исполнительные модули (/action/*)
- заменяемые логирующие модули (/logger/*)
- заменяемые модули базы данных (/database/*)
- модуль хранения семантических отношений (/manspy/relation.py)
- модуль анализа имеет объекты единиц речи: слова, предложения, текста, имеющие удобные функции для построения алгоритмов анализа (/manspy/unit.py)
Как работает ManSPy:
- Из модуля интерфейса от пользователя поступает предложение
- В лингвистическом модуле над ним производятся анализы:
- Графематический
- Морфологический
- Постморфологический
- Синтаксический
- Из анализов каждого предложения вынимается сказуемое и его актанты
- Из базы данных вынимаются ФАСИФы для актантов глагола (словосочетаний)
- На основании анализов и ФАСИФа получаем функции и аргуметы: своеобразный "внутренний язык"
- Функция и аргументы выполняются модулем выполнения функций
- Ответ из функции поступает в модуль интерфейса к пользователю
- лингвистический анализ текста на языке Эсперанто
- "подсвечивание" текстов на языке Эсперанто (например, в редакторах Sublime Text, Notepad++, PyCharm)
- конвертация числительных, прилагателных и существительных (производные от числительных) в число.
- Ваш вариант :)
Для установки используйте команду pip install https://github.com/shyzik93/manspy/archive/master.zip
Для удаления: pip uninstall manspy
В программе используются следующие сторонние модули Python, которые необходимо устанавливать отдельно из-за их отсутствия в стандартной библиотеке:
- lxml - для парсинга страниц при авторизации во "ВКонтакте" и для парсинга страниц с курсами валют от ЦБ. (для ОС Windows: https://www.lfd.uci.edu/~gohlke/pythonlibs/)
- cssselect - может проситься модулем lxml (https://codeload.github.com/SimonSapin/cssselect/zip/master, https://github.com/SimonSapin/cssselect/)
- xmpp - реализация протокола для jabber (https://xmpppy.sourceforge.net/, https://sourceforge.net/projects/xmpppy/files/, https://raw.githubusercontent.com/freebsd/freebsd-ports/master/net-im/py-xmpppy/files/patch-xmpp-transports.py - информация об исправлении ошибки в модуле)
- https://pypi.python.org/pypi/eonums/0.9.0 - простенький конвертер числительных на Эсперанто в числа и наоборот. На данный момент для ManSPy написан собственный код конвертирования в числа, который понимает части речи, производные от числительных.
- TKinter - может требоваться на ОС Linux (команда для установки: "aptitude install python3-tk")
Консольная команда 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):
''' код инициализации модуля '''