An open API service indexing awesome lists of open source software.

https://github.com/shyzik93/manspy

Management System (universal and interactive)
https://github.com/shyzik93/manspy

esperanto linguistics lingvo proccessing-language python

Last synced: 6 months ago
JSON representation

Management System (universal and interactive)

Awesome Lists containing this project

README

          

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

[![Build Status](https://travis-ci.com/shyzik93/ManSPy.svg?branch=master)](https://travis-ci.com/shyzik93/ManSPy)

- http://github.com/shyzik93/ManSPy/wiki - описание алгоритмов

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

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

Основная идея - попытка ответить на вопросы:
- Что максимального удастся сделать до привлечения искусственных нейронных сетей?
- Является ли естественный язык [Тьюринг-полный](wiki)?

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

В идеальных преувеличенных планах:
- *экспертная система*
- *система управления (ассистент)*
- *написание скриптов на естественном языке*

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

Как работает ManSPy:
1. Из модуля интерфейса от пользователя поступает предложение
1. В лингвистическом модуле над ним производятся анализы:
1. Графематический
1. Морфологический
1. Постморфологический
1. Синтаксический
1. Из анализов каждого предложения вынимается сказуемое и его актанты
1. Из базы данных вынимаются ФАСИФы для актантов глагола (словосочетаний)
1. На основании анализов и ФАСИФа получаем функции и аргуметы: своеобразный "внутренний язык"
1. Функция и аргументы выполняются [модулем выполнения функций](https://github.com/shyzik93/manspy/blob/master/manspy/FCModule)
1. Ответ из функции поступает в модуль интерфейса к пользователю

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

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

# Установка

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

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

В программе используются следующие сторонние модули Python, которые необходимо устанавливать отдельно из-за их отсутствия в стандартной библиотеке:
- lxml - для парсинга страниц при авторизации во "ВКонтакте" и для парсинга страниц с курсами валют от ЦБ. (для ОС Windows: http://www.lfd.uci.edu/~gohlke/pythonlibs/)
- cssselect - может проситься модулем lxml (https://codeload.github.com/SimonSapin/cssselect/zip/master, https://github.com/SimonSapin/cssselect/)
- xmpp - реализация протокола для jabber (http://xmpppy.sourceforge.net/, http://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, размещёнеый в корне репозитория. В файле присутствуют словарь, позволяющий включать/отключать модули интерфейсов (МИ), через которые происходит взаимодействие пользователя с программой:
```python
interfaces = {
'autofeed': 1, # Автоподатчик, включён
'TKinter': 1, # Примитивный чатб включён
'jabber': 0, # Jabber, выключен, но можно включить
'vkcom': 0, # ВКонтакте, выключен из-за наличия ошибок
'Commandline': 0 # Один из первых МИ, выключен так как не имеет смысла
}
```

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

```python

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):
''' код инициализации модуля '''

```

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