Commits

Mikhail Korobov committed e81cbc1

readme; python 3.3 support; minor fixes

Comments (0)

Files changed (7)

 \.pyc$
 ^\.tox
 ^\.coverage$
-^MANIFEST$
+^MANIFEST$
+ipynb$
+===============
+russian-tagsets
+===============
+
+``russian-tagsets`` - библиотека для преобразования между
+различными форматами обозначения грамматической информации
+для слов русского языка. Лицензия - MIT.
+
+На данный момент поддерживается (с разной степенью корректности)
+преобразование между следующими форматами:
+
+* `OpenCorpora`_;
+* `aot.ru`_ (в.т.ч. pymorphy_ 0.5.6);
+* `Диалог-2010`_
+* `A Positional Tagset for Russian`_ (Jirka Hana and Anna Feldman, 2010);
+
+.. _OpenCorpora: http://opencorpora.org/dict.php?act=gram
+.. _aot.ru: http://aot.ru/docs/rusmorph.html
+.. _pymorphy: http://pymorphy.readthedocs.org/en/v0.5.6/ref/gram_info_ru.html
+.. _Диалог-2010: http://ru-eval.ru/
+.. _A Positional Tagset for Russian: http://ufal.mff.cuni.cz/~hana/morph/rutags.html
+
+Идея такая: для каждого формата в библиотеке определяется
+несколько функций, которые преобразуют тег в другие форматы;
+если какое-то преобразование явным образом не определено,
+``russian-tagsets`` пытается построить цепочку преобразований,
+приводящую к нужному результату.
+
+.. warning::
+
+    Преобразование почти никогда не выходит осуществить без потерь;
+    если можно эту библиотеку не использовать, то лучше и не использовать.
+
+Установка
+=========
+
+pip install russian-tagsets
+
+Использование
+=============
+
+"Автоматический" режим (библиотека пытается найти пути преобразования)::
+
+    >>> from russian_tagsets import converters
+    >>> to_aot = converters.converter('opencorpora-int', 'aot')
+    >>> to_aot("NOUN,anim,masc plur,nomn")
+    С,од,мр,мн,им
+
+Поддерживаемые напрямую форматы::
+
+    >>> converters.get_supported()
+    [(u'positional', u'aot'),
+     (u'opencorpora', u'opencorpora-int'),
+     (u'opencorpora', u'aot'),
+     (u'aot', u'positional'),
+     (u'aot', u'dialog2010'),
+     (u'dialog2010', u'aot'),
+     (u'opencorpora-int', u'opencorpora')]
+
+"Ручной" режим (быстрее, но преобразование только напрямую)::
+
+    >>> import russian_tagsets
+    >>> russian_tagsets.aot.to_positional(u"С,од,мр,мн,им")
+    Tag("NNMAP1-------A--")
+
+
+Разработка
+==========
+
+Репозитории:
+
+* https://github.com/kmike/russian-tagsets
+* https://bitbucket.org/kmike/russian-tagsets
+
+Баг-трекер - на гитхабе.
+
+Для запуска тестов выполните
+
+    tox
+
+из папки с репозиторием.

russian_tagsets/convert_engine.py

 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
+import collections
 
 class NoConvertPath(Exception):
     pass
     def __init__(self):
         # Directed graph of all possible transformations.
         # _registry['from']['to'] -> transformation function
-        self._registry = {}
+        self._registry = collections.defaultdict(dict)
 
     def add(self, type_from, type_to, method):
         """
         :param:``method`` signature should receive object of type ``type_from``
         and return an object of type ``type_to``.
         """
-        if type_from not in self._registry:
-            self._registry[type_from] = {}
-
         self._registry[type_from][type_to] = method
 
     def path(self, type_from, type_to):
         for func in self.steps(type_from, type_to):
             obj = func(obj)
         return obj
+
+    def get_supported(self):
+        res = []
+        for type_from in self._registry:
+            for type_to in self._registry[type_from]:
+                res.append((type_from, type_to))
+        return res

russian_tagsets/converters.py

 # -*- coding: utf-8 -*-
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 from russian_tagsets.convert_engine import Registry
 
 _registry = Registry()
     for func in steps(type_from, type_to):
         obj = func(obj)
     return obj
+
+def get_supported():
+    """
+    Returns a list of directly supported conversions
+    """
+    return _registry.get_supported()
+
+def converter(type_from, type_to):
+    """
+    Returns conversion function.
+    """
+    def conversion_func(tag):
+        return convert(tag, type_from, type_to)
+
+    conversion_func.__doc__ = """
+    Converts ``tag`` from '%s' to '%s'.
+    """ % (type_from, type_to)
+    return conversion_func

russian_tagsets/opencorpora.py

 
 
 def to_aot(open_tag):
-    open_tags = open_tag.split(',')
+    open_tags = open_tag.replace(" ", ',').split(',')
     open_pos, open_info = open_tags[0], open_tags[1:]
 
     pos = EXTERNAL_TO_AOT.get(open_pos, None)
 converters.add('opencorpora-int', 'opencorpora', internal_to_external)
 converters.add('opencorpora', 'opencorpora-int', external_to_internal)
 converters.add('opencorpora', 'aot', to_aot)
-converters.add('aot', 'opencorpora', from_aot)
+#converters.add('aot', 'opencorpora', from_aot)
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
         'Programming Language :: Python :: 3.2',
+        'Programming Language :: Python :: 3.3',
         'Topic :: Software Development :: Libraries :: Python Modules',
         'Topic :: Scientific/Engineering :: Information Analysis',
         'Topic :: Text Processing :: Linguistic',
 [tox]
-envlist = py26,py27,py32,pypy
+envlist = py26,py27,py32,py33,pypy
 
 [testenv]
 deps =