Природне оброблення мови (NLP)

Doğal Dil İşleme (NLP) останнім часом стало дуже популярним. Це галузь штучного інтелекту, що використовується для розуміння та обробки людської мови. У цій статті я хочу поділитися теоретичними знаннями про NLP та продемонструвати кілька маленьких застосунків, щоб ви краще розуміли, що і чому ми використовуємо, а також коли це слід застосовувати. :))

Отже, де використовують NLP? Якщо ми вирішили розвивати себе в напрямку NLP, то які типи проєктів можна зробити ✋

  1. Чат-боти, Віртуальні асистенти
    Siri, Alexa, ChatGpt
  2. Аналіз емоцій
    Соціальні мережі, Аналіз відгуків клієнтів, Огляди фільмів або товарів…
  3. Машинний переклад
    Google Translate, DeepL…
  4. Резюмування текстів
  5. Пошукові системи

Примітка: наприкінці статті ми створимо проєкт для резюмування текстів :)))

Чому ж NLP стало настільки популярним, можна запитати, оскільки в останні роки ця тема викликає багато розмов 🙃

Одна з причин цього — Big Data. Дані, які зростають днями, місяцями і навіть роками, забезпечують величезний потенціал для навчання та розвитку NLP-алгоритмів. Інша причина — розвиток великих мовних моделей (LLM), таких як ChatGPT, Gemini, які вже давно викликають обговорення серед людей (Програмісти залишаться без роботи тощо). Ці технології включає також Cursor AI, і це вже розділило людей на два табори 🤔 Як ви думаєте, хто може втратити роботу через штучний інтелект, або які професії першими можуть стати непотрібними через цей швидкий розвиток? Але повернемося до NLP, давайте трохи розглянемо Python і NLP

👉👈

По-перше, давайте подивимося на найбільш популярні бібліотеки для NLP в Python, а потім розглянемо, як їх використовувати. Наприкінці ми розробимо маленький проєкт і завершимо нашу статтю.

  1. 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')) — у цій частині коду ми повинні вказати мову, з якою працюємо. Якщо ви хочете видалити стоп-слова для іншої мови, вам потрібно буде вказати відповідну мову.

  1. 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 (наприклад, вилучення інформації, класифікація документів).

  1. Hugging Face Transformer

Hugging Face — це бібліотека, яка об'єднує найновіші та найпотужніші мовні моделі для обробки природної мови (NLP).Transformers дозволяє інтегрувати великі мовні моделі (BERT, GPT-2, GPT-3, T5 та інші) зручно та просто. Завдяки цій бібліотеці робота з мовними моделями стає значно легшою. Вона дозволяє виконувати багато завдань NLP, таких як класифікація текстів, резюмування, переклад, питання-відповіді, мовне моделювання. Я ще не випробував цю бібліотеку 😓, але в наступній статті ми зробимо проєкт з Hugging Face :))))

  1. 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--------------------------------)

Дякую, що дочитали до кінця 👉❤️👈 Сподіваюся, вам сподобається. Ми можемо створювати більше прикладів коду, але мені, як і вам, потрібно більше практики :))))

pic

pic

Перекладено з: Doğal Dil İşleme (NLP)

Leave a Reply

Your email address will not be published. Required fields are marked *