Демистификация NLP Руководство для новичков по основам и техникам обработки естественного языка

Демистификация NLP Руководство для новичков по обработке естественного языка

Фото от Jr Korpa на Unsplash

Обработка естественного языка (Natural Language Processing, NLP) – это увлекательная область в машинном обучении, которая делает машины способными понимать, толковать, понимать и создавать человеческий язык. Это, по сути, технология, которая позволяет компьютерам читать, понимать и реагировать на человеческий язык – будь то в текстовой или устной форме. Это похоже на обучение машин говорить нашим языком и даже создавать творческие, связные и контекстно соответствующие ответы. В этой статье мы рассмотрим основные термины, терминологию и основы технологии, которая лежит в основе ChatGPT и множества генеративных ИИ-систем, которые существуют сегодня.

Ключевые термины, используемые включают:

Документ

Фрагмент текста, который может варьироваться от одного предложения до целой книги.

Корпус

Сборник документов, используемых для анализа или обучения в NLP.

corpus = ["Это первый документ.", "Еще один документ здесь.", "И третий."]

Словарь

Набор всех уникальных слов в корпусе.

from collections import Counter
corpus = ["Это первый документ.", "Еще один документ здесь.", "И третий."]
words = ' '.join(corpus).lower().split()
vocabulary = set(words)
print("Словарь:", vocabulary)

Словарь: {'документ.', 'документ', 'первый', 'а', 'еще', 'и', 'третий', 'это', 'здесь.', 'этот', 'один.'}

Сегментация

Процесс разбиения текста на значимые сегменты, такие как предложения или абзацы.

Токенизация

Разбивка текста на более мелкие единицы, такие как слова или подслова (токены).

from nltk.tokenize import word_tokenize
text = "Токенизация - важный шаг в NLP."
tokens = word_tokenize(text)
print("Токены:", tokens)

Токены: ['Токенизация', '-', 'важный', 'шаг', 'в', 'NLP', '.']

Стоп-слова

Часто используемые слова (например, ‘и’, ‘в’, ‘это’), которые обычно удаляются при анализе NLP.

from nltk.corpus import stopwords
stop_words = set(stopwords.words('russian'))
print("Стоп-слова:", stop_words)

