Можно ли Использовать Pymorphy2 в Ironpython или другим доступным способом в .NET?

467 views
Skip to first unread message

appinve...@gmail.com

unread,
Sep 24, 2014, 6:24:49 AM9/24/14
to pymo...@googlegroups.com
Можно ли Использовать Pymorphy2 в Ironpython или другим доступным способом в .NET? Если это возможно, то, мб, кто-то уже пытался? Хотелось бы иметь сборку для .NET, насколько я понимаю это возможно через  PyPy, или нет?

Yuri Baburov

unread,
Sep 24, 2014, 9:05:54 AM9/24/14
to pymo...@googlegroups.com
Привет,

а не проще будет за час сделать API через socket-ы и клиент-сервер?
> --
> Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



--
Best regards, Yuri V. Baburov, Skype: yuri.baburov

appinve...@gmail.com

unread,
Sep 24, 2014, 2:54:20 PM9/24/14
to pymo...@googlegroups.com


среда, 24 сентября 2014 г., 17:05:54 UTC+4 пользователь Yuri Baburov написал:
Привет,

а не проще будет за час сделать API через socket-ы и клиент-сервер?


--
Best regards, Yuri V. Baburov, Skype: yuri.baburov
А чем плох IronPython? не очень-то хочется городить клиент-сервер там где можно обойтись без него, ладно бы было готовое решение. Кстати подскажите как использовать токенизатор из pymorphy2?

Mikhail Korobov

unread,
Sep 24, 2014, 3:12:35 PM9/24/14
to pymo...@googlegroups.com, appinve...@gmail.com
Привет. Я не пробовал сам (да и дела с .NET не имел), но, думаю, pymorphy2 должен работать нормально в IronPython, т.к. pymorphy2 - обычный питоний пакет, никаких C-расширений ему не надо. Нужно только пакет DAWG-Python устанавливать, а не DAWG.

Токенизатор в pymorphy2 довольно примитивный; пример использования:

In [1]: from pymorphy2.tokenizers import simple_word_tokenize
In [2]: for token in simple_word_tokenize(u'Какой-то текст'):
   ...:     print token
   ...:    
Какой-то
текст

четверг, 25 сентября 2014 г., 0:54:20 UTC+6 пользователь appinve...@gmail.com написал:

appinve...@gmail.com

unread,
Sep 24, 2014, 4:41:27 PM9/24/14
to pymo...@googlegroups.com, appinve...@gmail.com
да все хорошо кроме кодировки строк

Yuri Baburov

unread,
Sep 25, 2014, 2:50:08 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
А в чём проблемы с кодировкой строк?
В том, что у консоли codepage не уникодная?
Или какие-то у самого IronPython заморочки?

2014-09-25 3:41 GMT+07:00 <appinve...@gmail.com>:
> да все хорошо кроме кодировки строк
>
> --
> Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



appinve...@gmail.com

unread,
Sep 25, 2014, 5:11:02 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com


четверг, 25 сентября 2014 г., 10:50:08 UTC+4 пользователь Yuri Baburov написал:
А в чём проблемы с кодировкой строк?
В том, что у консоли codepage не уникодная?
Или какие-то у самого IronPython заморочки?

--
Best regards, Yuri V. Baburov, Skype: yuri.baburov
Приходится перед parse преобразовывать в utf8, затем когда я получаю результат (например normal_form) он имеет вид u'/xb0 ...' обратное преобразование подобрать не удается. Так происходит  в консоли, если я вызываю функцию из программы на c#, то тоже получаю кракозябры.   В обычном  питоне 3.4 все нормально даже в консоли

Mikhail Korobov

unread,
Sep 25, 2014, 5:19:57 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
Перед parse преобразровывать в utf-8 - это точно неправильно; parse работает только с юникодом, а не байтовыми строками в utf-8.

четверг, 25 сентября 2014 г., 15:11:02 UTC+6 пользователь appinve...@gmail.com написал:

Mikhail Korobov

unread,
Sep 25, 2014, 5:32:22 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
В Python 2.x кракозябры, к которым нужно стремиться, примерно такие: u'\u041a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0435\u043a\u0441\u0442'. Если подобный текст на входе и подобный текст на выходе, то все правильно :) Если консоль настроена правильно, то должно работать

In [1]: print u'\u041a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0435\u043a\u0441\u0442'
Какой-то текст

В результатах разбора в Python 2.x тоже *должны* быть подобные кракозябры, например

