Doğal Dil İşleme (NLP) останнім часом стало дуже популярним. Це галузь штучного інтелекту, що використовується для розуміння та обробки людської мови. У цій статті я хочу поділитися теоретичними знаннями про NLP та продемонструвати кілька маленьких застосунків, щоб ви краще розуміли, що і чому ми використовуємо, а також коли це слід застосовувати. :))
Отже, де використовують NLP? Якщо ми вирішили розвивати себе в напрямку NLP, то які типи проєктів можна зробити ✋
- Чат-боти, Віртуальні асистенти
Siri, Alexa, ChatGpt - Аналіз емоцій
Соціальні мережі, Аналіз відгуків клієнтів, Огляди фільмів або товарів… - Машинний переклад
Google Translate, DeepL… - Резюмування текстів
- Пошукові системи
Примітка: наприкінці статті ми створимо проєкт для резюмування текстів :)))
Чому ж NLP стало настільки популярним, можна запитати, оскільки в останні роки ця тема викликає багато розмов 🙃
Одна з причин цього — Big Data. Дані, які зростають днями, місяцями і навіть роками, забезпечують величезний потенціал для навчання та розвитку NLP-алгоритмів. Інша причина — розвиток великих мовних моделей (LLM), таких як ChatGPT, Gemini, які вже давно викликають обговорення серед людей (Програмісти залишаться без роботи тощо). Ці технології включає також Cursor AI, і це вже розділило людей на два табори 🤔 Як ви думаєте, хто може втратити роботу через штучний інтелект, або які професії першими можуть стати непотрібними через цей швидкий розвиток? Але повернемося до NLP, давайте трохи розглянемо Python і NLP
👉👈
По-перше, давайте подивимося на найбільш популярні бібліотеки для NLP в Python, а потім розглянемо, як їх використовувати. Наприкінці ми розробимо маленький проєкт і завершимо нашу статтю.
- NLTK
NLTK — одна з найпопулярніших бібліотек для NLP. Вона надає основні функції, такі як токенізація, стоп-слова, резюмування та аналіз емоцій.
Подивимося на приклад того, як виконується токенізація.
import nltk
from nltk.tokenize import word_tokenize, sent_tokenize
# Приклад тексту
metin = "Python з NLP ми вивчаємо. Обробка природної мови допомагає нам зрозуміти дані."
# Токенізація по реченням
cumleler = sent_tokenize(metin)
print("Речення:", cumleler)
# Токенізація по словам
kelimeler = word_tokenize(metin)
print("Слова:", kelimeler)
Токенізація виглядає досить просто. Запустіть код і перевірте результат….
Тепер давайте подивимося на обробку стоп-слів :))
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
metin = "Мова програмування Python часто використовується в проектах штучного інтелекту."
kelimeler = word_tokenize(metin)
# Функція word_tokenize перетворює текстову змінну в список слів.
# Цей процес називається токенізацією і дозволяє отримати список слів.
stop_words = set(stopwords.words('turkish'))
# Функція stopwords.words('turkish') повертає список стоп-слів для турецької мови.
# set() перетворює цей список на множину для більш ефективного пошуку.
filtrelenmis = [kelime for kelime in kelimeler if kelime.lower() not in stop_words]
print(f"Фільтровані слова: {filtrelenmis}")
Примітка: set(stopwords.words('turkish')) — у цій частині коду ми повинні вказати мову, з якою працюємо. Якщо ви хочете видалити стоп-слова для іншої мови, вам потрібно буде вказати відповідну мову.
- SpaCy
SpaCy — бібліотека, призначена для швидкої та ефективної обробки текстів у промислових застосунках. Вона виділяється своєю здатністю швидко аналізувати великі обсяги тексту.
- Глибокий граматичний аналіз
- Векторні уявлення слів
- Розпізнавання іменованих сутностей (NER)
Тепер давайте подивимося на приклад використання NER з SpaCy. Я додав коментарі для пояснення кожного рядка коду.
Сподіваюся, тепер стало зрозуміло.
import spacy
nlp = spacy.load("en_core_web_sm")
# Завантажуємо маленьку модель для англійської мови (en_core_web_sm) з spaCy.
# Ця модель попередньо навчена для обробки англійських текстів.
# Вона включає такі функції, як частини мови (POS tagging),
# розбір залежностей (dependency parsing) та
# розпізнавання іменованих сутностей (NER).
metin = "Google був заснований у 1998 році Ларрі Пейджем та Сергеєм Бріном."
doc = nlp(metin)
# Аналізуємо текст через модель spaCy.
for ent in doc.ents:
print(ent.text, ent.label_)
# Перебираємо всі знайдені іменовані сутності (entities) в тексті.
# doc.ents повертає список знайдених іменованих сутностей в тексті.
## Вихідні дані
Google ORG -> Організація
1998 DATE -> Дата
Larry Page PERSON -> Особа
Sergey Brin PERSON -> Особа
Іменовані сутності (Named Entities) використовуються для автоматичного розпізнавання важливих імен, місць, дат, організацій тощо в текстах. Цей процес дуже корисний для багатьох завдань NLP (наприклад, вилучення інформації, класифікація документів).
- Hugging Face Transformer
Hugging Face — це бібліотека, яка об'єднує найновіші та найпотужніші мовні моделі для обробки природної мови (NLP).Transformers дозволяє інтегрувати великі мовні моделі (BERT, GPT-2, GPT-3, T5 та інші) зручно та просто. Завдяки цій бібліотеці робота з мовними моделями стає значно легшою. Вона дозволяє виконувати багато завдань NLP, таких як класифікація текстів, резюмування, переклад, питання-відповіді, мовне моделювання. Я ще не випробував цю бібліотеку 😓, але в наступній статті ми зробимо проєкт з Hugging Face :))))
- Gensim
Ця бібліотека залишиться дещо теоретичною (я використовував її в своєму попередньому проєкті, не було проблем)🙃 у наступній статті ми зробимо проєкти з Hugging Face та Gensim.
Gensim — це бібліотека, яка широко використовується для завдань, таких як векторні представлення слів (word embeddings) та схожість документів (document similarity) в NLP. Gensim дуже потужний для витягування значення з текстових даних та визначення схожості між текстами. Зазвичай вона оптимізована для роботи з великими колекціями текстів.
Вона включає популярні алгоритми векторизації слів, такі як Word2Vec, FastText та Glove. Про ці алгоритми ми поговоримо в наступній статті, не переживайте :)))
Резюмування текстів (Text Summarization)
Перед тим як почати проєкт, давайте імпортуємо потрібні бібліотеки.
import spacy
from spacy.lang.en.stop_words import STOP_WORDS
from string import punctuation
from heapq import nlargest
- Спочатку ми визначимо функцію для нашого проєкту. Я назвав її summarizer, ви можете назвати як хочете :)) ця функція прийматиме текст як параметр.
def summarizer(rawdocs):
stopwords = list(STOP_WORDS)
# print(stopwords)
- Ми визначили функцію з назвою summarizer. Вона приймає текст (rawdocs) та повертає його резюме.
- Ми використовуємо список стоп-слів з бібліотеки spaCy та зберігаємо його у змінну stopwords. Цей список містить слова, які не будуть використовуватися при створенні резюме.
nlp = spacy.load("en_core_web_sm")
doc = nlp(rawdocs)
# print(doc)
- ‘encoreweb_sm’ — це маленька модель для англійської мови від spaCy. Вона використовується для лінгвістичного аналізу (токенізація, POS tagging тощо).
- doc = nlp(rawdocs) : Пропускаємо текст через модель spaCy для обробки. Це дозволяє розбивати текст на токени, речення тощо.
tokens = [token.text for token in doc]
# print(tokens)
- Ми перетворюємо всі слова (токени) з тексту в список. Кожне слово або розділовий знак є токеном.
word_freq = {}
- Створюємо словник для збереження кількості повторів кожного слова в тексті.
У цьому словнику кожне слово є "ключем", а кількість його повторів — "значенням".
for word in doc:
if word.text.lower() not in stopwords and word.text.lower() not in punctuation:
if word.text not in word_freq.keys():
word_freq[word.text] = 1
else:
word_freq[word.text] += 1
# print(word_freq)
Не забувайте додавати print xD
Ми перевіряємо кожне слово за допомогою циклу:
- Якщо слово не є в списку stopwords і не є розділовим знаком:
- Якщо слово ще не є в словнику, то встановлюємо його частоту на 1.
- Якщо слово вже є, збільшуємо його частоту на 1.
max_freq = max(word_freq.values())
- Знаходимо найвищу частоту серед значень словника word_freq. Це значення буде використовуватися для нормалізації частоти слів.
for word in word_freq.keys():
word_freq[word] = word_freq[word]/max_freq
- Нормалізуємо частоту слів. Тепер всі значення будуть у межах від 0 до 1, причому слова, які використовуються частіше, матимуть більші значення.
sent_tokens = [sent for sent in doc.sents]
- Розбиваємо текст на речення. Кожне речення буде збережене як об'єкт sent. Це досягається завдяки можливості сегментації речень у spaCy.
sent_scores = {}
- Створюємо словник для збереження оцінок важливості кожного речення. Оцінки розраховуються на основі частоти слів у реченні.
for sent in sent_tokens:
for word in sent:
if word.text in word_freq.keys():
if sent not in sent_scores.keys():
sent_scores[sent] = word_freq[word.text]
else:
sent_scores[sent] += word_freq[word.text]
- Для кожного речення:
- Обчислюємо частоту кожного слова у ньому.
- Загальна оцінка речення визначається як сума частот слів у цьому реченні.
select_len = int(len(sent_tokens) * 0.3)
- Визначаємо кількість речень, які будуть використовуватися для резюме. У цьому випадку вибирається 30% від усіх речень. (Можете вказати будь-яке значення)
summary = nlargest(select_len, sent_scores, key=sent_scores.get)
- За допомогою функції nlargest вибираємо речення з найвищим балом. Ці речення будуть використані для створення резюме.
final_summary = [word.text for word in summary]
summary = " ".join(final_summary)
- Обрані речення перетворюємо в текст і об'єднуємо їх, створюючи резюме. І ось ми дійшли до фінального коду :))
return summary, doc, len(rawdocs.split(" ")), len(summary.split(" "))
- Функція summarizer повинна повертати 3 значення:
- summary -> Резюме тексту
- doc -> Оригінальний текст з NLP-аналізом
- len(rawdocs.split(“ “)) -> Кількість слів в оригінальному тексті
- len(summary.split(“ “)) -> Кількість слів в резюме
Якщо ви, як і я, любите вивчати нове, то можете прив'язати цей код до flask-застосунку, створити 2-сторінковий веб-інтерфейс, отримувати вхідні дані від користувача, а після відправки вивести резюме тексту разом з оригіналом та кількістю слів на екрані ✋ Моя версія є на GitHub, як я і сказав xD
[
GitHub - ahmethakanyldrm/TextSummarization: NLP Project
NLP Project. Contribute to ahmethakanyldrm/TextSummarization development by creating an account on GitHub.
github.com
](https://github.com/ahmethakanyldrm/TextSummarization?source=post_page-----2af205540002--------------------------------)
Дякую, що дочитали до кінця 👉❤️👈 Сподіваюся, вам сподобається. Ми можемо створювати більше прикладів коду, але мені, як і вам, потрібно більше практики :))))
Перекладено з: Doğal Dil İşleme (NLP)