opencorpora
opencorpora copied to clipboard
Автоматическое разбиение текста на предложения
@grandsbor , @victorbocharov приветствую, это Илья. Я какое-то время назад связывался с вами и предлагал автоматизировать разбиение текста при добавлении его в корпус.
Рад сообщить что всё готово, и задача решена.
Код находится в этом репозитории: https://github.com/uniconstructor/opencopora-dataset
Решение на питоне, для использования вам нужен только сам питон, и файл модели (sentence-tokenizer-model.pickle
)
Пример кода можно посмотреть здесь: https://github.com/uniconstructor/opencopora-dataset/blob/master/sentence-tokenizer-demo.ipynb
# подключение модулей для работы с языком
import nltk
import pickle
# загрузка модели
f = open('sentence-tokenizer-model.pickle', 'rb')
classifier = pickle.load(f)
f.close()
# разбиение текста на предложения
text = open('sentence-tokenizer-demo.txt').read()
sentences = classifier.tokenize(text)
sentences
Надо подумать через что было бы лучше всего пробросить вызовы из PHP в питон чтобы иметь доступ к интерфейсу.
@uniconstructor спасибо! Вы уже оценивали полноту / точность ?
@victorbocharov да, оценивал. На текущий момент она около 85% - думаю поднять еще за счет извлечения дополнительных признаков из html-разиетки.
Точность разбиения оценивалась как процент предложений из автоматического выборки найденный в ручной. То есть если текст руками был разбит на 10 предложений а в автоматической выборке из этих 10 есть только 8 (потому что например 2 последние склеились или не там разбились) то точность оценивается в 80%.
Планирую продолжить эксперименты:
- дополнив модель признаками из оригинального html-документа (xpath каждого предложения)
- дополнив модель признаками слов, извлеченными при помощи pymorphy2 (изначально задача была использовать библиотеку pymorphy2 для улучшения себя самой же - но заставить NLTK использовать ваш токенизатор вместо своего я сходу не смог)
- улучшить метрику оценки добавив подсчет false positive и false negative ошибок отдельно. После этого найти токены на которых чаще всего ломается токенизация и посмотреть на них - возможно это даст понимание того почему возникает проблема
Помимо этого нужно совместить разбиение на предложения с извлечением текста из веб-страницы: чтобы автоматизация оказалась полезной нужно чтобы она решала какую-то задачу от начала и до конца. Думаю что для извлечения статей можно начать с того же xpath, определив где начинается "внешняя граница" первого предложения и отбросить все уровни DOM-дерева которые выше этого уровня (похожим образом делает evernote при копировании статьи).
Еще может понадобится отдельный этап обработки: после извлечения но до разбиения - это очистка текста от мусора и псевдографики. Пока не смотрел и не приступал - надо было уделить внимание чему-то одному чтобы выложить законченную задачу.
На прошлой неделе разработчики из проекта Natasha опубликовали проект razdel: https://github.com/natasha/razdel
Судя по опубликованной статистике это решение делает мое решение с pretrained-моделью устаревшей, да и качество кода/документации в проекте на очень высоком уровне.
Помимо этого в качестве источников данных в проекте используется несколько корпусов и несколько подходов, а не один как у меня.
@victorbocharov Предлагаю в этом тикете сделать правки по внедрению библиотеки razdel в процесс подготовки текстов. Можете подсказать куда лучше встроить обращение к python и где я могу найти php-код отвечающий за отображение страницы с разбиением на предложения?
Хотелось бы попробовать вывести сразу разбитый текст.
где я могу найти php-код отвечающий за отображение страницы с разбиением на предложения?
https://github.com/OpenCorpora/opencorpora/blob/master/lib/lib_tokenizer.php#L589
Как встроить обращение к Python, затрудняюсь подсказать. Почти наверняка можно запустить через exec
или что-нибудь похожее, но вряд ли это наилучший вариант.
С встраиванием я разберусь, спасибо - главное было найти место в котором идет разбиение.