In [1]: import pymorphy2; m = pymorphy2.MorphAnalyzer()
In [2]: m.parse(u'кот')
Out[2]: [Parse(word=u'\u043a\u043e\u0442', tag=OpencorporaTag('NOUN,anim,masc sing,nomn'), normal_form=u'\u043a\u043e\u0442', score=1.0, methods_stack=((<DictionaryAnalyzer>, u'\u043a\u043e\u0442', 51, 0),))]

Если в Python 2.x видно что-то другое (втч нормальный читаемый русский текст), то это ошибка.

Чтоб посмотреть, что кракозябры значат, можно их напечатать:

In [7]: m.parse(u'котом')[0].normal_form
Out[7]: u'\u043a\u043e\u0442'

In [8]: print m.parse(u'котом')[0].normal_form
кот




четверг, 25 сентября 2014 г., 15:19:57 UTC+6 пользователь Mikhail Korobov написал:

Yuri Baburov

unread,
Sep 25, 2014, 6:38:11 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
Привет,

http://habrahabr.ru/post/117236/ почитай.
или я как-то отвечал на похожую проблему тут:
http://toster.ru/q/7249#answer_31199

В общем, на входе делаешь .decode('cp866', 'ignore'), на выходе
делаешь .encode('cp866' 'ignore') ,
в более общем случае, sys.stdin.encoding и sys.stdout.encoding

В IronPython всё должно быть также…
> --
> Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



appinve...@gmail.com

unread,
Sep 25, 2014, 6:40:12 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com


четверг, 25 сентября 2014 г., 13:19:57 UTC+4 пользователь Mikhail Korobov написал:
Перед parse преобразровывать в utf-8 - это точно неправильно; parse работает только с юникодом, а не байтовыми строками в utf-8.

спасибо, учту,но если я не делаю encode() он пишет что ожидал строку а не byte,зато,  что характерно после преобразования он возвращает какой-то результат.  насчет m.parse(u'кот') , как быть если слово передается параметром из программы на c#

Mikhail Korobov

unread,
Sep 25, 2014, 7:16:52 AM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
Если C# возвращает байты, то перед передачей данных в pymorphy2 нужно делать .decode, а не .encode. Но как там это организовано - не знаю. Короче говоря, тип входных параметров (text.__class__) в 2.х должен быть unicode.

четверг, 25 сентября 2014 г., 16:40:12 UTC+6 пользователь appinve...@gmail.com написал:

Yuri Baburov

unread,
Sep 25, 2014, 3:55:15 PM9/25/14
to pymo...@googlegroups.com, appinve...@gmail.com
Привет,

Используй отладку, это всегда самый универсальный совет.
Скажем, посмотри, что выдаёт
print type(yourvar) на твои переменные, которые ты скармливаешь pymorphy2 ,
и что ты получаешь на выходе от pymorphy2.
Немного сложнее понимать, что происходит в языке с динамической
типизацией, если не представляешь, что за каждым типом скрывается.
Ещё можно assert’ы расставлять.
> --
> Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



appinve...@gmail.com

unread,
Oct 12, 2014, 6:00:16 PM10/12/14
to pymo...@googlegroups.com, appinve...@gmail.com


четверг, 25 сентября 2014 г., 23:55:15 UTC+4 пользователь Yuri Baburov написал:
Привет,

Используй отладку, это всегда самый универсальный совет.
Скажем, посмотри, что выдаёт
print type(yourvar) на твои переменные, которые ты скармливаешь pymorphy2 ,
и что ты получаешь на выходе от pymorphy2.
Немного сложнее понимать, что происходит в языке с динамической
типизацией, если не представляешь, что за каждым типом скрывается.
Ещё можно assert’ы расставлять.

пришлось менять текст dawgs.py Добавить преобразование в строку a2b_base64(str(b64_data))

Mikhail Korobov

unread,
Dec 9, 2014, 6:56:04 AM12/9/14
to pymo...@googlegroups.com, appinve...@gmail.com
А может такое быть, что это баг в IronPython? Вот этот https://ironpython.codeplex.com/workitem/15372 или еще какой-то?
Если не сложно, то можете проверить, с IronPython 2.7.5 все еще фикс нужен?

понедельник, 13 октября 2014 г., 4:00:16 UTC+6 пользователь appinve...@gmail.com написал:

Александр

unread,
Dec 9, 2015, 8:55:42 AM12/9/15
to pymorphy, appinve...@gmail.com


пришлось менять текст dawgs.py Добавить преобразование в строку a2b_base64(str(b64_data))


Но в итоге удалось запустить проект?

Александр

