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 |
В русском языке предложения обычно заканчиваются точкой, вопросительным или восклицательным знаком. Просто разделим текст регулярным выражением [.?!]\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 сделает ошибку.
Инструкция по установке, пример использования и замеры производительности — в репозитории Razdel.
natural_language_processing — чат пользователей, разработчиков проекта.