Обробка природної мови (Natural Language Processing, NLP) — це галузь штучного інтелекту, що фокусується на взаємодії між комп'ютерами та людською мовою. У цій статті ми розглянемо основні методи та підходи до обробки текстів українською мовою, а також практичні приклади їх застосування.
Вступ до обробки природної мови
Обробка природної мови дозволяє комп'ютерам розуміти, інтерпретувати та генерувати людську мову в корисній формі. NLP поєднує комп'ютерну науку, штучний інтелект та лінгвістику для аналізу та обробки мовних даних.

Обробка природної мови дозволяє комп'ютерам розуміти та генерувати людську мову
Особливості обробки української мови
Українська мова має ряд особливостей, які необхідно враховувати при розробці NLP-систем:
- Флективність — українська мова має багату морфологію з великою кількістю флексій (закінчень)
- Відмінювання — іменники, прикметники, числівники та займенники мають сім відмінків
- Вільний порядок слів — на відміну від англійської, порядок слів у реченні може змінюватися
- Багато діалектів — наявність регіональних діалектів та сленгу
- Менша кількість ресурсів — порівняно з англійською, доступно менше даних та інструментів
Основні етапи обробки тексту
Розглянемо основні етапи обробки тексту українською мовою:
1. Попередня обробка тексту
Попередня обробка — це перший і критичний крок у будь-якому NLP-проекті:
- Токенізація — розбиття тексту на окремі слова або токени
- Видалення стоп-слів — видалення слів, які не несуть смислового навантаження (сполучники, прийменники тощо)
- Нормалізація — перетворення слів до їх базової форми:
- Лематизація — приведення слова до словникової форми (лема)
- Стемінг — відсікання закінчень та суфіксів для отримання основи слова
Ось приклад попередньої обробки тексту українською мовою з використанням бібліотеки spaCy:
import spacy
# Завантаження моделі для української мови
nlp = spacy.load("uk_core_news_sm")
# Текст для обробки
text = "Машинне навчання допомагає вирішувати складні задачі автоматично."
# Обробка тексту
doc = nlp(text)
# Виведення токенів та їх лем
for token in doc:
print(f"Токен: {token.text}, Лема: {token.lemma_}")
# Фільтрація стоп-слів
filtered_tokens = [token.text for token in doc if not token.is_stop]
print("Текст без стоп-слів:", " ".join(filtered_tokens))
2. Векторизація тексту
Для роботи з текстом машинним алгоритмам потрібно перетворити його у числовий формат. Існує кілька основних підходів:
Мішок слів (Bag of Words, BoW)
Найпростіший метод, який представляє текст як невпорядкований набір слів без урахування граматики та порядку:
from sklearn.feature_extraction.text import CountVectorizer
# Приклад текстів
corpus = [
"Машинне навчання - це галузь штучного інтелекту.",
"Штучний інтелект має багато застосувань.",
"Глибоке навчання - підгалузь машинного навчання."
]
# Створення векторизатора
vectorizer = CountVectorizer()
# Перетворення текстів у матрицю частот слів
X = vectorizer.fit_transform(corpus)
# Отримання списку всіх слів
feature_names = vectorizer.get_feature_names_out()
print("Словник:", feature_names)
print("Матриця BoW:\n", X.toarray())
TF-IDF (Term Frequency-Inverse Document Frequency)
Більш складний метод, який враховує не тільки частоту слова в документі, але й його важливість у всьому корпусі:
from sklearn.feature_extraction.text import TfidfVectorizer
# Створення TF-IDF векторизатора
tfidf_vectorizer = TfidfVectorizer()
# Перетворення текстів у TF-IDF матрицю
X_tfidf = tfidf_vectorizer.fit_transform(corpus)
print("Матриця TF-IDF:\n", X_tfidf.toarray())
Word Embeddings (Векторні представлення слів)
Сучасні методи, які представляють слова як щільні вектори у багатовимірному просторі, де семантично близькі слова знаходяться поруч:
- Word2Vec — модель, яка використовує нейронну мережу для створення векторних представлень слів
- GloVe — алгоритм навчання без вчителя для отримання векторних представлень слів
- FastText — розширення Word2Vec, яке враховує підслова (морфеми)
from gensim.models import Word2Vec
# Підготовка даних
sentences = [
["машинне", "навчання", "це", "галузь", "штучного", "інтелекту"],
["штучний", "інтелект", "має", "багато", "застосувань"],
["глибоке", "навчання", "підгалузь", "машинного", "навчання"]
]
# Навчання моделі Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Отримання вектора для слова
vector = model.wv['навчання']
print("Вектор для слова 'навчання':", vector[:5], "...")
# Пошук найбільш схожих слів
similar_words = model.wv.most_similar('навчання', topn=3)
print("Схожі слова:", similar_words)
3. Аналіз тональності (Sentiment Analysis)
Аналіз тональності — це процес визначення емоційного забарвлення тексту (позитивне, негативне або нейтральне). Для української мови це завдання ускладнюється меншою кількістю доступних розмічених даних.
Ось простий приклад аналізу тональності з використанням словника:
# Спрощений словник з тональностями слів
sentiment_dict = {
"чудово": 2,
"добре": 1,
"нормально": 0,
"погано": -1,
"жахливо": -2,
"подобається": 1,
"ненавиджу": -2,
"не": -1 # Множник для заперечення
}
def analyze_sentiment(text):
words = text.lower().split()
score = 0
negation = False
for word in words:
if word in sentiment_dict:
word_score = sentiment_dict[word]
if negation:
word_score *= -1
negation = False
score += word_score
elif word == "не":
negation = True
if score > 0:
return "Позитивний", score
elif score < 0:
return "Негативний", score
else:
return "Нейтральний", score
# Приклад використання
text1 = "Мені дуже подобається ця книга"
text2 = "Я не люблю цей фільм, він погано знятий"
print(text1, ":", analyze_sentiment(text1))
print(text2, ":", analyze_sentiment(text2))
Більш точний аналіз тональності можна виконати з використанням моделей машинного навчання, таких як BERT (Bidirectional Encoder Representations from Transformers), адаптованих для української мови.
4. Класифікація тексту
Класифікація тексту — це процес автоматичного віднесення тексту до однієї або кількох категорій. Ось приклад класифікації тексту за тематикою:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
# Приклад навчальних даних
texts = [
"Нова версія Python пропонує значні поліпшення продуктивності",
"JavaScript залишається найпопулярнішою мовою для веб-розробки",
"Машинне навчання дозволяє комп'ютерам навчатися на даних",
"Нейронні мережі успішно вирішують складні задачі розпізнавання образів",
"HTML і CSS є основою для створення веб-сторінок",
"Python широко використовується для аналізу даних та машинного навчання"
]
# Мітки категорій (0 - програмування, 1 - машинне навчання, 2 - веб-розробка)
labels = [0, 2, 1, 1, 2, 0]
# Створення та навчання класифікатора
classifier = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', MultinomialNB())
])
classifier.fit(texts, labels)
# Класифікація нових текстів
new_texts = [
"Глибоке навчання є підгалуззю машинного навчання",
"PHP є серверною мовою програмування для веб-розробки"
]
predicted = classifier.predict(new_texts)
categories = ["Програмування", "Машинне навчання", "Веб-розробка"]
for text, category_id in zip(new_texts, predicted):
print(f"Текст: '{text}' -> Категорія: {categories[category_id]}")
Трансформер-моделі для української мови
Трансформер-моделі, такі як BERT, GPT та їх варіанти, революціонізували обробку природної мови. Для української мови існують спеціально адаптовані моделі:
- UkrBERT — BERT, навчений на українських текстах
- MultilingualBERT — версія BERT, яка підтримує 104 мови, включаючи українську
- XLM-RoBERTa — багатомовна модель, яка демонструє хороші результати для української мови
Ось приклад використання UkrBERT для заповнення пропусків у тексті:
from transformers import pipeline
# Ініціалізація моделі
fill_mask = pipeline(
"fill-mask",
model="youscan/ukr-roberta-base",
tokenizer="youscan/ukr-roberta-base"
)
# Приклад використання
text = "Штучний інтелект може допомогти у вирішенні [MASK] проблем."
results = fill_mask(text)
for result in results:
print(f"Варіант: {result['sequence']}, Ймовірність: {result['score']:.4f}")
Практичні застосування NLP для української мови
Технології обробки природної мови мають багато практичних застосувань для української мови:
- Автоматичний переклад — системи машинного перекладу, які підтримують українську мову
- Чат-боти — інтелектуальні асистенти, здатні спілкуватися українською мовою
- Автоматичне реферування — створення коротких зведень довгих текстів
- Аналіз соціальних медіа — моніторинг згадувань бренду та аналіз тональності
- Пошукові системи — покращення релевантності пошуку для українськомовних запитів
- Розпізнавання та синтез мовлення — перетворення мовлення в текст і навпаки
Виклики та перспективи
Обробка української мови стикається з кількома викликами:
- Обмеженість ресурсів — менша кількість розмічених даних порівняно з англійською
- Морфологічна складність — необхідність враховувати багату морфологію
- Діалектне різноманіття — наявність регіональних варіантів мови
Проте перспективи розвитку NLP для української мови є дуже обнадійливими:
- Зростаюча спільнота дослідників, які працюють над адаптацією сучасних методів NLP для української мови
- Поява спеціалізованих моделей та наборів даних
- Зростання попиту на технології обробки української мови в комерційних продуктах
Підсумок
Обробка природної мови для української мови — це галузь, що активно розвивається і має великий потенціал. Незважаючи на певні виклики, сучасні методи NLP, особливо трансформер-моделі, демонструють високу ефективність для різних завдань обробки української мови. З розвитком ресурсів та інструментів можна очікувати подальшого прогресу в цій галузі.