Как стать автором
Обновить

Комментарии 41

Большое спасибо за статью, любопытно и познавательно. Прочитал с огромным удовольствием.
Отличная статья, спасибо!
Спасибо, очень интересно. Вы были единственным разработчиком? И за какой срок сделали?
Да, единственным. Срок оценить сложно, потому что это была не единственная задача. Третья версия была готова где-то за три-четыре месяца.
Очень быстро.
Какой-нибудь НИИ на подобную задачу потратит несколько лет.
Иллюстрации замечательные.
Спасибо. Три недели рисовал.
В 1999 писал работы для студентов, будучи сам студентом. Основная идея была изначально другая — сканировать книги из местной библиотеки и предоставлять материалы из нее студентам для написания работ. Очень быстро оказалось что, это им не надо, а лучше что-то готовое сразу получить.
Интернет был тогда доступен не всем, до сих пор вспоминаю как приходилось искать информацию, по диалапу, чтобы написать курсовую по предмету который не изучал, по теме, за которую раньше ничего не слышал. (Улыбаюсь)
Длилось все год, дало незабываемый опыт. Писал на визуал бейсик свой поисковик, который искал по архивам с дисков 100500 рефератов похожие темы, и компоновал из них, собирая необходимое в требуемое.
Как правило работы проходили на ура, и были проблемы только тогда, когда студент даже не удосужился прочитать то, что сдает.
Обзор за вашу систему — ситуация с другой стороны, не менее интересно, и потому прочел все, на одном дыхании. Это гениально.
Раскрыли некоторые моменты, по по поиску, и как его можно реализовывать.
Заинтересовал один вопрос по парсингу PDF (нужно в другом русле, для парсинга биллингов). Вы упоминали pstotext. На сколько сложно его использовать? Есть ли рекомендуемые источники для ознакомления. Было бы интересно. Заранее спасибо.
Для pdf насколько мне известно есть два ключевых варианта работы ghostscript и poppler и множество оберток вокруг оных. pstotext — одна из оберток и чаcть пакета ghostscript.

Пользоваться не сложно — правильно комбинируете параметры ввода и получаете текст. Есть сложность — pdf может не содержать текста (например если он отсканирован) — тогда потребуется распознавание, что уже несколько иная задача.
Спасибо
Очень просто. Вызывать из командной строки — и все.
Низкий поклон за отличную статью. Сразу и несколько интересных ссылок и идеи подкинули как к некоторым задачам подступаться, с которыми доводилось сталкиваться в прошлом, но им не суждено было быть сделанными. Огромное спасибо!
Две ваши статьи прочитал на одном дыхании! Мне, как очень начинающему back-end разработчику было очень интересно прочитать, как делаются вот такие больше проекты, которые даже в голове не укладываются.
А вы не думали переписать нагруженные части на чем-нибудь более производительном?
Надеюсь, что пост не затеряется среди «30 строк» и «мы купили бутер за bitcoin!».
Я подумывал переписать некоторые куски на С, но потом решил, что это бессмысленно. Чисто вычислительные куски постоянно перемежаются с манипуляцией строками, в которых С совсем не силен.

Да и практически там все равно использовался PDL, который написан на чистом С. Получалась та же самая структура — Перл вызывает вычислительный код на С.

После некоторых экспериментов я бы скорее смотрел, как это ни странно, в сторону NodeJS. Операции с большими массивами там раз в пять быстрее, чем на всех остальных динамических языках (я мерял Перл, Питон, ПХП, Эрланг и еще кучу всякой экзотики вроде Ребола и Лиспа)
А что насчет Go? Не замеряли?
Интересно, почему в ноде так.
Нет, Go не пробовал.
NodeJS — тщательно оптимизированный движок
А можно каких-нибудь ссылок по разбитию английского текста на предложения?
У Мэннинга на эту тему есть целая глава.

Дэн Гиллик здесь: code.google.com/p/splitta/

Явовская библиотека вот: opennlp.apache.org/

Питоновский пакет: nltk.org/

В гугле можно искать по фразам «sentence boundary detection» или «sentence segmentation». Судя по количеству, любимая тема — и не очень сложно, и чег-нибудь выдумать можно.
А сегодня вы такую систему на чем бы делали? Неужели тоже на перле?
А почему бы и нет? Какие минусы вы видите?
Сопровождение, доработку. Как из-за самого языка, так и из-за отсутствия специалистов.
Боюсь, что даже 50 специалистов по «пэхепе» такую систему не родят, и количество не перейдет в качество.

Что же касается языка, то на нем надо аккуратно писать, тогда и сопровождение будет несложным. В частности, разбиение на отдельные службы, связанные конвейером, сократив сложность, упростило сопровождение и доработку.
Конечно. Отличный язык, вытягивающий сложные задачи. Верблюда там не зря эмблемой избрали.

Питон мог бы быть вариантом, учитывая уже готовый NLTK.
Спасибо! Невероятно интересно.
конец о малолетках, конечно, подпортил впечатление.

а вообще — очень серьёзная разработка, и очень хорошее описание.
Ха… Спасибо! Очень интересный и мотивирующий рассказ/ Хочется сделать свой велосипед.

