opencorpora icon indicating copy to clipboard operation
opencorpora copied to clipboard

Автоматическое разбиение текста на предложения

Open uniconstructor opened this issue 6 years ago • 6 comments

@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

uniconstructor avatar Oct 13 '18 11:10 uniconstructor

Надо подумать через что было бы лучше всего пробросить вызовы из PHP в питон чтобы иметь доступ к интерфейсу.

uniconstructor avatar Oct 13 '18 11:10 uniconstructor

@uniconstructor спасибо! Вы уже оценивали полноту / точность ?

victorbocharov avatar Oct 15 '18 14:10 victorbocharov

@victorbocharov да, оценивал. На текущий момент она около 85% - думаю поднять еще за счет извлечения дополнительных признаков из html-разиетки.

Точность разбиения оценивалась как процент предложений из автоматического выборки найденный в ручной. То есть если текст руками был разбит на 10 предложений а в автоматической выборке из этих 10 есть только 8 (потому что например 2 последние склеились или не там разбились) то точность оценивается в 80%.

Планирую продолжить эксперименты:

  • дополнив модель признаками из оригинального html-документа (xpath каждого предложения)
  • дополнив модель признаками слов, извлеченными при помощи pymorphy2 (изначально задача была использовать библиотеку pymorphy2 для улучшения себя самой же - но заставить NLTK использовать ваш токенизатор вместо своего я сходу не смог)
  • улучшить метрику оценки добавив подсчет false positive и false negative ошибок отдельно. После этого найти токены на которых чаще всего ломается токенизация и посмотреть на них - возможно это даст понимание того почему возникает проблема

Помимо этого нужно совместить разбиение на предложения с извлечением текста из веб-страницы: чтобы автоматизация оказалась полезной нужно чтобы она решала какую-то задачу от начала и до конца. Думаю что для извлечения статей можно начать с того же xpath, определив где начинается "внешняя граница" первого предложения и отбросить все уровни DOM-дерева которые выше этого уровня (похожим образом делает evernote при копировании статьи).

Еще может понадобится отдельный этап обработки: после извлечения но до разбиения - это очистка текста от мусора и псевдографики. Пока не смотрел и не приступал - надо было уделить внимание чему-то одному чтобы выложить законченную задачу.

uniconstructor avatar Oct 15 '18 15:10 uniconstructor

На прошлой неделе разработчики из проекта Natasha опубликовали проект razdel: https://github.com/natasha/razdel

Судя по опубликованной статистике это решение делает мое решение с pretrained-моделью устаревшей, да и качество кода/документации в проекте на очень высоком уровне.

Помимо этого в качестве источников данных в проекте используется несколько корпусов и несколько подходов, а не один как у меня.

@victorbocharov Предлагаю в этом тикете сделать правки по внедрению библиотеки razdel в процесс подготовки текстов. Можете подсказать куда лучше встроить обращение к python и где я могу найти php-код отвечающий за отображение страницы с разбиением на предложения?

Хотелось бы попробовать вывести сразу разбитый текст.

uniconstructor avatar Nov 14 '18 14:11 uniconstructor

где я могу найти php-код отвечающий за отображение страницы с разбиением на предложения?

https://github.com/OpenCorpora/opencorpora/blob/master/lib/lib_tokenizer.php#L589

Как встроить обращение к Python, затрудняюсь подсказать. Почти наверняка можно запустить через exec или что-нибудь похожее, но вряд ли это наилучший вариант.

grandsbor avatar Nov 16 '18 11:11 grandsbor

С встраиванием я разберусь, спасибо - главное было найти место в котором идет разбиение.

uniconstructor avatar Nov 16 '18 13:11 uniconstructor