Стоп-слова: {'чтоб', 'таки', 'ещё', 'их', 'есть', 'для', 'этот', 'же', 'тот', 'вы', 'вас', 'чего', 'надо', 'сих', 'будет', 'тут', 'я', 'ним', 'ей', 'вот', 'были', 'мне', 'кто', 'там', 'чему', 'сам', 'этими', 'все', 'всю', 'если', 'мои', 'уж', 'вам', 'мой', '... 'бы', 'буду', 'того', 'быть', 'этом', 'который', 'весь', 'том', 'много', 'чтобы', 'сама', 'нее', 'кого', 'такая', 'этих', 'был', 'под', 'которое', 'мы', 'оставим', 'моё', 'само', 'уже', 'себе', 'вон', 'ею', 'наш', 'свои', 'им', 'ими', 'ли', 'нет', 'какие'}

Стемминг

Сокращение слов до их основной или корневой формы (стема).

from nltk.stem import PorterStemmerstemmer = PorterStemmer()word = "running"stemmed_word = stemmer.stem(word)print("Стеммированное слово:", stemmed_word)

Стеммированное слово: run

Лемматизация

Сокращение слов до их базовой формы (леммы) с учетом контекста.

from nltk.stem import WordNetLemmatizerlemmatizer = WordNetLemmatizer()word = "Raqib любит программирование и танцы."lemmatized_word = lemmatizer.lemmatize(word)print("Лемматизированное слово:", lemmatized_word)

POS Тегирование (Тегирование частей речи)

Присвоение каждому слову в предложении части речи (например, существительное, глагол, прилагательное).

from nltk import pos_tagfrom nltk.tokenize import word_tokenizesentence = "Кошка на коврике"tokens = word_tokenize(sentence)pos_tags = pos_tag(tokens)print("POS Теги:", pos_tags)

POS Теги: [('Кошка', 'NN'), ('на', 'IN'), ('коврике', 'NN')]
  • ('Кошка', 'NN'): ‘Кошка’ – существительное (NN).
  • ('на', 'IN'): ‘на’ – предлог или подчинительный союз (IN).
  • ('коврике', 'NN'): ‘коврике’ – существительное (NN).

Мешок слов (Bag of Words, BoW)

Представление текста, которое подсчитывает частоту слов в документе, игнорируя грамматику и порядок слов.

from sklearn.feature_extraction.text import CountVectorizercorpus = ["Это первый документ.", "Еще один документ здесь.", "И третий."]vectorizer = CountVectorizer()bow_representation = vectorizer.fit_transform(corpus)print("Представление Мешка слов:\n", bow_representation.toarray())print("Словарь:", vectorizer.get_feature_names())

TF-IDF (Term Frequency-Inverse Document Frequency)

Техника для оценки важности слов в документе относительно корпуса на основе частотности.

from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["Это первый документ.", "Еще один документ здесь.", "И третий."]vectorizer = TfidfVectorizer()tfidf_representation = vectorizer.fit_transform(corpus)print("Представление TF-IDF:\n", tfidf_representation.toarray())print("Словарь:", vectorizer.get_feature_names())

Представление TF-IDF: [[0.         0.         0.35543247 0.46735098 0.         0.46735098  0.         0.46735098 0.         0.46735098] [0.         0.62276601 0.4736296  0.         0.62276601 0.  0.         0.         0.         0.        ] [0.57735027 0.         0.         0.         0.         0.  0.57735027 0.         0.57735027 0.        ]]Словарь: ['and', 'another', 'document', 'first', 'here', 'is', 'one', 'the', 'third', 'this']

Шаги предварительной обработки текста

Теперь мы применим основные техники обработки естественного языка к предварительной обработке текстовой строки.

Преобразовать текст в нижний регистр.

sample_text = "NLP is an exciting field! It enables machines to comprehend, interpret, and generate human language. Learn more at https://raqibcodes.com. #NLP #MachineLearning @NLPCommunity 2023303"# Преобразование текста в нижний регистрdef convert_to_lowercase(text):    return text.lower()# Применение преобразования в нижний регистrlowercased_text = convert_to_lowercase(sample_text)print("Текст в нижнем регистре:", lowercased_text)

Текст в нижнем регистре: nlp is an exciting field! it enables machines to comprehend, interpret, and generate human language. learn more at https://raqibcodes.com. #nlp #machinelearning @nlpcommunity 2023303

Удалите специальные символы.

def remove_special_characters(text):    # Удалите ссылки, хештеги, упоминания и специальные символы    text = re.sub(r"http\S+|www\S+|@\w+|#\w+", "", text)    text = re.sub(r"[^\w\s.]", "", text)    return text# Примените удаление специальных символовtext_no_special_chars = remove_special_characters(lowercased_text)print("Текст без специальных символов:", text_no_special_chars)

Текст без специальных символов: nlp - увлекательное направление, которое позволяет машинам понимать, интерпретировать и генерировать человеческий язык. Узнайте больше по адресу     2023303

Удалите числа и цифры.

def remove_numbers(text):    # Удалите числа/цифры    text = re.sub(r'\d+(\.\d+)?', '', text)    return text# Примените удаление чисел/цифрtext_no_numbers = remove_numbers(text_no_special_chars)print("Текст без чисел/цифр:", text_no_numbers)

Текст без чисел/цифр: nlp - увлекательное направление, которое позволяет машинам понимать, интерпретировать и генерировать человеческий язык. Узнайте больше по адресу 

Токенизируйте текст.

from nltk.tokenize import word_tokenizedef tokenize_text(text):    # Токенизируйте текст    tokens = word_tokenize(text)    return tokens# Примените токенизациюtokens = tokenize_text(text_no_numbers)print("Токены:", tokens)

Токены: ['nlp', 'is', 'an', 'exciting', 'field', 'it', 'enables', 'machines', 'to', 'comprehend', 'interpret', 'and', 'generate', 'human', 'language', '.', 'learn', 'more', 'at']

Удалите стоп-слова.

from nltk.corpus import stopwordsdef remove_stopwords(tokens):    # Удалите стоп-слова    stop_words = set(stopwords.words('english'))    tokens = [token for token in tokens if token not in stop_words]    return tokens# Примените удаление стоп-словtokens_no_stopwords = remove_stopwords(tokens)print("Токены без стоп-слов:", tokens_no_stopwords)

Токены без стоп-слов: ['nlp', 'exciting', 'field', 'enables', 'machines', 'comprehend', 'interpret', 'generate', 'human', 'language', '.', 'learn']

Лемматизируйте слова.

from nltk.stem import WordNetLemmatizerdef lemmatize_words(tokens):    # Лемматизируйте слова    lemmatizer = WordNetLemmatizer()    tokens = [lemmatizer.lemmatize(token) for token in tokens]    return tokens# Примените лемматизациюlemmatized_tokens = lemmatize_words(tokens_no_stopwords)print("Лемматизированные токены:", lemmatized_tokens)

Лемматизированные токены: ['nlp', 'exciting', 'field', 'enables', 'machine', 'comprehend', 'interpret', 'generate', 'human', 'language', '.', 'learn']

Примените стемминг.

from nltk.stem import PorterStemmerdef apply_stemming(tokens):    # Примените стемминг    stemmer = PorterStemmer()    stemmed_tokens = [stemmer.stem(token) for token in tokens]    return stemmed_tokens# Примените стеммингstemmed_tokens = apply_stemming(lemmatized_tokens)print("Стеммированные токены:", stemmed_tokens)

Стеммированные токены: ['nlp', 'excit', 'field', 'enabl', 'machin', 'comprehend', 'interpret', 'gener', 'human', 'languag', '.', 'learn']

Соедините токены обратно в одну строку.

def join_tokens(tokens):    # Соедините токены обратно в одну строку    return ' '.join(tokens)# Примените объединение токенов в одну строкуpreprocessed_text = join_tokens(lemmatized_tokens)print("Предобработанный текст:", preprocessed_text)

Предобработанный текст: nlp exciting field enables machine comprehend interpret generate human language . learn

Примените маркировку POS.

from nltk import pos_tagdef pos_tagging(tokens):    # Выполните маркировку POS    pos_tags = pos_tag(tokens)    return pos_tags# Примените маркировку POSpos_tags = pos_tagging(lemmatized_tokens)print("Маркеры POS:", pos_tags)

Маркеры POS: [('nlp', 'RB'), ('exciting', 'JJ'), ('field', 'NN'), ('enables', 'NNS'), ('machine', 'NN'), ('comprehend', 'VBP'), ('interpret', 'JJ'), ('generate', 'NN'), ('human', 'JJ'), ('language', 'NN'), ('.', '.'), ('learn', 'VB')]

Значение тегов

  • ('nlp', 'RB'): ‘nlp’ помечен как наречие (RB).
  • ('exciting', 'JJ'): ‘exciting’ – это прилагательное (JJ).
  • ('field', 'NN'): ‘field’ – это существительное (NN).
  • ('enables', 'NNS'): ‘enables’ – это множественное число существительного (NNS).
  • ('machine', 'NN'): ‘machine’ – это существительное (NN).
  • ('comprehend', 'VBP'): ‘comprehend’ – глагол в базовой форме (VBP).
  • ('interpret', 'JJ'): ‘interpret’ – это прилагательное (JJ).
  • ('generate', 'NN'): ‘generate’ – это существительное (NN).
  • ('human', 'JJ'): ‘human’ – это прилагательное (JJ).
  • ('language', 'NN'): ‘language’ – это существительное (NN).
  • ('.', '.'): ‘.’ обозначает знак пунктуации (точка).
  • ('learn', 'VB'): ‘learn’ – глагол в базовой форме (VB).

Применить представление Мешка слов.

from sklearn.feature_extraction.text import CountVectorizerdef bag_of_words_representation(text):    # Инициализация CountVectorizer    vectorizer = CountVectorizer()    # Преобразование текста в представление Мешка слов    bow_representation = vectorizer.fit_transform([text])    return bow_representation, vectorizer# Применить представление Мешка словbow_representation, vectorizer = bag_of_words_representation(preprocessed_text)print("Представление Мешка слов:")print(bow_representation.toarray())print("Словарь:", vectorizer.get_feature_names())

Представление Мешка слов:[[1 1 1 1 1 1 1 1 1 1 1]]Словарь: ['comprehend', 'enables', 'exciting', 'field', 'generate', 'human', 'interpret', 'language', 'learn', 'machine', 'nlp']

Применить представление TF-IDF.

from sklearn.feature_extraction.text import TfidfVectorizerdef tfidf_representation(text):    # Инициализация TfidfVectorizer    vectorizer = TfidfVectorizer()    # Преобразование текста в представление TF-IDF    tfidf_representation = vectorizer.fit_transform([text])    return tfidf_representation, vectorizer# Применить представление TF-IDFtfidf_representation, tfidf_vectorizer = tfidf_representation(preprocessed_text)print("\nПредставление TF-IDF:")print(tfidf_representation.toarray())print("Словарь:", tfidf_vectorizer.get_feature_names())

Представление TF-IDF:[[0.30151134 0.30151134 0.30151134 0.30151134 0.30151134 0.30151134  0.30151134 0.30151134 0.30151134 0.30151134 0.30151134]]Словарь: ['comprehend', 'enables', 'exciting', 'field', 'generate', 'human', 'interpret', 'language', 'learn', 'machine', 'nlp']

Обработка естественного языка (NLP) – это связь между человеческим языком и машинами. В этой статье мы рассмотрели фундаментальные понятия, такие как “корпус”, “словарь” и ключевые техники, включая “токенизацию”, “лемматизацию” и “POS-тегирование”. Это основные составляющие для продвинутых приложений NLP, приближающих ИИ к более человекоподобным взаимодействиям.

Спасибо за чтение🤓. Вы можете ознакомиться с моим репозиторием на GitHub, где вы можете ознакомиться с проектом NLP, в котором я применил все вышеперечисленные техники и более продвинутые. Ура!