НО извините за нескромный вопрос — Вы действительно не работаете по субботам?
Когда молодость проходит, выходные хочется посвящать семье и отдыху. Без полноценных выходных и работы потом полноценной не получается.
спасибо за статью
Отличная работа, коллега!
По Вашему условию пример нашего проекта в этой области.
А по поводу Вашего алгоритма одно предложение: Вы используете тф*идф для предложений, тогда, может, стоит применить его для оценки слов документа, чтобы выкинуть совсем незначащие. Таким образом можно сократить количество шинглов. Также можно оптимизировать количество запросов к поисковикам, запрашивая в первую очередь наиболее значимые шинглы.
Добрый день,

Ох уже эти велосипеды. Помнится мне как то пришлось работать над схожей задачей, для ловли плагиаторов для одного фр вуза который во всю продвигал дистанционные формы обучения и как следствие электронный документооборот. Так вот вместо того что бы что то изобретать мы обратились за помощью к фундаментальной науке. Нам повезло, нам на глаза попали результаты использования SCAM (Standard
Copy Analysis Mechanism). Что на практике с применением lucene дало неплохие результаты. По аглицки данная отрасль называется Plagiarism Detection.
Очень интересная и грамотная статья!
один момент только заметил на поправку:
и считаем косинус угла между ними (через векторное произведение)

Вроде бы я ничего не путаю — кажется косинус угла считается через скалярное произведение векторов, а не векторное.
Конечно, скалярное. Поправил. Спасибо за бдительность.
Отлично. Спасибо.

Тоже немного приходилось работать с натуральными языками, но более поверхностно.

Например, для разбивки на предложения написал простую стейт-машину
Скрытый текст
SPACE, DOT, DOT_SPACE, OTHER = range(4)
DOT_SYMBOLS = {u".", u"?", u"!", u"\u2026"}
_STRIP_SYMBOLS = "".join(DOT_SYMBOLS) + " "


def split_to_sentences(text, bad_words=set()):
    """Finite-state machine that split text to sentences.
    See tests.sentences for tests and examples"""
    state = None
    sentence = ""
    last_word = ""
    for char in text:
        if state == DOT_SPACE and char.isupper():
            # TODO: check that last word is not "г." "ул." etc.
            sentence += last_word
            # print last_word, "LAST WORD"
            if last_word.strip(_STRIP_SYMBOLS) not in bad_words:
                yield sentence
                sentence = ""
            last_word = char
            state = OTHER
        elif state in (SPACE, DOT_SPACE) and char == " ":
            pass                # remove duplicate spaces
        elif state in (SPACE, DOT_SPACE) and char not in DOT_SYMBOLS:
            # any char, except space, after space -> new word
            sentence += last_word
            last_word = char
            state = OTHER
        elif state == DOT and char == " ":
            last_word += char
            state = DOT_SPACE
        elif char in DOT_SYMBOLS:
            last_word += char
            state = DOT
        elif char == " ":
            last_word += char
            state = SPACE
        else:
            last_word += char
            state = OTHER
        # print char, state
    if last_word:
        sentence += last_word
    if sentence:
        yield sentence



Для морфологии взял pymorphy. Но согласен — тема сложная. А если пытаться учитывать ошибки и опечатки…

А почему решили завязаться на Amazon? Для очереди я, например, успешно использую RabbitMQ, и т.п. Плюс вы говорите у вас админ был выделенный…
Амазон уже использовался и до этого, например, файлы хранились на S3. Плюс ничего устанавливать и администрировать не надо.

Хотя на rabbitmq можно было бы проще сделать, например, приоритетные очереди. И не возиться с доставкой «как минимум раз», выставив гарантированную одноразовую.
найти все кириллические и греческие буквы, по написанию похожие на соответствующие английские. Хитроумные авторы специально вставляют их в текст, чтобы обмануть проверку на плагиат.

Всегда думал, что так делают для того, чтобы найти свою работу если её «сплагиатили». Оказывается делают и для обратной задачи.
Кстати сказать, самый большой и известный сайт для поиска плагиата называется Turnitin. Это практический монополист в этой области.


Есть антиплагиат разработки одной компании в России.
Статья хорошая, но будьте осторожны. Turnitin и другие компании не только поделили этот рынок, но еще и здорово покрыли его патентами на манер того, как это происходит в индустрии медиакодирования. Из-за этого выйти на него начинающему проекту очень сложно.
Статья чертовски интересна, спасибо! По поводу научных статей, один из моих уважаемых профессоров говорил, что они пишутся специально запутанным языком, дабы не делиться. Чувствую, в его словах есть смысл.
из чего я делаю вывод, что от сложившейся системы сами авторы мало что получают, а доходы идут кому-то другому

В плане денег за публикацию авторы не получают вообще ничего. Публикация в престижном журнале приносит косвенные дивиденды, ценные в научном мире: цитируемость, индекс Хирша и т. д. Благодаря этому потом можно получать более жирные гранты и позиции в университетах. А непосредственно с продажи статей имеет только издательство. Если автор хочет, чтобы его статья была общедоступна, большинство журналов предоставляют такую возможность, но тогда сам автор должен заплатить немалое бабло за публикацию.
В некоторых российских журналах, например Молекулярной Биологии, платят смешные гонорары. Хотя, конечно, публикуют статьи не из-за гонорара :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории