Pull to refresh

Comments 9

Какая-то куцая статья, непонятно даже, какой алгоритм(ы?) классификации использовались. Судя по первой картинке, идет намек на логистическую регрессию, ведь так?
По-умолчанию используется градиентный бустинг над деревьями решений. В целом, если глянуть код, становится понятно, что передать можно любой классификатор, т.к. функция которая производит обучение — это параметр в конструкторе. Если конкретнее, то текущая ф-ция обучения такая:

def train(classes, features):
    from sklearn.ensemble import GradientBoostingClassifier
    learner = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    clf = learner.fit(features, classes)
    result = clf.score(features, classes)
    return result, clf


И передаётся она в инстанс браузера при создании вот так:
trainer = GuiTrainer(train_function=train)


В целом, статья может и куцая, но смысл её не в освещении математических/алгоритмических аспектов, как я уже писал. Смысл — рассказать что есть вот такая библиотека и приветствуются все желающие принять участие в её допиливании. Если это не ясно из текста — прошу прощения за сумбурность изложения. Буду учиться лучше излагать свои мысли О_о
В репозитории есть 2 части: GUI для аннотации и собственно модель. Мне кажется, что их хорошо бы разделить. Т.к. GUI для аннотации — штука интересная, а с моделью все довольно непроработано. Например, нет скриптов для оценки качества. Добавлять какие-то дополнительные feature-функции, смотреть, как работают нынешние, настраивать параметры модели и т.д. толку поэтому мало сейчас.

В функции тренировки непонятно, зачем score вычислять на тех же данных, на которых тренировка идет (это неправильно и даже вредно). Ну т.е. можно надеяться, что «random forest не оверфиттится», но это не так, тем более когда используется бустинг.

Еще было бы хорошо использовать соглашения scikit-learn. Например, обычный порядок «X, y» в функции тренировки, FeatureUnion и DictVectorizer для вычисления фич — вместо своих классов.

Картинка, кстати, неправильная — границы, по которым разделяются данные в random forest, не так выглядят :)
В целом со всеми замечаниями согласен и почти про все из них и так был в курсе. Тем не менее, в силу ограниченности свободного времени, выбор у меня был из 2-ух вариантов: выложить как есть и постепенно допиливать, или не выкладывать вообще, и не ясно когда ещё руки дойдут. Решил что первый вариант вполне приемлемый. Так что за замечания спасибо — учту. Но уже в следующих версиях.
раз уж Вы начали размечать страницы, то почему бы просто не брать xpath выбранных элементов и не приводить их к ближайшему общему предку, которого и извлекать?
Ну и статья, на которую Вы ссылаетесь в начале, о том как находить нужный контент на странице БЕЗ учителя и в этом ее смысл.
Да, так было бы правильно делать, если задача стоит выделять элемент на разных страницах одного ресурса. И то, в последнее время нельзя рассчитывать на фиксированную вёрстку и имена классов/айдишников.

В любом случае, основная мысль всего происходящего — это на основании обучения по страницам из разных ресурсов сделать алгоритм, умеющий распознавать целевой блок на всех ресурсах подобного класса.
Про замечание по поводу статьи в начале — полностью согласен. Однако, прошу заметить, что я и не писал что сделал что-то подобное. Упомянул её исключительно в сюжетном контексте (:
UFO just landed and posted this here
По-моему, AlexeyTokar буквально в предыдущем комментарии предложил эту мысль, а я ответил почему это не то что нужно. А про phantomjs — штука хорошая, но не вполне понимаю для чего он тут нужен? Как он поможет в интерактивной разметке веб-страничек? Да и чем фантом удобнее PyQt4?
Sign up to leave a comment.

Articles