unread,
Dec 16, 2015, 5:59:46 AM12/16/15
to pymorphy, appinve...@gmail.com
Проверил работу примера. В нем речь идет о Python - как о языке скриптов для c# программ.
https://borisnote.wordpress.com/2011/09/20/ironpython-in-csh/
Проверял на Windows XP, VS 2010 экспресс выпуск.

Александр

unread,
Dec 17, 2015, 2:30:33 PM12/17/15
to pymorphy, appinve...@gmail.com
Вот это вообще то что нужно.
https://msdn.microsoft.com/ru-ru/library/ee461504.aspx?cs-lang=csharp&cs-save-lang=1
Позволяет вызвать питоний метод, написав в c# такой вызов

            ScriptRuntime py = Python.CreateRuntime();
            dynamic random = py.UseFile("D:\\HProjects\\VS\\PythonAndNETTest2\\ConsoleApplication1\\ConsoleApplication1\\random.py");
            random.Simple();

Но по скольку это динамическое выражение - никаких вам IntelliSense и прочего богатства. Если навести на Simple, то VS пишет - Данная операция будет разрешена во время выполнения. Последний шаг "полное" встраивание IronPython вVS. Но я не уверен что это возможно на NET 4.0. А ради 4.5.нужно менять винду пока не хотелось бы...

Yuri Baburov

unread,
Dec 17, 2015, 11:36:20 PM12/17/15
to pymo...@googlegroups.com, appinve...@gmail.com

Нормальные люди делают микросервисы в таких случаях. Модульность, не нужно перезапускать когда программа перезапускается, API, все дела.

18 дек. 2015 г. 1:30 пользователь "Александр" <idus...@gmail.com> написал:
--

Александр

unread,
Dec 18, 2015, 1:49:56 AM12/18/15
to pymorphy, appinve...@gmail.com
Я не знаю как сделать .dll с помощью python которую воспринимал бы .NET. Если есть ссылки - давай, или опиши что это за способ немного по подробнее, если это не dll.

Yuri Baburov

unread,
Dec 18, 2015, 3:43:00 AM12/18/15
to pymo...@googlegroups.com, appinve...@gmail.com
Не надо dll. Полностью отдельные процессы.
TCP Server + TCP Client (т.е. свой протокол), или HTTP Server + HTTP Client (протокол HTTP + какой-нибудь REST поверх HTTP).
Документации по обоим вариантам полно.

2015-12-18 12:49 GMT+06:00 Александр <idus...@gmail.com>:
Я не знаю как сделать .dll с помощью python которую воспринимал бы .NET. Если есть ссылки - давай, или опиши что это за способ немного по подробнее, если это не dll.

--
Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Yuri Baburov

unread,
Dec 18, 2015, 3:43:54 AM12/18/15
to pymo...@googlegroups.com, appinve...@gmail.com
Могу питоновскую версию сервера и тестового клиента сделать, если скажешь, какие методы тебе нужны.

Александр

unread,
Dec 18, 2015, 6:13:19 AM12/18/15
to pymorphy, appinve...@gmail.com


пятница, 18 декабря 2015 г., 11:43:54 UTC+3 пользователь Yuri Baburov написал:
Могу питоновскую версию сервера и тестового клиента сделать, если скажешь, какие методы тебе нужны.


2015-12-18 14:43 GMT+06:00 Yuri Baburov <bur...@gmail.com>:
Не надо dll. Полностью отдельные процессы.
TCP Server + TCP Client (т.е. свой протокол), или HTTP Server + HTTP Client (протокол HTTP + какой-нибудь REST поверх HTTP).
Документации по обоим вариантам полно.

Спасибо за предложение, но пока я к этому не готов. Мне кажется, эта прослойка усложнит дело. Если у меня не получатся другие варианты я об этом подумаю. Но даже то, что работает сейчас в примерах, вроде бы достаточно для запуска pymorphy2 в рамках C#. Подход HTTP Server + HTTP Client  наверно оправдан и удобен если нам нужно WEB приложение. Я сейчас хочу WinForms сделать.

Yuri Baburov

unread,
Dec 18, 2015, 8:48:49 AM12/18/15
to pymo...@googlegroups.com, appinve...@gmail.com
А что там усложнит дело?
50 строчек кода с каждой стороны на один метод, плюс ещё двадцать на каждый следующий.

Просто если будешь приложение как-то распространять или вместе с кем-то программировать, то такой компонентный подход намного удобнее -- можно сделать отдельный цельный bundle для pymorphy и забыть о нём.

--
Вы получили это сообщение, поскольку подписаны на группу "pymorphy".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес pymorphy+u...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages