Проект Natasha

Razdel — сегментация русскоязычного текста на токены и предложения

Python-библиотека Razdel — часть проекта Natasha, делит русскоязычный текст на токены и предложения.

>>> from razdel import tokenize, sentenize

>>> text = 'Кружка-термос на 0.5л (50/64 см³, 516;...)'
>>> tokens = list(tokenize(text))
>>> tokens
[Substring(start=0, stop=13, text='Кружка-термос'),
 Substring(start=14, stop=16, text='на'),
 Substring(start=17, stop=20, text='0.5'),
 Substring(start=20, stop=21, text='л'),
 Substring(start=22, stop=23, text='(')
 ...]

>>> text = '''
... - "Так в чем же дело?" - "Не ра-ду-ют".
... И т. д. и т. п. В общем, вся газета
... '''
>>> list(sentenize(text))
[Substring(start=1, stop=23, text='- "Так в чем же дело?"'),
 Substring(start=24, stop=40, text='- "Не ра-ду-ют".'),
 Substring(start=41, stop=56, text='И т. д. и т. п.'),
 Substring(start=57, stop=76, text='В общем, вся газета')]

Скорость и качество сопоставимы или выше, чем у других открытых решений.

Ошибки на 1000 токенов Время обработки, секунды
Regexp-baseline 19 0.5
SpaCy 17 5.4
NLTK 130 3.1
MyStem 19 4.5
Moses 11 1.9
SegTok 12 2.1
SpaCy Russian Tokenizer 8 46.4
RuTokenizer 15 1.0
Razdel 7 2.6
Ошибки на 1000 предложений Время обработки, секунды
Regexp-baseline 76 0.7
SegTok 381 10.8
Moses 166 7.0
NLTK 57 7.1
DeepPavlov 41 8.5
Razdel 43 4.8
Число ошибок среднее по 4 датасетам: SynTagRus, OpenCorpora, GICRYA and RNC. Подробнее в репозитории Razdel.

В чём сложность?

В русском языке предложения обычно заканчиваются точкой, вопросительным или восклицательным знаком. Просто разделим текст регулярным выражением [.?!]\s+. Такое решение даст 76 ошибок на 1000 предложений.

Сокращения.

… любая площадка с аудиторией от 3 тыс.| |человек является блогером.

… над ними с конца XVII в.| |стоял бей;

… в Камерном музыкальном театре им.| |Б.А. Покровского.

Инициалы.

В след за операми «Идоменей» В.А.| |Моцарта – Р.| |Штрауса …

Списки.

2.| |думал будет в финское консульство красивая длинная очередь …

г.| |билеты на поезда российских железных дорог …

В конце предложения многоточие, смайлик.

Кто предложит способ избавления от минусов — тому спасибо :)| |Посмотрел, призадумался…| |Вот это уже более неприятно, поскольку содержательность нарушится.

Цитаты, прямая речь, в конце предложения кавычка.

— невесты у вас в городе есть?»| |«Кому и кобыла невеста».

«Как хорошо, что я не такой!»| |Сейчас при переводе сделал фрейдстскую ошибку:"идология".

Razdel учитывает эти нюансы, сокращает число ошибок до 43 на 1000 предложений.

С токенами аналогичная ситуация. Хорошее базовое решение даёт регулярное выражение [а-яё-]+|[0-9]+|[^а-яё0-9 ], оно делает 19 ошибок на 1000 токенов.

… В конце 1980|-х - начале 1990|-х … БС-|3 можно отметить слегка меньшую массу (3|,|6 т) — да и умерла.|.|. Понял ли девку, сокол?|!

Razdel сокращает число ошибок до 7 на 1000 токенов.

Принцип работы

Система построена на правилах. Принцип сегментации на токены и предложения одинаковый.

Сбор кандидатов

Находим в тексте всех кандидатов на конец предложения: точки, многоточия, скобки, кавычки.

6.| |Наиболее частый и при этом высоко оцененный вариант ответов «я рада»| |(13 высказываний, 25 баллов)| |– ситуации получения одобрения и поощрения.| |7.| |Примечательно, что в ответе «я знаю»| |оценен как максимально стереотипный, но лишь раз встречается ответ «я женщина»|;| |присутствуют высказывания «один брак – это всё, что меня ждет в этой жизни»| |и «рано или поздно придется рожать»|.| |Составители: В.| |П.| |Головин, Ф.| |В.| |Заничев, А.| |Л.| |Расторгуев, Р.| |В.| |Савко, И.| |И.| |Тучков.

Для токенов дробим текст на атомы. Внутри атома точно не проходит граница токена.

В| |конце| |1980|-|х| |-| |начале| |1990|-|х| БС|-|3| |можно| |отметить| |слегка| |меньшую| |массу| |(|3|,|6| |т|)| |—| |да| |и| |умерла|.|.|.| |Понял| |ли| |девку|,| |сокол|?|!

Объединение

Последовательно обходим кандидатов на разделение, убираем лишние. Используем список эвристик.

Элемент списка. Разделитель — точка или скобка, слева число или буква.

6.| |Наиболее частый и при этом высоко оцененный вариант ответов «я рада» (13 высказываний, 25 баллов) – ситуации получения одобрения и поощрения. 7.| |Примечательно, что в ответе «я знаю» …

Инициалы. Разделитель — точка, слева одна заглавная буква.

… Составители: В.| |П.| |Головин, Ф.| |В.| |Заничев, А.| |Л.| |Расторгуев, Р.| |В.| |Савко, И.| |И.| |Тучков.

Справа от разделителя нет пробела.

… но лишь раз встречается ответ «я женщина»|; присутствуют высказывания «один брак – это всё, что меня ждет в этой жизни» и «рано или поздно придется рожать»|.

Перед закрывающей кавычкой или скобкой нет знака конца предложения, это не цитата и не прямая речь.

6. Наиболее частый и при этом высоко оцененный вариант ответов «я рада»| |(13 высказываний, 25 баллов)| |– ситуации получения одобрения и поощрения. … «один брак – это всё, что меня ждет в этой жизни»| |и «рано или поздно придется рожать».

В результате остаётся два разделителя, считаем их концами предложений.

6. Наиболее частый и при этом высоко оцененный вариант ответов «я рада» (13 высказываний, 25 баллов) – ситуации получения одобрения и поощрения.| |7. Примечательно, что в ответе «я знаю» оценен как максимально стереотипный, но лишь раз встречается ответ «я женщина»; присутствуют высказывания «один брак – это всё, что меня ждет в этой жизни» и «рано или поздно придется рожать».| |Составители: В. П. Головин, Ф. В. Заничев, А. Л. Расторгуев, Р. В. Савко, И. И. Тучков.

Для токенов процедура аналогичная, правила другие.

Дробь или рациональное число.

… (3|,|6 т) …

Сложная пунктуация.

— да и умерла.|.|. Понял ли девку, сокол?|!

Вокруг дефиса нет пробелов, это не начало прямой речи.

В конце 1980|-|х - начале 1990|-|х БС|-|3 можно отметить …

Всё что осталось считаем границами токенов.

В| |конце| |1980-х| |-| |начале| |1990-х| БС-3| |можно| |отметить| |слегка| |меньшую| |массу| |(|3,6| |т|)| |—| |да| |и| |умерла|...| |Понял| |ли| |девку|,| |сокол|?!

Ограничения

Правила в Razdel оптимизированы для аккуратно написанных текстов с правильной пунктуацией. Решение хорошо работает с новостными статьями, художественными текстами. На постах из социальных сетей, расшифровках телефонных разговоров качество ниже.

Если между предложениями нет пробела или в конце нет точки или предложение начинается с маленькой буквы, Razdel сделает ошибку.

Использование