• Как написать нейронную сеть для генеалогического древа?

    @kmike
    Проблема не в том, что с нейронными сетями дела не имели, а в том, что не знаете, как задачу сформулировать так, что ее можно было решать методами машинного обучения. Я бы посоветовал какой-нибудь вводный курс по ML (на coursera или udacity?), без разницы, с нейросетями или без. Если поймете, как задачу сформулировать (что на входе, что на выходе - что найти надо), то станет очевидно, как нейросеть (или любой другой классификатор) применять. Если в задаче не нужно код для нейросети писать, можно готовую реализацию взять, если нужно - ну написать можно; я так понимаю, проблема-то не в этом.
    Ответ написан
    Комментировать
  • Как решить проблему со склонением городов и pymorphy2?

    @kmike
    Конкретно для примеров из вопроса все решается в рамках pymorphy2 как-то так:

    from pymorphy2.shapes import restore_capitalization
    
    def inflect_all(morph, text, required_grammemes):
        tokens = text.split()
        inflected = [
            restore_capitalization(
                morph.parse(tok)[0].inflect(required_grammemes).word,
                tok
            )
            for tok in tokens
        ]
        return " ".join(inflected)


    Больше информации - см. в гуглогруппе: https://groups.google.com/forum/?fromgroups#!topic...

    Подозреваю, что решение от Яндекса тоже будет ошибаться время от времени, и для него тоже хорошо бы прикрутить ручную исправлялку. Но работать должно все-таки получше, чем pymorphy2, т.к. библиотека pymorphy2 специально для склонения не затачивалась пока.
    Ответ написан
    Комментировать
  • Scrapy — множественные страницы в единственный item

    @kmike
    Можно сделать так: добавлять запросы на получение размера по одному — get_page_size вызывает следующий get_page_size и т.д., пока что-то еще есть в очереди. Последний в цепочке возвращает элемент. «Очередь» можно передавать через meta.

    Я не спец — возможно, есть варианты и лучше.
    Ответ написан
    Комментировать
  • Самый быстрый алгоритм определения страны по номеру телефона

    @kmike
    Вариант со словарем — хороший. Можно попробовать выжать еще крохи: не делать несколько запросов в хэш-таблицу (причем, скорее всего, в цикле на питоне) для определения кодов стран, а вместо этого мэппинг «код страны» -> «страна» хранить в Trie (или DAWG).

    В github.com/kmike/datrie есть метод longest_prefix_item, которым можно получить самый длинный префикс данного номера и соответствующий ему объект. Записываем в datrie.Trie мэппинг «префикс-страна», вызываем longest_prefix_item и готово.

    Вполне может оказаться быстрее (главным образом за счет того, что итерация будет вынесена в C-расширение и не нужно будет создавать копии строк длины 1, 2, 3 и тд). Гарантировать, что будет быстрее, не могу, но, в любом случае, с Trie из питона должно как минимум 1млн номеров/сек получаться.
    Ответ написан
    Комментировать
  • Outsource review PostgresSQL и сервера на Django?

    @kmike
    Cразу на ум пришли ребята из www.revsys.com/ — они специализируются на PostgreSQL и там работают некоторые авторы Django.
    Ответ написан
  • Нейросеть «воздерживается». Как лечить?

    @kmike
    Хорошо бы проверить, что при тренировке ошибок не сделали (не перепутаны ли входные данные, нормализованы ли они и т.д.). Например, если данные не нормализованы, и какая-нибудь малозначительная переменная принимает большие значения, то получится, что нейросеть будет в основном эту переменную учитывать, и результат будет зависеть почти только от нее (а т.к. на самом деле результат от нее не зависит, то для уменьшения ошибки сеть может «скатиться» к 0.5 или какому-то другому значению).

    Дальше, вы пишете, что «округляли значения до 0 или 1» — ваши «кластеры значений» — это < 0.5 и > 0.5? «Кучкуются около 2 уровней» — около 0 и 1, или около каких-то других? Какой смысл имеют выходные переменные, там точно уровень имеет значение? ну там x1=0.1, x2=0.3, x3=1 и можно ли сказать, что в каком-то смысле x3 > x2 > x1, и что «еще немного, и x2 стал бы x1»? Если на самом деле там не непрерывная входная переменная, то можно попробовать заменить ее на несколько логических («вероятности принадлежности к кластерам значений») — в тренировочных данных они 0 или 1 будут, т.к. эти для тестовых данных известно, принадлежит значение к кластеру или нет (это то же самое, что вы сделали, или нет?).

    Параметры сети (количество нейронов, функции активации) можно подбирать так, чтоб уменьшалась ошибка кросс-валидации (проверив в конце на неиспользованном наборе данных, что оверфиттинга по параметрам сети не случилось), но это уже детали.
    Ответ написан
  • Есть ли reStructuredText wysiwyg редактор под Mac Os?

    @kmike
    В IDEA / PyCharm для reStructuredText есть подсветка и автодополнение, остановился в итоге на нем.
    Ответ написан
    Комментировать
  • Использование морфологического словаря от OpenCorpora в коммерческом проекте?

    @kmike
    Производное произведение от словаря — да, под CC. При этом коммерческий продукт может так и оставаться закрытым и коммерческим. Если вы коммерческий продукт распространяете, то нужно просто где-то указать, что словари взяли из OpenCorpora.

    Там в FAQ ( opencorpora.org/?page=faq ) написано: «На условиях лицензии Creative Commons Attribution-ShareAlike 3.0. Т.е. бесплатно, но при создании чего-либо на основе этих данных вы обязаны указать, что эти данные взяли у нас, а распространять их дальше можно только на этих же условиях.»

    Cначала было вот так написано:

    «На условиях лицензии Creative Commons Attribution-ShareAlike 3.0. То есть бесплатно, но при создании чего-либо на основе этих данных вы обязаны, во-первых, указать, что эти данные взяли у нас, во-вторых, лицензировать свой продукт или данные на тех же условиях.»

    Т.е. к лицензии CC добавлялось еще ограничение «лицензировать свой продукт на тех же условиях» (смотря как читать); я с ребятами связался и они сказали, что это просто неточность была, такого ограничения нет, и текст переписали.

    Если совсем точно знать хотите — спросите в groups.google.com/forum/?fromgroups#!forum/opencorpora-dev, да и на хабре разработчики OpenCorpora бывают.
    Ответ написан
  • 12 летка хочет учиться программировать

    @kmike
    Есть книга, на английском, Invent With Python, для детей от 10 лет подходит; в ней изучают питон, делая на нем разнообразные игры. Книга доступна под CC: него inventwithpython.com/chapters/

    Она на английском. Если с этим проблемы, то можно ее подростку переводить.
    Ответ написан
    3 комментария
  • MooTools умер?

    @kmike
    Я не изменил) С mootools на jquery сложно слезть, в jquery — работа с DOM в основном, а в mootools куча всего еще. Причем я б не сказал, что mootools очень уж нравится. Но mootools + github.com/anutron/behavior — это примерный аналог «jquery + knockout.js + еще много мелких библиотек» получается, вполне рабочая связка (несколько многословная, правда).
    Ответ написан
    1 комментарий
  • Где публиковать сообщения о релизах своих open source проектов?

    @kmike
    Все постят ссылки на статьи в своем блоге (или прямо на репозиторий с README или документацией) на reddit.com.
    Ответ написан
    Комментировать
  • Как улучшить анализ тональности текста на русском языке?

    @kmike
    Предупреждаю: опыта практического у меня тут нет.

    Можно лекции посмотреть вот тут: class.coursera.org/nlp/lecture/preview (Sentiment Analyzis). Критичной штукой во всем этом деле, насколько понимаю, является определение отрицания (нравится vs не нравится), что с подходом «bag of words» сделать нельзя. Для английского языка работают достаточно простые подходы («ко всем словам, стоящим после отрицательного слова ('не', например), приписывать „-“, пока не встретится знак препинания — и уже к обработанным таким образом словам применить классификацию через bag of words»).

    Наибольшее влияние на результат должен оказывать выбор фич для классификации (классификатор SVM vs что-то другое — +- несколько процентов максимум будет).

    Вот еще бумага по теме, может быть полезной: www.dialog-21.ru/digests/dialog2011/materials/ru/pdf/50.pdf
    Ответ написан
  • На какой матрице взять монитор для программирования?

    @kmike
    Был Samsung F2080 на C-PVA (матовый), сменил на Dell U2311H (IPS, тоже матовый), Dell нравится гораздо больше. В деталях («глубокий черный цвет», «кристаллический эффект», «задержка») не разбираюсь, но деллом доволен гораздо больше, по сравнению с самсунгом на C-PVA — небо и земля, картинка лучше, глаза устают меньше. Основной род деятельности — программирование.
    Ответ написан
    Комментировать
  • Как подключить css стили к Django?

    @kmike
    Проблема в неправильной настройке STATIC_ROOT и STATICFILES_DIRS.

    STATIC_ROOT — это временная папка, куда статика собирается в продакшне командой ./manage.py collectstatic. При разработке она может быть пустой. Я обычно ее «collected_static» называю, и делаю где-нибудь папку

    files
        user_uploads      <- сюда указывает MEDIA_ROOT
        collected_static   <- сюда указывает STATIC_ROOT
    


    STATICFILES_DIRS — это список папок, в которых хранится общая статика проекта, и из которых она собирается в STATIC_ROOT командой ./manage.py collectstatic.

    Кроме папок из STATICFILES_DIRS collectstatic по умолчанию смотрит еще в папку static у каждого приложения из INSTALLED_APPS.
    Ответ написан
    6 комментариев
  • Beautiful Soup, html5lib или lxml?

    @kmike
    @ur001, посмотрел еще раз код lxml, там есть много всяких регекспов, разбросанных по модулям ( github.com/lxml/lxml/blob/master/src/lxml/html/clean.py#L62 ), но я был не прав совершенно: парсинг html в lxml основан большей частью на парсинге xml.

    Т.е. lxml считает, что html — это просто невалидный xml, который можно поправить. С теоретической точки зрения предположение неверное, для парсинга html5 и xml нужны совсем разные парсеры, но на практике часто работает.
    Ответ написан
    Комментировать
  • Beautiful Soup, html5lib или lxml?

    @kmike
    У html5lib самый корректный и надежный парсер (по спецификации), но она медленная. lxml быстрее всех и парсит достаточно хорошо. Вместо SAX можно iterparse использовать, это удобнее часто, и часто быстрее.
    Ответ написан
    3 комментария
  • Удаление пустых переводов строк из кода страницы

    @kmike
    По-нормальному — никак. Теги в одной строке раполагать. Можно регекспом в миддлвари вырезать, но это зло уже какое-то, похуже тега spaceless. См. code.djangoproject.com/ticket/2594

    Можно еще Jinja2 вместо джанговских шаблонов использовать, если пустые строки очень напрягают, или джангу пропатчить (или проманкипатчить только нужные места) патчем из тикета. Или забить.
    Ответ написан
    Комментировать
  • Настройка админки Django (широкое описание поля)?

    @kmike
    @unit1 правильное решение для общего случая описал. Конкретно в админке конкретно в этом случае можно чуть проще ('classes': ['wide'] в джанге уже определен):

    class MyAdmin(admin.ModelAdmin):
    
        fieldsets = (
            (None, {
                'classes': ['wide'],
                'fields': ('name', 'slug', 'enabled')
            }),
            (u'Расположение', {
                'classes': ['wide'],
                'fields': ('address', ),
            }),       
        }
    
    
    Ответ написан
    Комментировать
  • Совместимость Mercurial и GitHub?

    @kmike
    Со своими репозиториями на гитхабе работаю через hg (с помощью hg-git). С чужими — через git.

    Что тут можно сказать — использовать hg как клиент к гитхабу можно, и интерфейс командной строки у hg поприятнее, чем у git, но много тонкостей: есть штуки в hg, у которых нет аналогов в гите (named branches) и поэтому полноценного преобразования hg <-> git не получается; у hg-git бывают глюки, и он не все фичи поддерживает. Подход этот точно не для человека, который только взялся за системы контроля версий; чтоб его использовать, нужно достаточно хорошо как hg, так и git знать, и работает он хорошо только для несложных репозиториев (у меня там несколько коммитов в месяц, в основном линейные репозитории).

    Если хотите размещать репозитории на github, git выучить смысл есть в любом случае.
    Ответ написан
    2 комментария