Python

Як витягти речення з тексту за допомогою модуля NLTK Python

Як витягти речення з тексту за допомогою модуля NLTK Python
Набір природничих мов (NLTK) - це модуль для обробки мови та тексту для Python. NLTK може аналізувати, обробляти та токенізувати текст, доступний багатьма різними мовами, використовуючи вбудовану бібліотеку корпусів та великий пул лексичних даних. Python - одна з найпопулярніших мов програмування, що використовується в науці про дані та обробці мов, головним чином завдяки універсальності мови та наявності таких корисних модулів, як NLTK. У цій статті буде пояснено, як витягувати речення з текстових абзаців за допомогою NLTK. Код у цьому посібнику перевірений на Python 3.8.2 та НЛТК 3.4.5 на Ubuntu 20.04 LTS.

Встановлення NLTK в Linux

Щоб встановити NLTK в Ubuntu, виконайте команду нижче:

$ sudo apt встановити python3-nltk

Пакети NLTK доступні у всіх основних дистрибутивах Linux. Знайдіть ключове слово “NLTK” у менеджері пакетів, щоб встановити пакети. Якщо з якихось причин NLTK недоступний у сховищах вашого дистрибутива, ви можете встановити його з менеджера пакунків pip, виконавши команду нижче:

$ pip install --user -U nltk

Зверніть увагу, що спочатку вам доведеться встановити pip з диспетчера пакетів, щоб діяла вищевказана команда. У деяких дистрибутивах це може називатися pip3. Ви також можете слідувати детальним інструкціям з установки, доступним на офіційний веб-сайт НЛТК.

Вилучення речень із абзацу за допомогою НЛТК

Для абзаців без складних розділових знаків та інтервалів ви можете використовувати вбудований токенізатор речень NLTK, який називається “Точковий токенізатор”, який постачається з попередньо навченою моделлю. Ви також можете використовувати власні навчені моделі даних для маркування тексту в речення. Підготовлені на замовлення моделі даних виходять за рамки цієї статті, тому в наведеному нижче коді буде використовуватися вбудований токенізатор Punkt English. Щоб завантажити файл ресурсу Punkt, виконайте наступні три команди підряд і дочекайтеся завершення завантаження:

$ python3
$ імпорт nltk
$ nltk.завантажити ('punkt')

Абзац із «Пригод Аліси в країні чудес» буде використаний у зразку коду нижче:

імпортувати nltk
para = "Або криниця була дуже глибокою, або вона впала дуже повільно, бо вона мала
достатньо часу, коли вона спускалася, щоб оглянути її і подумати, що відбувається
щоб відбулося далі. По-перше, вона намагалася опустити погляд і зрозуміти, до чого йшла,
але було надто темно, щоб щось побачити; потім вона подивилася на боки колодязя, і
помітив, що вони заповнені шафами та полицями для книг; то тут, то там вона
бачив карти та малюнки, підвішені на кілочках. Вона зняла банку з однієї з полиць
коли вона проходила; це було позначено як "ПОРДАЖОВИЙ МАРМАЛАД", але на її велике розчарування це
була порожня: вона не любила кидати банку, боячись когось вбити, тому впоралася
покласти його в одну з шаф, коли вона падала повз нього."
лексеми = nltk.sent_tokenize (пункт)
для t в лексемах:
друк (t, "\ n")

Запуск наведеного вище коду дасть вам такий результат:

Або криниця була дуже глибокою, або вона впала дуже повільно, бо у неї було досить часу
вона спустилася, щоб подивитися на неї і подумати, що буде далі.
Спочатку вона намагалася опустити погляд і зрозуміти, до чого йшла, але було занадто темно
побачити що-небудь; потім вона подивилася на боки колодязя і помітила, що вони були
наповнені шафами та полицями для книг; то тут, то там вона бачила розвішені карти та малюнки
на кілочках.
Проходячи повз, вона зняла банку з однієї з полиць; він був позначений як "ОРГАНІЧНИЙ МАРМАЛАД",
але на її велике розчарування воно було порожнім: вона не любила кидати банку, боячись
вбивши когось, так вдалося покласти його в одну з шаф, коли вона впала повз нього.

Вбудований маркер речень Punkt добре працює, якщо ви хочете позначити прості абзаци. Після імпорту модуля NLTK все, що вам потрібно зробити, це використати метод “sent_tokenize ()” у великому текстовому корпусі. Однак маркер речення Punkt може неправильно розпізнавати речення, якщо є складний абзац, який містить багато розділових знаків, знаків оклику, скорочень або повторюваних символів. Неможливо визначити стандартний спосіб подолання цих проблем. Вам доведеться написати власний код для вирішення цих проблем за допомогою регулярного виразу, маніпулювання рядками або шляхом навчання власної моделі даних, замість використання вбудованої моделі даних Punkt.

Ви також можете спробувати налаштувати існуючу модель Punkt, щоб виправити неправильну токенізацію, використовуючи деякі додаткові параметри. Для цього дотримуйтесь офіційної документації про токенізацію Punkt тут. Щоб використовувати власні налаштування, потрібна невелика зміна коду:

від nltk.токенізувати.punkt import PunktSentenceTokenizer, PunktParameters
para = "Або криниця була дуже глибокою, або вона падала дуже повільно, бо її було вдосталь
часу, коли вона спускалася, щоб подивитися на неї і подумати, що буде
наступний. Спочатку вона намагалася опустити погляд і зрозуміти, до чого йшла, але це було
занадто темно, щоб щось побачити; потім вона подивилася на боки колодязя і помітила
що вони були наповнені шафами та полицями для книг; то тут, то там вона бачила карти
а на кілочках висіли фотографії. Вона зняла банку з однієї з полиць
пройшов; це було позначено як "ПОМАРАНЖОВИЙ МАРМАЛАД", але на її велике розчарування це було
порожній: вона не любила кидати банку, боячись когось вбити, тому встигла
поклала його в одну з шаф, коли вона впала повз нього."
punkt_params = PunktParameters ()
punkt_params.сокращення_типів = набір (['Пан', 'Пані', 'ТОВ'])
tokenizer = PunktSentenceTokenizer (punkt_params)
лексеми = маркер.токенізувати (пункт)
для t у лексемах:
друк (t, "\ n")

Наведений вище код виконує ту ж роботу, що і метод “sent_tokenize ()”. Однак тепер ви можете визначати власні правила за допомогою вбудованих методів і передавати їх як аргументи, як описано в документації. Наприклад, до зазначеного вище коду додано деякі скорочення. Якщо за цими скороченнями ставляться розділові знаки, вони не будуть розбиті на нове речення. Звичайною поведінкою є використання крапки чи крапки як ознаки кінця речення.

Висновок

NLTK та його методи токенізації досить ефективні при токенізації та обробці текстових даних. Однак попередньо навчені моделі можуть не працювати на 100% з різними типами текстів. Можливо, вам доведеться вдосконалити існуючі моделі, навчити та поставити власні, або написати власний код, щоб виправити аномалії.

Кращі програми для картографування геймпадів для Linux
Якщо ви любите грати в ігри на Linux із геймпадом замість типової системи введення клавіатури та миші, є кілька корисних програм для вас. Багато ігор ...
Корисні інструменти для геймерів Linux
Якщо ви любите грати в ігри на Linux, швидше за все, ви, можливо, використовували додатки та утиліти, такі як Wine, Lutris та OBS Studio, щоб покращит...
HD Remastered Games для Linux, які раніше ніколи не випускали Linux
Багато розробників і видавців ігор випускають HD-ремастер старих ігор, щоб продовжити життя франшизи. Будь ласка, шанувальники просять сумісність із с...