# python-ruwordnet
This is a Python wrapper for the [RuWordNet](https://ruwordnet.ru/en) thesaurus.

Это питонячья обёртка для тезауруса [RuWordNet](https://ruwordnet.ru/ru).

В настоящий момент поддержана версия начала 2020 года: 49713 синсетов 
(смысловых групп), 130417 значений слов и словосочетаний. 

## Что это такое
RuWordNet --- это один из немногих тезаурусов для русского языка.

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

RuWordNet разбит на *синсеты* --- наборы синонимичных слов и словосочетаний.
Между синсетами установлены бинарные отношения, такие, как *гипоним-гипероним*, 
то есть "частное-общее". Например, "спаржа" является частным случаем "овощей".
Такая разметка на синонимы и гиперонимы позволяет устанавливать отношения
между словами с большей надёжностью (по крайней мере, в теории), 
чем при помощи word2vec и прочей дистрибутивной семантики.

Основными сущностями в тезаурусе являются `Sense` (смысл) - одно конкретное
слово или словосочетание с конкретным же значением, а также `Synset` (синсет) - 
множество сущностей `Sense` с одинаковыми значениями и с одной частью речи. 
Части речи поддержано три: существительное `N`, глагол `V`, и прилагательное `A`.
Некоторые `Sense` состоят из нескольких слов, и часть речи им присваивается
по главному слову.

В текущей версии тезауруса поддержаны следующие отношения между синсетами:
- `hyponyms` / `hypernyms` : более частные и более общие понятия, например,
"спаржа" / "овощи"
- `domains` / `domain_items`: домены и их атрибуты, например, "спорт" / "мяч"
- `meronyms` / `holonyms`: части и целые, например, "желудь" / "дуб"
- `classes` / `instances` : классы и экземпляры, например, "Смоленск" / "областной центр"
- `premises` / `conclusions`: предпосылки и возможные выводы из них, например, 
  "прибежать" / "бегать" (поддержано только для глаголов)
- `causes` / `effects`: причины и следствия, например, TODO (только для глаголов)
- `pos_synonyms`: синонимы из других частей речи
- `antonyms`: антонимы

Кроме того, есть отношения между смыслами:
- `words` / `phrases` - из каких слов состоит фраза, и в каких фразах участвует
слово, например, "чувство" / "порыв чувств"
- `sources` / `derivations` - от каких слов произошло данное, и какие произошли
от него, например, "приятель" / "приятельский"
  
В данном пакете тезаурус обёрнут в ORM `SQLAlchemy`. Это значит, что вы можете
скачать его содержимое в виде текстовой базы sqlite, либо переложить его в
свою собственную базу данных.


## Как запускать
Чтобы воспользоваться тезаурусом, выберите одну из двух опций:
1. Либо клонируйте этот репозиторий;
2. Либо установите пакет и скачайте файл с тезаурусом (около 80 мб):
```commandline
pip install ruwordnet
ruwordnet download
```

Для применения пакета нужно создать объект `RuWordNet`:
```python
from ruwordnet import RuWordNet
wn = RuWordNet()
```

Если вы не использовали команду `ruwordnet download`, вы можете самостоятельно
указать путь до файла либо передать в конструктор открытую сессию SQLAlchemy:
```python
from ruwordnet import RuWordNet
wn = RuWordNet(filename_or_session='ruwordnet/static/ruwordnet.db')
```

После этого можно, например, искать синсеты, в которые входит слово
```python
for sense in wn.get_senses('замок'):
    print(sense.synset)
# Synset(id="126228-N", title="СРЕДНЕВЕКОВЫЙ ЗАМОК")
# Synset(id="114707-N", title="ЗАМОК ДЛЯ ЗАПИРАНИЯ")
```

Для каждого синсета можно глядеть на гиперонимы...
```python
wn.get_senses('спаржа')[0].synset.hypernyms
# [Synset(id="348-N", title="ОВОЩИ"),
#  Synset(id="4789-N", title="ТРАВЯНИСТОЕ РАСТЕНИЕ"),
#  Synset(id="6878-N", title="ОВОЩНАЯ КУЛЬТУРА")]
```
... или, наоборот, на гипонимы
```python
vegetables = wn.get_senses('спаржа')[0].synset.hypernyms[0]
vegetables.hyponyms
# [Synset(id="107993-N", title="АРТИШОК"),
# Synset(id="108482-N", title="СПАРЖА"),
# Synset(id="118660-N", title="ЗЕЛЕНЫЙ ГОРОШЕК"),
# ...
```

Больше примеров использования есть в .ipynb файлах в данном репозитории.